免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234
最近访问板块 发新帖
楼主: qishking
打印 上一主题 下一主题

有100万个数字(1到9),其中只有1个数字重复2次,如何快速找出该数字 [复制链接]

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
31 [报告]
发表于 2011-08-09 09:29 |只看该作者
用awk 的话,不知道效率如何。
  1. awk '++a[$1]==2{print $1;exit}' infile
复制代码

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
32 [报告]
发表于 2011-08-09 19:38 |只看该作者
LS:您的方法都要求空间复杂度O(N),我想知道能不能在空间复杂度O(1)的前提下搞定
starwing83 发表于 2011-08-05 18:05



    O(1)空间前提下,应该不存在O(n)级时间.

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
33 [报告]
发表于 2011-08-10 10:42 |只看该作者
回复 32# cjaizss


    很有趣的问题:偶选奇可以用异或法达到O(1)的空间复杂度和O(n)的时间复杂度,然而嘛……奇选偶却无法用O(1)的空间复杂度达到O(n)的时间复杂度??这个是什么原因呢?

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
34 [报告]
发表于 2011-08-14 09:30 |只看该作者
cjaizss 说得没错,此问题不可能存在O(1)空间,O(n)时间复杂度的算法
原因在于,无法用O(1)的空间包含“O(n)个数各不相同”这一信息
除非数据有特殊的规律

论坛徽章:
2
技术图书徽章
日期:2013-09-04 15:21:51酉鸡
日期:2013-11-01 21:20:20
35 [报告]
发表于 2011-08-14 12:11 |只看该作者
不用说100万个数字了,就是100万个字符串,也是小case,用bloom filter轻松搞定。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
36 [报告]
发表于 2011-08-14 22:33 |只看该作者
回复 35# mirnshi

网上查到------
    Bloom Filter的这种高效是有一定代价的:在判断一个元素是否属于某个集合时,有可能会把不属于这个集合的元素误认为属于这个集合(false positive)。因此,Bloom Filter不适合那些“零错误”的应用场合。
  这题判断时要求100%正确,不适用吧。

论坛徽章:
2
技术图书徽章
日期:2013-09-04 15:21:51酉鸡
日期:2013-11-01 21:20:20
37 [报告]
发表于 2011-08-15 14:04 |只看该作者
回复  mirnshi

网上查到------
    Bloom Filter的这种高效是有一定代价的:在判断一个元素是否属于某 ...
hq8318 发表于 2011-08-14 22:33


1. 多重哈希可以降低冲突
2. 如果必须是100%,可以在冲突后,再进行循环检索。这个空间和时间要求都能很好的掌控了。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
38 [报告]
发表于 2011-08-15 14:14 |只看该作者
“如果必须是100%,可以在冲突后,再进行循环检索”,这样就不是“小case,用bloom filter轻松搞定”吧。

论坛徽章:
2
技术图书徽章
日期:2013-09-04 15:21:51酉鸡
日期:2013-11-01 21:20:20
39 [报告]
发表于 2011-08-15 15:36 |只看该作者
“如果必须是100%,可以在冲突后,再进行循环检索”,这样就不是“小case,用bloom filter轻松搞定”吧。
hq8318 发表于 2011-08-15 14:14


Bloom filter可以极大降低空间时间复杂度。N多人研究过并且可以在网上找到成堆的论文,具体可以参考这些论文。

BTW,Bloom filter不适合题目要求(1到9,重复100万次,其中只有1个数字重复2次)。Bloom filter是针对楼上100万个不同数字提出的。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
40 [报告]
发表于 2011-08-16 01:20 |只看该作者
本帖最后由 hq8318 于 2011-08-16 01:28 编辑

  CSDN更多人讨论,原来这题是指“题目 意思:我这里每个数字都是一个阿拉伯数字 是1位的 是 1到9之间的 但是有1百万个这样的数字 比如 12345678912 是11个这样的数字”。
  我思路大概是:当数字出现3次直接忽略,8个数字出现3次时结束。
  用图m 保存数字出现的次数,出现3次的保存到一集合hs,并从m 中移出。集合hs有的数字,不用比较了,直接跳到下一个,当集合hs有8个数字时,输出结果。最后是当hs达不到8个数字时,找到只出现两次的数字,输出,由于集合无indexOf,只有用一循环。

  1. import java.util.*;
  2. public class million
  3. {
  4.   public static void main(String args[])
  5.     {
  6.           int[] n={1,2,3,3,4,5,6,7,8,9,3,1,5,6,5,6,3,7,8,9,7,8,9,2,2,4,4};
  7.           // int[] n={1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,1,2,3,1,5,6,7,8,9};
  8.           // int[] n={1,2,3,4,5,6,7,8,9,1,2,2,2};
  9.           Map<Integer,Integer> m=new HashMap<Integer,Integer>();
  10.           Set<Integer> hs=new HashSet<Integer>();
  11.           Integer v;
  12.           for(int n1:n){                    
  13.                     if(hs.contains(n1)) continue;
  14.                     v=m.get(n1);
  15.                     if(v==null)
  16.                                 m.put(n1,1);
  17.                     else if(v==1)
  18.                                 m.put(n1,v+1);
  19.                     else if(v==2){
  20.                                 hs.add(n1);                                
  21.                                 m.remove(n1);
  22.                                 if(hs.size()==8){
  23.                                           for(int i=1;i<10;i++){
  24.                                                     if(!hs.contains(i)) System.out.println(i);
  25.                                           }
  26.                                           break;
  27.                                 }
  28.                     }
  29.           }
  30.           if(hs.size()<8){
  31.                     for(Integer k:m.keySet()){
  32.                                 if(m.get(k)==2)
  33.                                           System.out.println(k);
  34.                     }
  35.           }
  36.           System.out.println(m);
  37.           System.out.print(hs);
  38.     }
  39. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP