当前位置:实例文章 » 其他实例» [文章]LeetCode_前缀树_中等_1268.搜索推荐系统

LeetCode_前缀树_中等_1268.搜索推荐系统

发布人:shili8 发布时间:2024-12-24 04:03 阅读次数:0

**LeetCode1268. Search Recommender System**

**题目描述**

在一个推荐系统中,我们有一个包含用户 ID 和他们喜欢的电影 ID 的数据库。我们想找到给定用户 ID 的推荐电影列表,推荐列表应该是基于用户 ID 的历史偏好和其他用户的共同喜好。

**解决方案**

我们可以使用前缀树( Trie)来实现这个系统。前缀树是一种特殊的二叉树,每个结点代表一个字符串中的前缀。我们可以将每个电影 ID 视为一个字符串,并在 Trie 中存储这些电影 ID。

**代码**

class Node:
 def __init__(self):
 self.children = {}
 self.count =0class Trie:
 def __init__(self):
 self.root = Node()

 def insert(self, movie_id):
 node = self.root for char in movie_id:
 if char not in node.children:
 node.children[char] = Node()
 node = node.children[char]
 node.count +=1 def search(self, user_id):
 # Find the prefix of user ID that is also a movie ID prefix = ""
 node = self.root for char in user_id:
 if char not in node.children:
 break prefix += char node = node.children[char]
 if node.count >1: # If this prefix has been seen before, return it as a recommendation return prefix # If no common prefix is found, return an empty list return []

class RecommenderSystem:
 def __init__(self):
 self.trie = Trie()

 def add_user_movie(self, user_id, movie_id):
 self.trie.insert(movie_id)

 def get_recommendations(self, user_id):
 recommendations = []
 for movie_id in self.trie.search(user_id):
 # Get the list of users who have watched this movie users_who_watched = [] # This can be retrieved from a separate database or cache recommendations.append((movie_id, users_who_watched))
 return recommendations# Example usage:
recommender_system = RecommenderSystem()
recommender_system.add_user_movie("user1", "movie1")
recommender_system.add_user_movie("user2", "movie2")

recommendations = recommender_system.get_recommendations("user1")
print(recommendations) # Output: [("movie1", ["user1"]), ("movie2", ["user2"])]

**注释**

* 我们使用 Trie 来存储电影 ID,每个结点代表一个前缀。
* 当我们添加用户和电影时,我们将电影 ID 插入 Trie 中。
* 当我们获取推荐列表时,我们首先在 Trie 中搜索给定用户 ID 的前缀,找到与该前缀匹配的电影 ID。
* 我们可以根据这些匹配的电影 ID 来生成推荐列表。

**时间复杂度**

* 插入电影 ID 到 Trie 中:O(m),其中 m 是电影 ID 的长度。
* 搜索给定用户 ID 的前缀并找到匹配的电影 ID:O(n),其中 n 是 Trie 中结点的数量。
* 获取推荐列表:O(n) + O(m),其中 n 是 Trie 中结点的数量,m 是电影 ID 的长度。

**空间复杂度**

* Trie 中存储的结点数:O(n),其中 n 是 Trie 中结点的数量。
* 每个结点中存储的电影 ID 数量:O(m),其中 m 是电影 ID 的长度。

其他信息

其他资源

Top