【问题标题】:Data structure for Hamming cube汉明立方体的数据结构
【发布时间】:2017-05-19 07:48:54
【问题描述】:

我有一个普通维度的汉明立方体,但实际上,通常,维度范围是 3 到 6。

搜索算法为:

Input: any vertex, `v`.
Find all vertices that lie in Hamming distance 1 from `v`.
Find all vertices that lie in Hamming distance 2 from `v`.
...

我事先不知道我需要离开v 多远。例如,我可能会停在距离 1 处。

例如,给定这个立方体:

v = 100,我需要汉明距离为 1 的顶点,即 000、101、110(任意顺序)。然后,我可能需要得到距离 2 的顶点,即 111、001、010。万一也需要距离 3 的顶点,我也会得到 011。

立方体的一个顶点可能包含 ID(整数)。

哪种数据结构适合存储这个多维数据集并有效地搜索它?我对其他操作不是很感兴趣。

我想过以某种方式对所有位序列进行排序,以便我可以轻松访问它们,但没有任何工作。


到目前为止我的方法:

使用哈希表(特别是std::unordered_map),其中键是顶点,值是ID。

给定一个顶点v,生成汉明距离t(即1、2、...)内的所有位序列。

但是,这需要我每次调用一个函数,一个顶点varrives(这经常发生)。我有一个功能可以实现这一点,基于this

【问题讨论】:

  • 您是否考虑过将立方体表示为图形?特别是邻接表。然后你可以使用深度限制搜索来找到你选择的节点。
  • @aryamccarthy 没有。图因其数据局部性而臭名昭著,不是吗?但是,如果您有完整的想法,请发布答案,我一定会通过它!

标签: data-structure algorithm c++ algorithm math data-structures hamming-distance


【解决方案1】:

我对 C++ 生疏了,所以我会保留这个摘要。

汉明立方体给定点的邻居很容易计算。给定一个顶点的位序列,分别翻转每个位。

不过,您可以预先计算。您可以缓存 neighbors() 函数的结果,也可以将它们保存到数组中。每个顶点都有自己的邻居,因此每个顶点都有一个数组。从本质上讲,这为您提供了邻接列表。

使用该邻接列表,您可以使用深度受限搜索来搜索您的汉明立方体,这是 DFS 的一种变体(我猜是 BFS,但空间复杂度更差),深度只有 k 个单位。


您的数据结构是一个不错的选择,但考虑到您的顶点是二进制字符串,因此它们涵盖了从02^n - 1 的所有点。您不妨只使用一个数组 - 查找仍然是 O(1),并且它会更紧凑,因为周围没有未使用的存储桶。

【讨论】:

  • 嗯,好主意 +1。但这不会很大吗?我的意思是每个顶点都以不同的距离与 all 其他顶点作为邻居。 (感谢您的支持)
  • 您需要在时间和空间之间进行权衡——花时间重新计算或花空间缓存。在六个维度中,每个顶点有六个(直接)邻居,每个都可以表示为一个字节。 64 个节点,所以邻接表占用
  • 在邻接列表中,您只存储直接个邻居。其余的通过深度限制搜索找到。否则,是的,你会有指数级的爆炸式增长。
  • 立即是指位于距离 1 的那些?是的,我害怕的是指数炸弹!
  • 好的,也许您可​​以通过使用示例或其他内容更新答案来改进您的答案?因为未来的读者可能不清楚。请注意,我将等待更多想法出现(如果有),然后接受您的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-23
  • 1970-01-01
  • 1970-01-01
  • 2016-02-19
  • 1970-01-01
  • 2017-01-11
相关资源
最近更新 更多