java - 通过 HashSet 与链接哈希集进行迭代

标签 java algorithm graph breadth-first-search dijkstra

我正在考虑如何在内存中表示图形?

我正在考虑使用 HashMap 的 HashMap ,以便它的行为类似 到邻接矩阵,但我们可以使用可比较的边缘标签而不仅仅是整数。

在广度优先搜索和 Dijkstra 算法中,我们必须迭代邻接表并将节点添加到队列中。这引出了我的问题:

在 Java 中通过链接哈希集进行迭代是否比通过常规 HashSet 进行迭代更有效?

这似乎是因为每个节点之间按照添加顺序存在链接,因此我们不必遍历空容器(如果存在)(取决于 HashMap 的重新哈希率,这可以或多或少)。这将使我们能够将邻接矩阵的随机访问行为与邻接列表的搜索算法效率结合起来。

最佳答案

是的,你说得对。

Java HashMap/Set 在稀疏图中性能较差,因为它必须从空 bin 进行迭代。当大多数节点只连接一个其他节点时。 HashMap/Set 可能需要 8 次迭代才能得到准确的结果。相关分析可见 Codeforces: Performance of hash set iterators in different programming languages .

为了表示图形,Java 泛型机制可以让您为原始类型创建对象类型,例如 Integer。当转换为原始类型并构建图形时,它们会降低性能。在最佳实践中,您需要使用Trove或其他图书馆。也许,你自己实现。

关于java - 通过 HashSet 与链接哈希集进行迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61002951/

相关文章:

C++生成适合TSP的随机图

haskell - 如何在haskell中遍历图?

python - 使用 Groupby Pandas DataFrame 手动计算 STD

python - 寻找最小化约束的最佳解决方案?

algorithm - 具有多于 N-1 条边的连通图是否总是包含具有 N-1 条边的连通图?

java - 应用与您的设备不兼容。所有设备

java - 使用 ORM,我可以将包含 a、b、c 列的数据库表映射到包含键 a、b、c 的 Map 的类吗?

java - SSLException: Received fatal alert: internal_error (在 tomcat 下抛出,但在桌面上工作正常)

java - 如何获取和设置通知中的变量?(Android)

c++ - 扇出 "arc"的卡片网格