这可能不是编程问题,但它是最近在工作中出现的问题。一些背景:大C开发,对性能特别感兴趣。
我有一组整数,想要测试另一个给定整数的成员资格。我希望实现一种算法,该算法可以使用最小的代数函数集来检查它,只使用整数来表示第一组中包含的整数整数空间。
我已经尝试过复合Cantor配对功能,但是使用30个元素设置它似乎太复杂了,并且专注于性能它没有任何意义。我玩了一些操作,比如XORing和否定,但它给了我低成员资格的估计。然后我尝试了连续的添加,最后迷路了。
有什么想法吗?
答案 0 :(得分:2)
对于大小为30的unsigned long
集,以下是一种相当明显的方法:
30 * sizeof(unsigned long)
个字节。bsearch
并且它足够快,你可以使用它。)接下来的问题是为什么你想要一个大数学解决方案,它会告诉我这个解决方案有什么问题,而不是“它不够令人满意”。
我怀疑任何大数学解决方案都会慢于此。对N位数字的单个算术运算至少需要N的线性时间。表示集合的单个数字不能远小于首尾相连的集合的元素,其间有一个分隔符。因此,即使集合中的线性搜索与大数字上的单个算术运算一样快。除了Goedel表示之外,一旦你找到了n
质数,它就可以在一个分区中完成,任何聪明的数学表示都将采用多个算术运算来建立成员资格。
另请注意,您可能会关注“查找集合中的整数”的性能有两个不同的原因:
我想很偶然,你可能会查找许多不同的整数,每个整数都在不同的集合中,所以这两个原因都不适用。如果这是其中之一,你可以忽略这些东西。
答案 1 :(得分:0)
一个好的开始是尝试Bloom Filters。 基本上,它是一种概率数据结构,不会给你带来假阴性,但有些误报。因此,当一个整数与布隆过滤器匹配时,你必须检查它是否真的与该集合匹配,但是通过减少要检查的集合的数量,这是一个很大的加速。
答案 2 :(得分:0)
如果我理解你的正确,python示例:
>>> a=[1,2,3,4,5,6,7,8,9,0]
>>>
>>>
>>> len_a = len(a)
>>> b = [1]
>>> if len(set(a) - set(b)) < len_a:
... print 'this integer exists in set'
...
this integer exists in set
>>>