我有N< 2 ^ n随机生成的n位数存储在文件中,查找费用昂贵。给定数字Y,我必须在文件中搜索最多k hamming dist的数字。来自Y.现在这需要C(n 1)+ C(n 2)+ C(n 3)... + C(n,k)最坏情况查找,这在我的情况下是不可行的。我尝试在内存中的每个位位置存储1和0的分布,并优先考虑我的查找。所以,我存储了比特i的概率为0/1:
Pr(bi=0), Pr(bi=1) for all i from 0 to n-1.
但它没有多大帮助,因为N太大,并且在每个位位置具有几乎相等的1/0分布。有没有办法可以更有效地完成这件事。现在,您可以假设n = 32,N = 2 ^ 24。
答案 0 :(得分:2)
Google在this paper中为k = 3,n = 64,N = 2 ^ 34(更大的语料库,更少的位翻转,更大的指纹)提供了此问题的解决方案。基本思想是,对于小k,n / k非常大,因此如果形成一些具有置换位顺序的表,则期望附近的指纹应具有相对较长的公共前缀。但是,我不确定它会对你有用,因为你的n / k相当小。
答案 1 :(得分:1)
如果通过“查找”,您的意思是在整个文件中搜索指定的数字,然后对每个可能的匹配重复“查找”,那么只需读取整个文件一次,检查每个条目的速度应该更快你去的指定号码的汉明距离。这样你只需读取一次文件而不是C(n 1)+ C(n 2)+ C(n 3)... + C(n,k)次。
答案 2 :(得分:1)
您可以使用量子计算来加快搜索过程,同时最大限度地减少所需的步骤数。我认为Grover的搜索算法将对你有所帮助,因为它提供了二次加速搜索问题......
答案 3 :(得分:0)
也许您可以将其存储为图形,通过汉明距离链接到集合中下一个最接近的数字,然后您需要做的就是按照其中一个链接到另一个数字来查找下一个最接近的数字。然后使用索引来跟踪文件偏移量的数字位置,这样当您需要找到附近的邻居时,就不必在图表中搜索Y.
你还说你有2 ^ 24个数字,根据wolfram alpha(http://www.wolframalpha.com/input/?i=2^24+*+32+bits)只有64MB。你能把它全部放在ram中以使访问速度更快吗?也许这会在你的机器上自动进行?
答案 4 :(得分:0)
如果您的应用程序可以负担得起进行一些广泛的预处理,那么您可以在生成n位数时计算距离该数字最远的所有其他数字,并将其存储在查找表中。它就像地图>。 riri声称你可以将它放在内存中,所以哈希表可能运行良好,但除此之外,你可能需要一个B +树来映射。当然,正如您之前提到的那样,这很昂贵,但如果您事先可以这样做,那么您将在以后快速查找,O(1)或O(log(N)+ log(2 ^ k))。