我有一个具有一般尺寸的汉明立方体,但在实践中,通常,尺寸范围从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(整数)。
哪个适合存储此多维数据集的数据结构并高效搜索呢?我对其他操作并不感兴趣。
我想过以某种方式对所有位序列进行排序,以便我可以轻松访问它们,但是没有任何工作可用。
到目前为止我的方法:
data-structure使用哈希表(特别是std::unordered_map
),其中键是顶点,值是ID。
algorithm给定顶点v
,生成汉明距离t
内的所有比特序列(即1,2,...)。
但是,这需要我在每个时间调用一个函数顶点v
到达(经常发生)。我有一个功能来实现这一点,基于this。
答案 0 :(得分:1)
我对C ++生疏,所以我会保持这种抽象。
汉明立方体给定点的邻居很容易计算。给定顶点的比特序列,分别翻转每个比特。
但是你可以预先计算出来。您可以缓存neighbors()
函数的结果,也可以将它们保存到数组中。每个顶点都有自己的邻居,因此每个顶点都有一个数组。这基本上就是你的邻接列表。
使用该邻接列表,您可以使用深度限制搜索搜索您的汉明立方体,这是DFS(或BFS,我猜 - 但空间复杂度更差)的变体,只有k
单位深度。
您的数据结构是一个不错的选择,但请考虑您的顶点是二进制字符串,因此它们涵盖从0
到2^n - 1
的所有点。你可能只是使用数组查找仍然是O(1),并且它会更紧凑,因为没有未使用的存储桶。