首页 新闻 搜索 专区 学院

用最高效的方法找出数组相同的数字

0
悬赏园豆:5 [待解决问题]

一个数组的长度有1千多万。里面有两个数字是相同的。
用最高效的方法找出这两个数。

嘿丶蛋炒饭丨的主页 嘿丶蛋炒饭丨 | 初学一级 | 园豆:197
提问于:2013-06-13 18:07
< >
分享
所有回答(3)
0

哈希算法?

估计哈希表会快些

SeeMore | 园豆:313 (菜鸟二级) | 2013-06-13 19:36

能些一段代码给我看看吗?比如:int[] arr={1,12,23,34,45,65,76,87,98,1};

支持(0) 反对(0) 嘿丶蛋炒饭丨 | 园豆:197 (初学一级) | 2013-06-13 20:11

@嘿丶蛋炒饭丨: 貌似是《编程珠玑》这本书上第一章的一个问题

支持(0) 反对(0) 在大地画满窗子 | 园豆:102 (初学一级) | 2013-06-14 09:51
0

看你开多大的内存了。如果内存足够,分配个长度为4G的数组,循环一次搞定

五星 | 园豆:125 (初学一级) | 2013-06-14 00:45
0
  1. //采用位图的方法,如果是在一个1000万大的数组中,其中只有两个数是相同的,可以在O(n)时间复杂度内找出相同的数  
  2. //数组b是一块连续内存区域,用数组中的每一bit表示一个数是否存在,1表示存在,0不存在,比如,给定一个数字1025,  
  3. //那么,就把b数组的第1025bit置为1,基本思想就是用数组内存的一个bit所在的下标值作为数据数值,而不用真正去储存这个值,用下标作为值,节省空间。  
  4. //因为操作系统内存最小操作单位是字节,所以不能直接操作bit,因此,首先,必须找到第1025bit所在的字节,就是1025/8(因为下标是从0开始,整除截断的无关紧要,下步用到),  
  5. //然后再找出1025在该字节的哪一bit,就是1025%8=1,整个意思就是,1025在b数组的第1025/8个字节的第1 bit中,然后用&操作访问该bit是否为1,为1则表明1025存在了
在大地画满窗子 | 园豆:102 (初学一级) | 2013-06-14 09:49

//网上找来的
#include <stdio.h>
int a[3]={1,10000000,10000000};
//char类型为8位,共需要10000000/8个char
static unsigned char b[10000000/8+1];
int i;
void main() {
for (i=0;i<3;i++) {
//1<<(a[i]%8)表示1左移余数的位数即为a[i]在b中对应的位,例如1024%8=0,然后1<<0=1(二进制止:00000001),所以1024在b数组的第1024/8个字节的第1 bit中;
//1025%8=1,然后1<<1=2(二进制:00000010),所以1025在b数组的第1025/8个字节的第2 bit中;1026%8=2,然后1<<2=4(二进制:00000100),所以1026在b数组的第1026/8个字节的第3 bit中;以次类推
if (b[a[i]/8]&(1<<(a[i]%8))) break;
else b[a[i]/8]|=(1<<(a[i]%8));
}
if (i<3) printf("%d\n",a[i]);
else printf("Can not find.\n");
printf("%d\n",1<<(1024%8));
printf("%d",5);
}

支持(0) 反对(0) 在大地画满窗子 | 园豆:102 (初学一级) | 2013-06-14 10:00
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册