问个排序算法问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
abcdxx
V2EX    程序员

问个排序算法问题

  •  
  •   abcdxx 2018 年 1 月 24 日 3156 次点击
    这是一个创建于 2995 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前有 A B 两个文件

    A 文件结构如下

    aasdad11k1

    dddasda113

    oadap123ka

    12321312aa

    B 文件结构如下

    kkooasda11

    aasdad11k1

    asdad11111

    ooooo12312

    asdada1312

    AB 两个文件都是写\n 换行,每行都是以 字符+数字 组成,并且长度固定 现在想获取 A 里面的文件内容是否在 B 里面,如果在则输出这一行。

    AB 两个文件大小都在 1000 万行

    用 AWK 命令

    awk 'NR==FNR{x[$0];next}{for(i in x)if($0~i)print}' a b > result

    这个效率略低,目前代码如下

     String b=null; int i=0; while ((str = bufferedReader.readLine()) != null){ b[i]=str; i++; } while ((str = bufferedReader_a.readLine()) != null){ for (int m=0;m<b.length;m++){ if (str.equals(b[m])){ bw.write(str); break; } } } bw.close(); fw.close(); 

    速度太慢了. 在不考虑切分文件的情况下,有算法可以处理这类需求吗?

    19 条回复    2018-01-26 01:40:20 +08:00
    h4lbhg1G
        1
    h4lbhg1G  
       2018 年 1 月 24 日
    嗯,我随口说说。对 B 建一个 trie 树,然后用 A 来查就好了。这长度固定,深度是固定的,效率应该很高。
    ipwx
        2
    ipwx  
       2018 年 1 月 24 日
    楼主你真的学过数据结构和算法么?
    - - - -

    上哈希表,妥妥的。
    luban
        3
    luban  
       2018 年 1 月 24 日 via iPhone
    这是思路,你得先对 b 文件排序,再使用查找的算法
    1 千万,即使用快速排序也要很久,为啥不能拆分文件呢
    其他思路本质也是类似,把 b 存到 nosql,redis,mongo 之类,再查找,当然存 mysql 也行,这里就是数据库实现了一些数据结构和算法,不用自己再写了
    liuminghao233
        4
    liuminghao233  
       2018 年 1 月 24 日 via iPhone
    2l 第四行

    记得内存插满
    georgetso
        5
    georgetso  
       2018 年 1 月 24 日
    1 楼 trie 树 赞同
    sundyli
        6
    sundyli  
       2018 年 1 月 24 日
    trie 树 +1
    crayygy
        7
    crayygy  
       2018 年 1 月 24 日
    (10 byte + 2 byte) * 1 * 10^6

    算起来也没多少...全放内存似乎也没啥大不了的

    当然了我还是觉得用树比较合适
    crayygy
        8
    crayygy  
       2018 年 1 月 24 日
    @crayygy #7 sorry,我似乎算错了一个级数
    wweir
        9
    wweir  
       2018 年 1 月 25 日 via Android
    既然 hash 表不行,要不试试 hash 树?
    hotea
        10
    hotea  
       2018 年 1 月 25 日
    布隆过滤器?
    stephenpcg
        11
    stephenpcg  
       2018 年 1 月 25 日   2
    既然楼主都考虑过 awk 了,我觉得很可能是一次性的任务,1000 万行也不大,也就百来兆的文件,可以试试:

    comm -1 -2 <(sort a) <(sort b)

    时间主要消耗在 sort 上面,我本地随机生成了两个文件 a、b,每个文件 1000 万行,每行长度 10 个字符,本地测试总开销 12s。时间比 awk 少 2 个数量级以上。
    h4lbhg1G
        12
    h4lbhg1G  
       2018 年 1 月 25 日
    @stephenpcg 1000 万等于 10 的 8 次方。每行 11 个字符. 一共有 1.1x10^9Bytes=1.1x10^9/1024/1024/1024GB=1.024GB,是不是少了个数量级。虽然排序是不错的方法就是了,而且如果用归并排序似乎更快。
    h4lbhg1G
        13
    h4lbhg1G  
       2018 年 1 月 25 日
    @h4lbhg1G 说错了,是可以节省空间。
    stephenpcg
        14
    stephenpcg  
       2018 年 1 月 25 日
    @h4lbhg1G 100 万约为 1M,1000 万即为 10M,每行 11 字节,即为 110MB。你前面说“等于 10 的 8 次方”,后面计算时变成了 "x10^9Bytes"。
    h4lbhg1G
        15
    h4lbhg1G  
       2018 年 1 月 25 日
    @stephenpcg 11x10^8 等于多少?
    h4lbhg1G
        16
    h4lbhg1G  
       2018 年 1 月 25 日
    @stephenpcg 好吧 我错了
    laodao1990
        17
    laodao1990  
       2018 年 1 月 25 日
    关注一下。
    大家解题思路别限制字符串长度呀,没准题主例子中的字符串就是随便写的,实际上要关联的是两个几十个 G 的日志文件。
    enenaaa
        18
    enenaaa  
       2018 年 1 月 25 日
    如果只是判断 A 的文本是否存在 B 中。 那不用排序啊。
    把 A 的所有行读出来, 放到哈希表或映射表中。 读 B 时判断是否在表中即可。
    手动构建查找树,貌似太为难楼主了。
    wwww961h
        19
    wwww961h  
       2018 年 1 月 26 日 via iPhone
    同三楼,我第一印象也是走数据库,不管是 nosql 还是 mysql,数据库就是用来处理数据的,从数据库拿出来用脚本运算绝对快,比你想啥数据结构都快,不过超过亿级之后数据库就基本慢得死了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3927 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8. 25ms UTC 10:28 PVG 18:28 LAX 03:28 JFK 06:28
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86