免费注册 查看新帖 |

Chinaunix

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

[文本处理] 关于二分法和HASH表效率比较的问题 [复制链接]

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
31 [报告]
发表于 2013-04-12 09:24 |只看该作者
厉害。厉害。

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
32 [报告]
发表于 2013-04-12 10:20 |只看该作者
回复 30# seesea2517


    我现在使用以下方法:
awk 'NR==FNR{a[$2]=$0;next} {for(ip in a) {if(int(ip)>=$1 && int(ip)<=$2) {print a[ip]"\t"$3"\t"$4"\t"$5"\t"$6}}}'  文件1 文件2

这种awk的数组就是hash方法,但是for i in a,会逐个遍历key,效率很低。

这种和主题讨论的不是一回事吧。

论坛徽章:
6
摩羯座
日期:2013-08-24 10:43:10狮子座
日期:2013-08-25 10:27:06天秤座
日期:2013-09-11 20:28:44午马
日期:2014-09-28 16:06:0015-16赛季CBA联赛之八一
日期:2016-12-19 13:55:0515-16赛季CBA联赛之天津
日期:2016-12-20 14:01:23
33 [报告]
发表于 2013-04-12 14:11 |只看该作者
是否可以这样理解:hash是一种上层观念,数组是底层基础,二分法是观念和基础之外的方法。
所以对于一本书而言索引不是基础,而是观念。基础是索引本身也避不开的一页一页。

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
34 [报告]
发表于 2013-04-12 15:30 |只看该作者
回复 32# expert1


    嗯。我认为lz所说的用 hash 的方法肯定不再要用 for in 来遍历的了。因为构造 hash 就是为了避免遍历。

这是一个简化的例子(不然在构造 hash 表的那一步比较复杂,反而影响到对根本问题的查看了)。在 awk 里先根据对应文件做出一个 hash 表,第二步就直接进行 hash 查找了,不需要遍历的。这时候程序的主要花费其实是在构造表,而查找则只是一个 hash 映射就行了。当然,hash 表的效率要看具体的实现了。具体的 zooyo 版主比较熟悉,我只会说不会做。
不知道 lz 的意思是不是这样,不是的话还请 lz 补充。

  1. [seesea@UC ~]$ head *
  2. ==> 1.txt <==
  3. 1.2.3.4 CN
  4. 1.2.3.5 CN
  5. 1.2.3.6 US
  6. 1.2.3.7 KR
  7. ==> 2.txt <==
  8. 1.2.3.4
  9. 1.2.3.5
  10. 1.2.3.6
  11. 1.2.3.7
  12. ==> addr.awk <==
  13. NR == FNR {
  14.     # 根据第一个文件构造 hash 表,这里简化例子,实际的构造要复杂一些
  15.     addr[$1] = $2
  16. }

  17. NR != FNR {
  18.     # 直接通过 IP 进行 hash 查找,不需要遍历
  19.     print $1 "的位置是:" addr[$1]
  20. }

  21. [seesea@UC ~]$ awk -f addr.awk 1.txt 2.txt
  22. 1.2.3.4的位置是:CN
  23. 1.2.3.5的位置是:CN
  24. 1.2.3.6的位置是:US
  25. 1.2.3.7的位置是:KR
复制代码

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
35 [报告]
发表于 2013-04-12 16:48 |只看该作者
回复 34# seesea2517


    这种看起来是很简单,但你这地址是展开了,比如192.168.0.1  --- 192.168.0.255 CN (# 举例而已)

那么你首先得一个个列出来,xxx.0.1 cn 然后到0.255 cn 这样实际上也就是逐个扫描了。姑且不论后边的部分。

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
36 [报告]
发表于 2013-04-12 17:15 |只看该作者
回复 35# expert1


    嗯,要根据需求来做了。可以说 hash 是先全体扫描,然后再做的时候就不需要扫描了,对于查询多的情况就合算;二分查找或顺序查等方法则是有查询需求的时候再进行扫描,对于重复的查询需要同样的消耗,但如果需要查找的数量不多,则就更合算。

论坛徽章:
6
摩羯座
日期:2013-08-24 10:43:10狮子座
日期:2013-08-25 10:27:06天秤座
日期:2013-09-11 20:28:44午马
日期:2014-09-28 16:06:0015-16赛季CBA联赛之八一
日期:2016-12-19 13:55:0515-16赛季CBA联赛之天津
日期:2016-12-20 14:01:23
37 [报告]
发表于 2013-04-12 17:41 |只看该作者
可以说 hash 是先全体扫描,然后再做的时候就不需要扫描了,对于查询多的情况就合算;二分查找或顺序查等方法则是有查询需求的时候再进行扫描,对于重复的查询需要同样的消耗,但如果需要查找的数量不多,则就更合算


站在高层的观点看是这这样
但从底层看呢呢
庞大的hash表在内存中的结构神奇到cpu不用遍历这块空间就能知道任意的key是存在还是不存在吗?

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
38 [报告]
发表于 2013-04-12 17:52 |只看该作者
回复 37# cao627


    嗯。你看看 zooyo 版主空间有一个文章有一点相关内容(http://blog.chinaunix.net/uid-10540984-id-3533875.html
),或者搜索 hash 的相关资料研究研究。

论坛徽章:
6
摩羯座
日期:2013-08-24 10:43:10狮子座
日期:2013-08-25 10:27:06天秤座
日期:2013-09-11 20:28:44午马
日期:2014-09-28 16:06:0015-16赛季CBA联赛之八一
日期:2016-12-19 13:55:0515-16赛季CBA联赛之天津
日期:2016-12-20 14:01:23
39 [报告]
发表于 2013-04-12 18:06 |只看该作者
@seesea2517
我觉得hash和不hash是一回事
二分和不二分是一回事
但hash和二分不是一回事


好比
hash,一辆性能好的汽车
不hash,一辆性能不好的汽车
二分,一个驾驶水平好的司机
不二分,一个驾驶水平不好的司机

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
40 [报告]
发表于 2013-04-13 22:43 |只看该作者
回复 39# cao627


    精辟,厉害!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP