表示只有一个整数的整数集的算法

时间:2012-08-28 09:32:39

标签: algorithm integer set

这可能不是编程问题,但它是最近在工作中出现的问题。一些背景:大C开发,对性能特别感兴趣。

我有一组整数,想要测试另一个给定整数的成员资格。我希望实现一种算法,该算法可以使用最小的代数函数集来检查它,只使用整数来表示第一组中包含的整数整数空间。

我已经尝试过复合Cantor配对功能,但是使用30个元素设置它似乎太复杂了,并且专注于性能它没有任何意义。我玩了一些操作,比如XORing和否定,但它给了我低成员资格的估计。然后我尝试了连续的添加,最后迷路了。

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

对于大小为30的unsigned long集,以下是一种相当明显的方法:

  • 将每个集存储为已排序的数组,每组30 * sizeof(unsigned long)个字节。
  • 查找一个整数,执行二进制搜索的几个步骤,然后进行线性搜索(配置文件以便找出最好的二进制搜索步数 - 我的猜测是2步,但你可能会发现不同的,当然如果你测试bsearch并且它足够快,你可以使用它。)

接下来的问题是为什么你想要一个大数学解决方案,它会告诉我这个解决方案有什么问题,而不是“它不够令人满意”。

我怀疑任何大数学解决方案都会慢于此。对N位数字的单个算术运算至少需要N的线性时间。表示集合的单个数字不能远小于首尾相连的集合的元素,其间有一个分隔符。因此,即使集合中的线性搜索与大数字上的单个算术运算一样快。除了Goedel表示之外,一旦你找到了n质数,它就可以在一个分区中完成,任何聪明的数学表示都将采用多个算术运算来建立成员资格。

另请注意,您可能会关注“查找集合中的整数”的性能有两个不同的原因:

  • 您在一个集合中查找了许多不同的整数,在这种情况下,可能能够通过为该数据构建自定义查找函数来加快速度。当然,在C中,这意味着您需要(a)一个简单的虚拟机来执行该“函数”,或者(b)运行时代码生成,或者(c)在编译时知道该集合。这些都不一定容易。
  • 您正在查找许多不同集合中的相同整数(以获取它所属的所有集合的序列),在这种情况下,您可能会受益于您关注的所有集合的组合表示,而不是考虑每个单独设置。

我想很偶然,你可能会查找许多不同的整数,每个整数都在不同的集合中,所以这两个原因都不适用。如果这是其中之一,你可以忽略这些东西。

答案 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
>>>

数学基础:http://en.wikipedia.org/wiki/Euler_diagram