wind3110991
V2EX  ›  C

问一个腾讯的算法题:有一个 vector 容器中,存有 1 亿个 qq 号(不重复),如何快速挑选出其中奇数号码?

  •  1
     
  •   wind3110991 · Apr 7, 2015 · 6736 views
    This topic created in 4229 days ago, the information mentioned may be changed or developed.

    如题,今年春季的笔试题,不知道腾讯想表达什么意思,自己不是很精通STL。
    感觉直接遍历一遍然后考察vector[i]>>1;
    如果奇数就提出来,算法开销O(n),不知道是不是有什么更好的方法?
    大神勿喷,这题有没有必要用hash?

    48 replies  •  2015-04-30 23:03:05 +08:00
    jiang42
    jiang42
    Apr 7, 2015
    1
    听说腾讯有让做fib53的,我觉得。。。这题O(n)算法就行了?
    vibbow
    vibbow
    Apr 7, 2015
    2
    直接循环一遍,在内存里判断QQ号最后一位二进制是不是1?
    wind3110991
    wind3110991
    OP
    Apr 7, 2015
    3
    @vibbow 我也觉得。。不知道他要表达什么了
    wind3110991
    wind3110991
    OP
    Apr 7, 2015
    4
    @jiang42 fib53?斐波那契?
    xvsfezz
    xvsfezz
    Apr 7, 2015
    5
    内存够不够。。
    wy315700
    wy315700
    Apr 8, 2015
    6
    是不是不允许copy
    wind3110991
    wind3110991
    OP
    Apr 8, 2015
    7
    @xvsfezz 假如不够呢,是不是hash到n个文件里?
    HanSonJ
    HanSonJ
    Apr 8, 2015 via Android
    8
    明天面试楼主才来问之前的问题…
    wind3110991
    wind3110991
    OP
    Apr 8, 2015
    9
    @HanSonJ 今天看大数据时突然想起没有比较好的解决方案,身边同学也觉得题有问题,就搁浅了,你觉得怎么解决?
    wind3110991
    wind3110991
    OP
    Apr 8, 2015
    10
    @wy315700 好像没提到
    HanSonJ
    HanSonJ
    Apr 8, 2015 via Android
    11
    @wind3110991 我是战斗力只有5的渣
    spacewander
    spacewander
    Apr 8, 2015❤️1
    12
    count += (v[i] & 1);
    类似这样?
    没用无重复的条件,但是O(n)加较小的常数因子,感觉没有比它更快了
    再快就只能用并行算法了……
    acros
    acros
    Apr 8, 2015 via iPhone
    13
    考内存管理的效率吗?
    qq号一亿个int,长度按4算,内存肯定不够一次载入。
    另外还有vector内部内存模型问题吧,我需要复习下.....
    acros
    acros
    Apr 8, 2015 via iPhone
    14
    2了,现在qq号是11位以上了吧?存的string还是数值?
    jesse_luo
    jesse_luo
    Apr 8, 2015
    15
    @acros QQ 号好像有11 位了? 所以按 64 位计算,8*100000000 Byte 约为 700 多 MB吧

    可能要考虑 QQ 号数据动态变化,能多次迅速计算?
    acros
    acros
    Apr 8, 2015 via iPhone
    16
    @jesse_luo 怀疑int够不够....好像需要收集很多前置条件
    acros
    acros
    Apr 8, 2015 via iPhone
    17
    @jesse_luo 估计考官第一条审批还是看有没区分64,32呢....
    jiang42
    jiang42
    Apr 8, 2015
    18
    @wind3110991 对啊。。。
    NCE
    NCE
    Apr 8, 2015
    19
    11wei % 2
    lucifer9
    lucifer9
    Apr 8, 2015❤️11
    20
    给所有qq在线用户弹窗:
    今天是马化腾的生日,挑出以下所有的偶数号码并回复偶数号码的个数有机会点亮头像哦

    然后每个用户发10个号码,正好用上号码不重复的条件
    运气好的话一遍就出来结果了
    cheng007
    cheng007
    Apr 8, 2015
    21
    有一个1亿的vector,说明内存不是问题,要拿出所有的奇数,必须完成一次遍历也就是O(n),这题目应该是考并发吧,开多个线程每个线程负责一个段数据。
    wibile
    wibile
    Apr 8, 2015
    22
    @lucifer9 你是个人才!请收下我的膝盖。ps,运气不好咋办。。。
    zwzmzd
    zwzmzd
    Apr 8, 2015 via Android
    23
    我记得题目是删除qq号

    不过意思一样,用remove_if,原理类似于partition
    sigarron
    sigarron
    Apr 8, 2015
    24
    @spacewander 这哥们貌似对的,位运算总是最快的,但是vector的意义是啥呢?存储的是int64还是string呢?这些问题都值得考虑下。
    lucifer9
    lucifer9
    Apr 8, 2015
    25
    @wibile 用户基数在那摆着呢,运气再不好也不至于需要1亿次吧
    xinyewdz
    xinyewdz
    Apr 8, 2015
    26
    普通的qq号是9位,大概就是1亿个。这数组不是稀疏数组,遍历一遍标注每个数组(用0和1标注)。然后直接输出下标是奇数并且值是1的。
    ybh37
    ybh37
    Apr 8, 2015
    27
    字符串和数字无所谓,只判断二进制的最后一位是不是0就可以了。
    imn1
    imn1
    Apr 8, 2015
    28
    @ybh37 +1
    ugvfpdcuwfnh
    ugvfpdcuwfnh
    Apr 8, 2015
    29
    拆半查找都可以吧,2的27次方大于一亿。

    前几次是外部排序,后面就是内部排序。
    lijinma
    lijinma
    Apr 8, 2015
    30
    @ugvfpdcuwfnh 还要排序?排序那就更复杂了
    ugvfpdcuwfnh
    ugvfpdcuwfnh
    Apr 8, 2015
    31
    @lijinma 不是排序,本身就是排好的,应该是外部查找和内部查找。
    ugvfpdcuwfnh
    ugvfpdcuwfnh
    Apr 8, 2015
    32
    哎?我突然发现我没看清题目,是要选出奇数号,我以为是从一亿号里选出一个号。

    好吧,我楼上的回复都无视吧.....
    zcljy
    zcljy
    Apr 8, 2015
    33
    @ybh37 re
    ether
    ether
    Apr 8, 2015
    34
    map reduce!
    yuankui
    yuankui
    Apr 8, 2015
    35
    把奇数插入到首部,吧偶数插入到尾部
    要取奇数的话,就循环从首部取完,直到遇到偶数...
    要取偶数的化,就循环从尾部取,直到遇到奇数...
    yuankui
    yuankui
    Apr 8, 2015
    36
    我靠,如果有这种需求,为什么不用两个vector存储?
    yuankui
    yuankui
    Apr 8, 2015
    37
    你可以直接跟面试官说,你们这个前提很没水平
    sage417
    sage417
    Apr 8, 2015
    38
    我觉得考的是大数据,跟技术还是偶数没什么关系,应该是map-reduce
    sen506
    sen506
    Apr 8, 2015
    39
    2个迭代器A B
    当当前数位奇数时*A++ = *B++;
    当当前数为偶数时++B;
    B到达容器结尾时结束;
    最后vector.erase(A, vector.end());

    应该就这样了吧。。
    laotaitai
    laotaitai
    Apr 8, 2015
    40
    拿Python, 3秒就能把1亿个QQ遍历完
    also24
    also24
    Apr 8, 2015
    41
    看到中间越看感觉越奇怪……
    返回头又看一遍才反应过来是 奇数 不是 质数 的我面壁去了……

    (:o 」∠)_
    quericy
    quericy
    Apr 8, 2015
    42
    @lucifer9 然后有用户手滑的,有无聊随便选的,还有好奇心害死猫觉得有隐藏条件然后全点一遍的23333
    blank4me
    blank4me
    Apr 9, 2015
    43
    @quericy 一组数据不要发给一个人撒。多发几个人看看,再判断是否相信他们的结果。就和reCAPTCHA一样。
    khan
    khan
    Apr 28, 2015
    45
    判断低 bit位是否为1
    khan
    khan
    Apr 28, 2015
    46
    8byte int_64 * 100,000,000L 需内存约 100M

    位运算 比 / %都要省 cpu, 剩下的内存问题可以多段分块加载
    khan
    khan
    Apr 28, 2015❤️1
    47
    体死早. 800M 内存 换成字符串大概不过2G, 加上指针 和 字符串本身内存, 分块处理 合并不可少
    wind3110991
    wind3110991
    OP
    Apr 30, 2015
    48
    @khan 谢谢你的解答!我再想想,有点不理解
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1532 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 96ms · UTC 17:49 · PVG 01:49 · LAX 09:49 · JFK 12:49
    ♥ Do have faith in what you're doing.