Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何获得O(1)中数字对应的集合_Algorithm_Data Structures_Set_Primes - Fatal编程技术网

Algorithm 如何获得O(1)中数字对应的集合

Algorithm 如何获得O(1)中数字对应的集合,algorithm,data-structures,set,primes,Algorithm,Data Structures,Set,Primes,假设有N个数字分组到K个不相交的集合中。问题是为这些不相交的集合中的每一个创建一个键,这样给定任何数字,对这些键和数字的简单操作应该能够给出包含该数字的集合 一种简单的方法及其局限性: 例如,设N个数字为34,35,36…321,设集合1由63,66,77,89122222组成,集合2由53,6913723028029930306组成,依此类推 索尔: 首先创建一个包含321-34=287项的素数数组。要为第一个集合创建键,将数组中63-34,66-34,…222-34位置对应的素数相乘。现在这

假设有N个数字分组到K个不相交的集合中。问题是为这些不相交的集合中的每一个创建一个键,这样给定任何数字,对这些键和数字的简单操作应该能够给出包含该数字的集合

一种简单的方法及其局限性: 例如,设N个数字为34,35,36…321,设集合1由63,66,77,89122222组成,集合2由53,6913723028029930306组成,依此类推

索尔: 首先创建一个包含321-34=287项的素数数组。要为第一个集合创建键,将数组中63-34,66-34,…222-34位置对应的素数相乘。现在这个键只能被与集合1中的数字对应的素数整除,否则不能被整除。因此,给定77,[ifkey1%primeArray[77-34]==0],77属于集合1


但是因为我处理的是大量的数据值,所以这些键甚至不能用64位整数表示,我不想分割这些键。有更好的方法吗?

似乎是使用联合查找数据结构的经典案例。


给每个数字一个等级。在这种情况下,数字本身并不重要。集合中的最高秩表示集合。

格式化是您的朋友,顺便说一句……位图不容易做到这一点?N和K都大吗?如果两者都很小,则可以使用单个哈希表将数字映射到集合。如果K很小,则为每个K组设置一个bloom过滤器可能是一个开始。这些数字及其在集合中的排列是完全任意的,还是还有更多的结构可以利用?@Barmar是的,我目前使用的是一个简单的位图,但我希望尽可能节省空间,因为N的范围是0-20/30k。我以前从未尝试过布卢姆过滤器方法。我现在就试试。如前所述,N通常在0-20000/30000之间变化,并且是连续的。K通常在20-50左右,这对于64位数字来说似乎是不可能的。如果N个数字中的每一个都可以放在K个集合中的一个集合中,那么就有K^N个可能的分布,一些集合可能是空的,因此问题所需的数量会少一些,但这个论点涉及的是数量级。设X为每个键的大小。然后,对于覆盖所有情况的键,X^K=K^N。这意味着X=K^N/K。对于N=30000和K=50,X需要是3386位的近似值,以包含必要的信息量。如果我忽略了什么,我很感兴趣。。