汉明立方体的数据结构

时间:2017-05-19 07:48:54

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

我有一个具有一般尺寸的汉明立方体,但在实践中,通常,尺寸范围从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处。

例如,给定这个立方体:

enter image description here

v = 100,我需要汉明距离1的顶点,即000,101,110(任何顺序)。然后,我可能需要得到距离为2的那些,即111,001,010。如果在距离3处也需要顶点,我也会得到011。

多维数据集的顶点可能包含ID(整数)。

哪个适合存储此多维数据集的数据结构并高效搜索呢?我对其他操作并不感兴趣。

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

到目前为止我的方法:

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

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

但是,这需要我在每个时间调用一个函数顶点v到达(经常发生)。我有一个功能来实现这一点,基于this

1 个答案:

答案 0 :(得分:1)

我对C ++生疏,所以我会保持这种抽象。

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

但是你可以预先计算出来。您可以缓存neighbors()函数的结果,也可以将它们保存到数组中。每个顶点都有自己的邻居,因此每个顶点都有一个数组。这基本上就是你的邻接列表。

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

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