力扣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.pswp.cn/news/714961.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/714961.shtml
英文地址,請注明出處:http://en.pswp.cn/news/714961.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【C++】cout 的默認精度

cout 的默認精度為: 四舍五入保留六位有效數字輸出。例如 123.4567 應該輸出為 123.457,5432.10 應該輸出為 5432.1。 一、使用C語言輸出符合cout默認精度的數值 double weight; scanf("%lf",&weight);printf("%.6g",weight)…

FlinkSql hint之狀態生命周期 state_ttl

狀態生命周期hint FlinkSQL 的 state ttl(Time-To-Live,生存時間)是一個用于管理狀態數據生命周期的機制。在 Flink 流處理中,狀態是一個重要的概念,它允許跨時間窗口或事件時間處理的狀態化操作。然而,隨…

分治法(Divide and Conquer)

目錄 1.定義 2.例子 3.注意 1.定義 分治法(Divide and Conquer)是一種解決問題的算法設計策略,它將一個大問題分解成若干個規模較小且結構與原問題相似的子問題,然后遞歸地解決這些子問題,最后將子問題的解合并起來…

Dockerfile 語法教程

Dockerfile 語法教程 文章目錄 Dockerfile 語法教程Dockerfile 語法教程基礎概念Dockerfile 簡介鏡像、容器、倉庫的概念 Dockerfile 基本語法 Dockerfile 基本語法Dockerfile 的基本結構注釋的使用指令的格式指令的執行順序 Dockerfile 常用指令FROM 指令RUN 指令CMD 指令ENTR…

鴻蒙崗位需求突增!移動端、PC端、IoT到底該怎么選?

“2024年是原生鴻蒙的關鍵一年,我們要加快推進各類鴻蒙原生應用的開發,集中打贏技術底座和三方生態兩大最艱巨的戰斗。”這是余承東在新年信中表達的決心。 隨后在1月18日舉行的鴻蒙生態千帆啟航儀式上,華為宣布 HarmonyOS NEXT 鴻蒙星河版系…

當開發人員無法解決問題時,測試人員應該如何與他們溝通?

當開發人員無法解決問題時,測試人員可以采取以下方式進行溝通: 保持耐心和理解:意識到解決問題可能需要時間和努力,避免對開發人員施加過度壓力。提供更多信息和細節:檢查是否有其他相關信息或細節可以提供給開發人員…

Codeforces Round 929 (Div. 3)---->E. Turtle vs. Rabbit Race: Optimal Trainings

一,思路: 1,做這題如果對二分敏感的話,看完題目就大概很容易想到,通過二分來找到一個 r ,使得 [ l, r] 之間的和最接近 u (因為這樣才是 Isaac 所能獲得的最大提升)。 2,還有一個特殊情況,結合…

MobiLlama: Towards Accurate and Lightweight Fully Transparent GPT

論文的主要目的是設計一個準確且高效的小型語言模型(SLM),以滿足資源受限設備的需求。以下是根據論文內容整理的要點: 背景與挑戰: 大型語言模型(LLMs)在處理復雜任務時表現出色,但它…

Linux下進程相關概念詳解

目錄 一、操作系統 概念 設計操作系統的目的 定位 如何理解“管理” 系統調用和庫函數概念 二、進程 概念 描述進程—PCB(process control block) 查看進程 進程狀態 進程優先級 三、其它的進程概念 一、操作系統 概念 任何計算機系統都包…

【Easyx】easyx從入門到精通 — 初步入門

easyx 初步入門 1 安裝easyx圖形庫2 如何使用Easyx3 效果初試4 基本圖形繪制4.1 繪制點4.2 繪制直線4.3 繪制圓形4.4 繪制矩形4.5 繪制橢圓4.6 繪制圓角矩形4.7 繪制扇形 Thanks?(・ω・)ノ謝謝閱讀!!!下一篇…

Java學習—字符流

在 Java 中,字符流主要用于處理字符數據,比如文本文件。字符流直接以字符為單位進行讀寫操作,自動處理字符與底層字節之間的轉換,因此非常適合處理包含文本數據的文件。Java 中處理字符流的核心抽象類是 Reader 和 Writer。 Read…

C#面:是否可以從一個 static 方法內部發出對非 static 方法的調用

不可以; 不能直接從一個靜態方法內部調用非靜態方法。 這是因為靜態方法是屬于類的,而非靜態方法是屬于類的實例的。 靜態方法可以在沒有創建類的實例的情況下被調用,而非靜態方法需要通過類的實例來調用。 如果想要從靜態方法內部調用非…

算法入門-二分搜索(長期更新)

文章目錄 情景一 : 二分查找情景二 : 找出一個 > num 的最左側的位置情景三 : 找出一個 < num 的最右側的位置leetcode 162 :尋找峰值leetcode 69 : x 的平方根 首先來簡介一下二分搜索算法,二分搜索是一種每次砍半的算法,最經典的案例當然是我們的二分查找算法,但是大部…

【JAVA重要知識 | 第一篇】一篇文章讀懂HashMap(存儲、擴容、初始化過程)

文章目錄 1.一篇文章讀懂HashMap&#xff08;存儲、擴容、初始化過程&#xff09;1.1HashMap簡介1.1.1特點1.1.2優點1.1.3缺點 1.2深入解讀HashMap1.2.1常用常量和變量&#xff08;1&#xff09;常用常量&#xff08;2&#xff09;常用變量 1.2.2存儲過程&#xff08;1&#xf…

診所門診電子處方軟件操作教程及試用版下載,醫務室處方箋管理系統模板教程

診所門診電子處方軟件操作教程及試用版下載&#xff0c;醫務室處方箋管理系統模板教程 一、前言 以下軟件程序教程以 佳易王診所電子處方軟件V17.0為例說明 軟件文件下載可以點擊最下方官網卡片——軟件下載——試用版軟件下載 如上圖&#xff0c;點擊基本信息設置——處方配…

Acwing---1208. 翻硬幣

翻硬幣 1.題目2.基本思想3.代碼實現 1.題目 小明正在玩一個“翻硬幣”的游戲。 桌上放著排成一排的若干硬幣。我們用 * 表示正面&#xff0c;用 o 表示反&#xff08;是小寫字母&#xff0c;不是零&#xff09;。 比如&#xff0c;可能情形是&#xff1a;**oo***oooo 如果同…

Python編程小案例—利用flask查詢本機IP歸屬并輸出網頁圖片

Python編程小案例—利用flask查詢本機IP歸屬并輸出網頁圖片 環境&#xff1a;Pycharm Mac OS 源碼如下&#xff1a; from flask import Flask, render_template, requestapp Flask(__name__)app.route(/) def index():return render_template(IP查詢.html)if __name__ __…

文心一言 Python編程之

給一個包含n個整數的數組nums&#xff0c;判斷nums中是否存在三個元素a,b,c&#xff0c;使得abc0?請你找出所有和為0且不重復的三元組。 注意&#xff1a;答案中不可以包含重復的三元組。 示例1&#xff1a; 輸入&#xff1a;nums[-1,0,1,2,-1,-4] 輸出&#xff1a;[[-1,-1,2…

中介者模式

定義&#xff1a;中介者模式&#xff08;Mediator Pattern&#xff09;又稱為調節者模式或調停者模式。用一個中介對象封裝一系列的對象交互&#xff0c;中介者使各對象不需要顯式的相互作用&#xff0c;從而使其耦合松散&#xff0c;而且可以獨立地改變它們之間的交互。 適用…