给定一个集合,里面的数是从0到4G的,给出有效的算法来得到一个不在这个集合中的整数。
如果只有640MB的内存,又该怎么求?
对于第一个情况,可以利用external的buffer来解决。设置一个长为4G的数组,每个元素代表从0到4G的一个整数。遍历给定集合,如果遍历到的数在0和4G之间,就在数组的相应位置计数。
遍历完一遍后,遍历数组,返回第一个值为0的元素。
如果只有640MB的内存,上述方法不好使,因为4G=2^32,而640MB=10*2^29。
可以设置n个counter,每个counter代表一段数,比如,每个counter代表10000个数。然后遍历集合,对于每个数,如果在相应的数的范围里,就把这个相应的counter加一。这样,遍历过一次就知道哪个范围里缺数了。
然后再遍历一次,这次和第一种方法类似,只不过将数的范围定为相应的范围,而不在这个范围里的,都可以忽略。
如果只有640MB的内存,又该怎么求?
对于第一个情况,可以利用external的buffer来解决。设置一个长为4G的数组,每个元素代表从0到4G的一个整数。遍历给定集合,如果遍历到的数在0和4G之间,就在数组的相应位置计数。
遍历完一遍后,遍历数组,返回第一个值为0的元素。
如果只有640MB的内存,上述方法不好使,因为4G=2^32,而640MB=10*2^29。
可以设置n个counter,每个counter代表一段数,比如,每个counter代表10000个数。然后遍历集合,对于每个数,如果在相应的数的范围里,就把这个相应的counter加一。这样,遍历过一次就知道哪个范围里缺数了。
然后再遍历一次,这次和第一种方法类似,只不过将数的范围定为相应的范围,而不在这个范围里的,都可以忽略。