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 的长度。