【问题标题】:Social Graph Assignment社交图分配
【发布时间】:2012-01-11 01:26:40
【问题描述】:

我有一项社交图谱作业,我很清楚自己想做什么,我只是想知道我是否走在正确的轨道上,以及你们可以提供的任何提示。

无论如何,实现相当简单(我在这里找到了一个非常复杂的实现 - How to model social graph in Java,但我认为它远远超出了我的实际需要)。本质上,我的想法是制作一个“用户”对象和一个哈希图来保存所有内容。用户对象中将有 4 个数据结构 - 名称(字符串)、学生(布尔值)、学校(字符串)和朋友(整数数组)。

每个用户都将被添加到 hashmap 中,并因此被赋予一个唯一的键。当要建立友谊时,比如在 A 和 B 之间,我会在 hashmap 中找到用户 A,并将用户 B 的密钥添加到 A 的好友数组中,反之亦然。这样我就可以跟踪每个人以及他们的朋友。

这有意义吗?它在我的脑海中起作用,但我觉得我在实现中遗漏了一些东西,这会使它无法像我认为的那样工作。

【问题讨论】:

  • 看起来你走在了正确的轨道上。无论语言如何,数据结构和后续方法或多或少都是相同的方法。如果您正在寻找其他想法,请移开对 Java 的关注,看看您能找到什么。
  • 谢谢,我已经删除了对 Java 的引用以尝试获得更一般的回复

标签: graph social-networking


【解决方案1】:

这个问题的答案将取决于要求以及您想要对社交图谱做什么(尤其是您是否想要持久化数据)。

如果您使用 hashmap 作为用户存储,那么我假设您有一个单独的类来生成您的 ids(或者您有一个包装 hashmap 并生成它们的 UserStore 类)?如果您不删除用户,那么您存储一个 ArrayList 就足够了,索引是用户键。

当涉及到用户自己时,您可以将他们的朋友放在一个列表中,但这可能会使您的删除用户代码稍微复杂化(假设您具有该功能)。

更新:

如果您想进行分析,那么您可能会从将用户的朋友存储为 Set 而不是数组(但取决于您计划如何进行分析)中获得一些好处。您仍然需要一个计数器类(或分配 id 的主 UserStore 类)。

【讨论】:

  • 我不需要删除任何用户,剩下的任务涉及分析诸如派系(与其他人不是朋友的朋友组)之类的事情,但我'在我开始研究分析数据的算法之前,我首先尝试找出存储数据的最佳方法。我决定使用 gashmap 是因为可以高效地将键和值拉入和拉出,这样我就可以搜索用户并快速取回他们的密钥,然后搜索以查看是否有人与使用该密钥的用户成为朋友(希望这是有道理的)。
【解决方案2】:

嗯,它可以工作。

唯一可以肯定的是,将User 添加到HashMap 不会“给”它一个密钥。密钥应该由您以某种方式创建。您可以选择用户的名字、姓氏或生成增量 ID。您可以将User 添加到HashMap,方法是给它那个键和User 作为值。每次要从 HashMap 检索 User 时,都必须使用该密钥。

在您的情况下,如果名字和姓氏是唯一的,请使用 firstName + " " + lastName 作为键。

还有许多其他建议在很大程度上取决于模型的预期用途。所以,我看不出有什么理由参与所有这些。

【讨论】:

  • 非常感谢!我预期的用途基本上是分析图,比如谁和谁是朋友,还有一种 6 度的 Kevin Bacon,我必须找到两个人之间的最短距离。我认为所有这些都是算法问题,但我希望在开始分析信息之前有一个稳定的基础来存储信息。
【解决方案3】:

我会向 User 对象添加某种形式的“主键”,一个可能是 sintetic 的数字(从全局整数计数器中获取下一个数字)。这样就可以避免从其他User的数据中生成hashCode()值的情况,进而可以避免Map内部的冲突。

【讨论】:

  • 我猜你可能暗示 OP 将从数据中生成密钥,但是他们确实指定了唯一的,因此给出了唯一的密钥
  • 所以,如果我理解正确的话,当我实例化一个新的用户对象时,他们应该立即从一个计数器中获得一个键,所以第一个创建的用户得到 1,第二个用户得到 2,等等. 然后,在将这些用户添加到 hashmap 容器中时,我应该使用 User 对象作为值,并且我已经将这个 key 作为 hashmap 的 key。这是正确的吗?
  • 没错。既然你说某人的朋友被表示为一个整数值数组(这将是用户进入哈希表的键),所以除非你有一个万无一失的方法来提出一个不会产生冲突的哈希函数,那么一个简单的全局计数器就是解决问题的简单方法。
猜你喜欢
  • 2020-03-08
  • 2021-09-26
  • 1970-01-01
  • 2013-05-25
  • 2012-01-22
  • 1970-01-01
  • 2012-07-29
  • 1970-01-01
  • 2012-12-06
相关资源
最近更新 更多