力扣1892 页面推荐Ⅱ

        力扣1892,页面推荐Ⅱ,为一个社交媒体网站实施一个页面推荐系统。如果页面被user_id的 至少一个朋友喜欢 ,而 不被user_id喜欢 ,你的系统将 推荐 一个页面到user_id

目录

题目描述

解题思路

完整代码

优化


题目描述

表: Friendship

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| user1_id      | int     |
| user2_id      | int     |
+---------------+---------+
(user1_id,user2_id) 是 Friendship 表的主键(具有唯一值的列的组合)。
该表的每一行表示用户user1_id和user2_id是好友。

表: Likes

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| user_id     | int     |
| page_id     | int     |
+-------------+---------+
(user_id,page_id) 是 Likes 表的主键(具有唯一值的列)。
该表的每一行表示user_id喜欢page_id。

您正在为一个社交媒体网站实施一个页面推荐系统。如果页面被user_id的 至少一个朋友喜欢 ,而 不被user_id喜欢 ,你的系统将 推荐 一个页面到user_id

编写一个解决方案来查找针对每个用户的所有可能的 页面建议 。每个建议应该在结果表中显示为一行,包含以下列:

  • user_id: 系统向其提出建议的用户的ID。
  • page_id: 推荐为 user_id 的页面ID。.
  • friends_likes:  user_id 对应 page_id 的好友数。

以 任意顺序 返回结果表。

返回结果格式示例如下。

示例 1:

输入:
Friendship 表:
+----------+----------+
| user1_id | user2_id |
+----------+----------+
| 1        | 2        |
| 1        | 3        |
| 1        | 4        |
| 2        | 3        |
| 2        | 4        |
| 2        | 5        |
| 6        | 1        |
+----------+----------+
Likes 表:
+---------+---------+
| user_id | page_id |
+---------+---------+
| 1       | 88      |
| 2       | 23      |
| 3       | 24      |
| 4       | 56      |
| 5       | 11      |
| 6       | 33      |
| 2       | 77      |
| 3       | 77      |
| 6       | 88      |
+---------+---------+
输出:
+---------+---------+---------------+
| user_id | page_id | friends_likes |
+---------+---------+---------------+
| 1       | 77      | 2             |
| 1       | 23      | 1             |
| 1       | 24      | 1             |
| 1       | 56      | 1             |
| 1       | 33      | 1             |
| 2       | 24      | 1             |
| 2       | 56      | 1             |
| 2       | 11      | 1             |
| 2       | 88      | 1             |
| 3       | 88      | 1             |
| 3       | 23      | 1             |
| 4       | 88      | 1             |
| 4       | 77      | 1             |
| 4       | 23      | 1             |
| 5       | 77      | 1             |
| 5       | 23      | 1             |
+---------+---------+---------------+
解释:
以用户1为例:
—用户1是用户2、3、4、6的好友。
-推荐页面有23(用户2喜欢),24(用户3喜欢),56(用户3喜欢),33(用户6喜欢),77(用户2和用户3喜欢)。
-请注意,第88页不推荐,因为用户1已经喜欢它。另一个例子是用户6:
—用户6是用户1的好友。
-用户1只喜欢了88页,但用户6已经喜欢了。因此,用户6没有推荐。您可以使用类似的过程为用户2、3、4和5推荐页面。

解题思路

        这个问题可以通过结合两个表(FriendshipLikes)来解决,目标是找到对每个用户推荐的页面。具体步骤如下:

  1. 确定朋友关系:首先,我们需要从Friendship表中识别每个用户的所有朋友。由于朋友关系是双向的(如果A是B的朋友,那么B也是A的朋友),我们需要考虑user1_iduser2_id两个方向。
  2. 识别朋友喜欢的页面:接下来,我们需要查找每个用户的朋友喜欢哪些页面。
  3. 排除用户已经喜欢的页面:我们需要确保推荐的页面不包括用户已经喜欢的页面。
  4. 计算每个推荐页面的朋友喜欢数:对于每个推荐的页面,我们需要计算有多少个朋友喜欢它。
  5. 输出结果:最后,我们需要按照题目要求输出结果,包括user_idpage_idfriends_likes

完整代码

SELECT F.user_id,L.page_id,COUNT(*) AS friends_likes
FROM (SELECT user1_id AS user_id, user2_id AS friend_id FROM FriendshipUNION ALLSELECT user2_id, user1_id FROM Friendship
) AS F
JOIN Likes AS L ON F.friend_id = L.user_id
LEFT JOIN Likes AS UL ON F.user_id = UL.user_id AND L.page_id = UL.page_id
WHERE UL.user_id IS NULL
GROUP BY F.user_id, L.page_id
ORDER BY F.user_id, L.page_id;
  • 朋友关系:通过UNION ALLFriendship表中的user1_iduser2_id合并,确保朋友关系的双向性被考虑。
  • 朋友喜欢的页面:通过将上述结果与Likes表连接,找到每个用户的朋友喜欢哪些页面。
  • 排除已喜欢的页面:使用LEFT JOIN将用户喜欢的页面与朋友喜欢的页面进行比较,通过WHERE UL.user_id IS NULL条件排除用户已经喜欢的页面。
  • 计算朋友喜欢数:通过COUNT(*)计算每个推荐页面的朋友喜欢数。
  • 输出结果:最后,根据user_idpage_id分组,按照题目要求输出结果。

通过

优化

        强调效率问题,其实在运行能力有限的情况下,讨论优化SQL是十分必要的。尽量多用left/right join + where xx is null的形式来代替not in的表示形式。

with t1 as (select user1_id user_id,user2_id friend_idfrom Friendshipunion allselect user2_id user_id,user1_id friend_idfrom Friendship)
,t3 as (select t1.user_id,t1.friend_id  ,t2.page_idfrom t1 left join Likes t2 on t1.friend_id = t2.user_id)
select t3.user_id,t3.page_id,count(1) friends_likes 
from Likes t4 
right join t3 
on t4.user_id = t3.user_id 
and t4.page_id = t3.page_id
where t4.page_id is null
group by 1,2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/268148.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python笔记_程序流程控制

A,顺序控制 程序从上到下逐行执行 python定义变量时,会合法地向前引用 age 1 age2 age 1 age2 age 1 age 1 ——>错误,age应在age2之前 B,分支控制 1,单分支if 语法 if 条件表达式 : 代码块 说明…

雾锁王国服务器配置怎么选择?阿里云和腾讯云

雾锁王国/Enshrouded服务器CPU内存配置如何选择?阿里云服务器网aliyunfuwuqi.com建议选择8核32G配置,支持4人玩家畅玩,自带10M公网带宽,1个月90元,3个月271元,幻兽帕鲁服务器申请页面 https://t.aliyun.com…

Unity UGUI之Scrollbar基本了解

Unity的Scrollbar组件是用于在UI中创建滚动条的组件之一。滚动条通常与其他可滚动的UI元素(如滚动视图或列表)一起使用,以便用户可以在内容超出可见区域时滚动内容。 以下是Scrollbar的基本信息和用法: 1、创建 在Unity的Hierarchy视图中右…

Springboot+vue的考勤管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频: Springbootvue的考勤管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。 项目介绍: 采用M(model)V(view)C(controller)三层…

181基于matlab的利用LMS算法、格型LMS算法、RLS算法、LSL算法来估计线性预测模型参数a1和a2

基于matlab的利用LMS算法、格型LMS算法、RLS算法、LSL算法来估计线性预测模型参数a1和a2;预测信号由二阶线性预测模型产生。2.利用LMS算法和RLS算法将一个叠加有噪声的信号实现噪声消除,恢复原始信号。有22页试验分析文档。(包括程序在内&…

【C++】vector的使用和模拟实现(超级详解!!!!)

文章目录 前言1.vector的介绍及使用1.1 vector的介绍1.2 vector的使用1.2.1 vector的定义1.2.2 vector iterator 的使用1.2.3 vector 空间增长问题1.2.3 vector 增删查改1.2.4 vector 迭代器失效问题。(重点!!!!!!)1.2.5 vector 在OJ中有关的练习题 2.ve…

项目设计:基于Qt和百度AI的车牌识别系统(嵌入式ARM)

基于Qt和百度AI智能云实现的智能车牌识别系统,具体可实现为停车场管理系统、智能计费停车系统…等。 1.系统实现思路及框架 1.1实现思路 要实现一个车牌识别系统,有多种方法,例如用opencv图像算法实现,或用第三方算法接口&#x…

StarRocks——Stream Load 事务接口实现原理

目录 前言 一、StarRocks 数据导入 二、StarRocks 事务写入原理 三、InLong 实时写入StarRocks原理 3.1 InLong概述 3.2 基本原理 3.3 详细流程 3.3.1 任务写入数据 3.3.2 任务保存检查点 3.3.3 任务如何确认保存点成功 3.3.4 任务如何初始化 3.4 Exactly Once 保证…

Presto简介、部署、原理和使用介绍

Presto简介、部署、原理和使用介绍 1. Presto简介 1-1. Presto概念 ​ Presto是由Facebook开发的一款开源的分布式SQL查询引擎,最初于2012年发布,并在2013年成为Apache项目的一部分;Presto 作为现在在企业中流行使用的即席查询框架&#x…

Matlab偏微分方程拟合 | 源码分享 | 视频教程

专栏导读 作者简介:工学博士,高级工程师,专注于工业软件算法研究本文已收录于专栏:《复杂函数拟合案例分享》本专栏旨在提供 1.以案例的形式讲解各类复杂函数拟合的程序实现方法,并提供所有案例完整源码;2.…

三天学会阿里分布式事务框架Seata-seata事务日志mysql持久化配置

锋哥原创的分布式事务框架Seata视频教程: 实战阿里分布式事务框架Seata视频教程(无废话,通俗易懂版)_哔哩哔哩_bilibili实战阿里分布式事务框架Seata视频教程(无废话,通俗易懂版)共计10条视频&…

重学SpringBoot3-自动配置机制

重学SpringBoot3-自动配置机制 引言Spring Boot 自动配置原理示例:Spring Boot Web 自动配置深入理解总结相关阅读 引言 Spring Boot 的自动配置是其最强大的特性之一,它允许开发者通过最少的配置实现应用程序的快速开发和部署。这一切都得益于 Spring …

【C++】set、multiset与map、multimap的使用

目录 一、关联式容器二、键值对三、树形结构的关联式容器3.1 set3.1.1 模板参数列表3.1.2 构造3.1.3 迭代器3.1.4 容量3.1.5 修改操作 3.2 multiset3.3 map3.3.1 模板参数列表3.3.2 构造3.3.3 迭代器3.3.4 容量3.3.5 修改操作3.3.6 operator[] 3.4 multimap 一、关联式容器 谈…

Latex中如何调整算法伪代码\begin{algorithm}的字体大小?

在LaTeX中,要调整algorithm环境(通常与algorithmic、algorithmicx、algorithm2e等包一起使用来编写伪代码)中的字体大小,你可以使用\small、\footnotesize、\tiny等命令来减小字体大小,或者使用\large、\Large、\LARGE…

【MySQL】索引(重点)-- 详解

一、索引 没有索引,可能会有什么问题? 索引 :提高数据库的性能,索引是物美价廉的东西了。不用加内存,不用改程序,不用调 sql ,只要执行正确的 create index ,查询速度就可能提高成…

Unity曲柄滑块四杆机构运动计算

一、运动效果 二、机构的介绍 曲柄长度:a,线段AB长度 连杆长度:b,线段BC长度 偏心距离:e,滑块轨迹与曲柄中心点A的垂直距离 三、已知点A点B和e的值,计算C点的位置 1、计算s的值 var h math.…

ES6 | (二)ES6 新特性(下) | 尚硅谷Web前端ES6教程

文章目录 📚迭代器🐇定义🐇工作原理🐇自定义遍历数据 📚生成器函数🐇声明和调用🐇生成器函数的参数传递🐇生成器函数案例 📚Promise📚Set🐇Set的定…

SpringBoot3-核心原理

1. 事件和监听器 1. 生命周期监听 场景:监听应用的生命周期 1. 监听器-SpringApplicationRunListener 自定义SpringApplicationRunListener来监听事件; 编写SpringApplicationRunListener 实现类在 META-INF/spring.factories 中配置 org.springfram…

解决鸿蒙模拟器卡顿的问题

缘起 最近在学习鸿蒙的时候,发现模拟器非常卡,不要说体验到鸿蒙的丝滑,甚至到严重影响使用的程度。 根据我开发Android的经验和在论坛翻了一圈,最终总结出了以下几个方案。 创建模拟器 1、在DevEco Virtual Device Configurat…

Revit-二开之立面视图创建FilledRegion-(3)

在上一篇博客中介绍了FilledRegion的创建方法,这种方法通常只在平面视图中适用,在三维视图中也是无法创建的(目前研究的是这样的,如果有其他方法,请赐教)。 本片文章介绍一个下在立面视图中创建FilledRegion的方法,主要操作是在立面视图中拾取一个点,然后以该点为原点,…