我有网络应用,每个用户都可以有朋友。用户可以查看我网站上的不同页面,例如:
pizza.html
hamburger.html
etc..
如果我是userA,而且我正在查看'pizza.html'页面,我想知道我的哪些朋友也“喜欢”这个页面。假设我想在加载pizza.html时显示这个,我可以按需要这样做真的很痛苦:
User me;
Like current = "pizza.html";
List<User> friendsWhoAlsoLikePageImLookingAt;
for (User friend : me.getFriends()) {
for (Like like : friend.getLikes()) {
if (like == current) {
friendsWhoAlsoLikePageImLookingAt.add(friend);
}
}
}
// now friendsWhoAlsoLikePageImLookingAt contains all of my
// friends that like the page I'm viewing.
这会起作用,但随着朋友和他们喜欢的人数的增长,这种情况会非常糟糕。我有什么算法可以解决这个问题吗?
另一种方法是预先计算每个用户的所有喜欢(我认为这不会很好地扩展)。例如,每个用户按照以下兴趣获得自己的txt文件:
userA_pizza.txt
userB_pizza.txt
userA_hamburger.txt
userB_hamburger.txt
...
假设我是userB的朋友,而userB将'pizza.html'添加为新的 - 然后我会将userA_pizza.txt文件更新为:
// userA_pizza.txt
userB // latest friend to also like this interest.
userX // previous friend likes
userY // previous friend likes
现在每当我(userA)查看披萨页面时,我都可以打开'userA_pizza.txt'并只转储所有好友名称而不进行任何计算。现在,每当用户喜欢某个页面时,我必须更新N个txt文件,其中N是他们的朋友的数量。此外,每个用户都需要一个可能感兴趣的文本文件(并且可能有数千个兴趣)。如果一个用户有100k的朋友,他们每个人都有1000个兴趣,这也可能是非常昂贵的!
是的,所以任何想法或想法都会很棒 -
由于
答案 0 :(得分:2)
难道你不能只为每个“赞”页面保留一个人们喜欢它的列表吗?然后,您不必为当前用户浏览每个朋友的所有“喜欢”,而只需浏览喜欢该用户当前所在页面的用户,并仅列出与当前用户成为朋友的用户。 / p>
效率仍然低效且缩放不太棒,但这样,当用户喜欢某个页面时,您只需要更新实际的“喜欢”页面,而不是更多的页面。你只限于文本文件吗?数据库可以使这很容易。
答案 1 :(得分:1)
我会使用数据库来存储数据而不是文本文件。
您可以拥有一个包含用户自己的用户表,将用户朋友链接到朋友的表用户,一个喜欢的表(每个可爱的东西一行),表用户喜欢将用户链接到他们喜欢的内容。
然后我会更容易维护和数据库查询,以生成用户朋友喜欢的记录集。
答案 2 :(得分:0)
假设您的后端是一个数据库,您应该有3个为此功能引用的表
User table (Id, Name, etc)
Page table (Id, Url, etc)
LikedPages (UserId, PageId)
您可以针对UserId查询LikedPages表,以查看一个用户的所有喜欢的列表。您还可以查询PageId以查看谁喜欢该页面。这两个查询的交集是您正在寻找的结果。