【问题标题】:Efficient look-up without the use of hashes?不使用哈希的高效查找?
【发布时间】:2014-08-06 18:14:13
【问题描述】:

所以我正在写实现 ACO 算法的this Python program。简而言之,当蚂蚁进行下一步行动时,它知道(1)它在哪个节点上,以及(2)它还需要访问哪些节点。使用该信息,它会检查每个Edge 的属性,以选择接下来应该访问的Node。所以我让蚂蚁使用该信息来查找相应的Edge

在内部,我使用dictNode 对映射到Edge 实例。最初,我同意 Node 必须是可散列的限制。但是,这一直是我不太喜欢施加的限制,如果可能的话,我想消除它。

目前,我有一个Node 类,它通过散列对象的__dict__.items()frozenset 来实现__hash__,但这仍然会在涉及可变值的情况下产生错误(到目前为止,这是我最少的最喜欢的课程 - 永远)。

到目前为止,我一直在考虑使用 2D 矩阵,但通常情况下,Edges 与 Nodes 相比很少,这将导致矩阵稀疏,因此浪费了很多空间。我曾考虑过使用一个简单的列表,但后来我失去了进行超快速查找的能力。

TL;DR:

我可以使用哪些数据结构(如果实现是可靠的则首选)或自我实现,它们可以在不涉及生成哈希的情况下从一对 Nodes 中快速查找 Edges?

【问题讨论】:

  • 您需要从 pair 节点中查找边,还是只需要从给定节点开始遍历所有边?你要求前者,但你上面的用例描述似乎只做for neighbor in current.neighbors: ...
  • 不,这是我试图避免的情况。我不想遍历所有的边缘,这就是我选择通过字典查找的原因。
  • 所以有一个节点数组,并给蚂蚁节点索引。然后你的密钥变成两个整数。或单个 64 位整数,高 32 位有一个索引,低 32 位有一个索引。它仍然是基于哈希的,但实现起来非常简单。
  • @JimMischel 辉煌。正是我所追求的。我什至有点惭愧我没有看到那个简单的解决方案,但我知道这是太专注和太少的睡眠,哈哈!

标签: python optimization dictionary data-structures hash


【解决方案1】:

与其直接散列节点,不如创建一个节点数组并给出蚂蚁节点索引。您的密钥变成了两个整数,或者可能是一个 64 位整数,其中一个索引位于高 32 位,一个索引位于低 32 位。它仍然是基于哈希的,但实现起来非常简单。

【讨论】:

  • 已实施!它显着提高了整体性能,非常感谢!
猜你喜欢
  • 2014-10-06
  • 1970-01-01
  • 2010-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-10
  • 1970-01-01
  • 2010-11-01
相关资源
最近更新 更多