在无序数中查找是否存在重复元素
2012-11-29 10:34
351 查看
给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?
http://blog.csdn.net/v_JULY_v/article/details/6279498
看到这个题的第一反应就是使用位图,使用内存空间为2^32bit = 512MB,遍历序列,把对应的bit位置一,查找的时间复杂度为O(1)
用位图来操作效率很高,这里提出了一种新的方法,在编程珠玑里边把每一个整数用32位的二进制来表示,然后把40亿的数据分为两类最低位为0和最低位为1,并把它们分别存入两个文件中,其中一个文件中整数个数大于20亿,另外一个文件中整数个数小于20亿,判断要查找的整数的最低位是0还是1,并在相应的文件中进行查找。
第二次再根据次低位把文件分成两部分,次低位分别为0和1的,然后再缩小查找范围,这样每次查找总能把范围缩小将近一半,这样经过31次划分之后,如果目标文件大小为0则表示目标数字不存在,如果为1则表示存在,如果大于1表示存在重复元素,时间复杂度为O(nlogn)
http://blog.csdn.net/v_JULY_v/article/details/6279498
看到这个题的第一反应就是使用位图,使用内存空间为2^32bit = 512MB,遍历序列,把对应的bit位置一,查找的时间复杂度为O(1)
用位图来操作效率很高,这里提出了一种新的方法,在编程珠玑里边把每一个整数用32位的二进制来表示,然后把40亿的数据分为两类最低位为0和最低位为1,并把它们分别存入两个文件中,其中一个文件中整数个数大于20亿,另外一个文件中整数个数小于20亿,判断要查找的整数的最低位是0还是1,并在相应的文件中进行查找。
第二次再根据次低位把文件分成两部分,次低位分别为0和1的,然后再缩小查找范围,这样每次查找总能把范围缩小将近一半,这样经过31次划分之后,如果目标文件大小为0则表示目标数字不存在,如果为1则表示存在,如果大于1表示存在重复元素,时间复杂度为O(nlogn)
相关文章推荐
- 关于查找数组中是否存在重复元素的方法总结(Find A Duplicate)
- 假设数组a有n个元素,元素取值范围是1~n,如何判定数组是否存在重复元素
- 判断二叉树是否平衡、求二叉树的镜像、按行列有序矩阵中快速查找元素是否存在
- 一个长度为N的整形数组,数组中每个元素的取值范围是[0,N-1],写一个算法判断数组中是否存在重复的数字
- vector、map 判断某元素是否存在、查找指定元素
- 判定数组中是否存在重复元素
- javascript 校验字符串(数字)数组是否存在重复元素
- 判断数组中是否存在重复元素
- 判断数组是否存在重复元素
- 判断一个int数组中的元素是否存在重复
- c++面试题:判断数组是否存在重复元素
- 生成一个一维数组,有10个元素,都用随机数填充,用指针轮询的办法实现函数查找一个数是否存在。
- 给定一个经过一次旋转的有序数组,从中查找一个值,若存在返回它的索引,不存在返回-1,假定数组存在重复元素
- 百度面试:查找是否存在某元素
- 开辟一个二维数组,有10*8个元素,用随机数填充,按照下面的方法用函数实现查找一个数是否存在
- Appnium各种查找元素的封装及保存截图及判定元素是否存在
- 生成一个一维数组,有10个元素,都用随机数填充,用指针轮询的办法实现函数查找一个数是否存在。
- 位图法--解决海量数据问题(查找是否存在,不重复数据)
- 程序员面试题目总结--数组(四)【数列中符合条件数对的个数、数组是否存在重复元素、重新排列数组使数组左边为奇数,右边为偶数、数组中的第二大数、数组中的最小值和最大值】
- 生成一个一维数组,有10个元素,都用随机数填充,用指针轮询的办法实现函数查找一个数是否存在。