免费注册 查看新帖 |

Chinaunix

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

请教文本处理:123与321合并为123 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2005-05-13 12:45 |只看该作者

请教文本处理:123与321合并为123

我给大家提个问题,如果要求123/213/231/321都合并然后记数的话代码怎样最优呢?呵呵

论坛徽章:
0
22 [报告]
发表于 2005-05-13 13:11 |只看该作者

请教文本处理:123与321合并为123

个人认为代码要根据实际情况进行优化,比如(文件内容,内存,cpu等),内存很大的时候可以先循环计算,最后筛选汇总(就是将if语句放到for外);cpu处理能力强的话可以先筛选再计算(就是将if语句放到for内)。

论坛徽章:
0
23 [报告]
发表于 2005-05-13 13:21 |只看该作者

请教文本处理:123与321合并为123

能更具体一些么?比如if什么和for什么,以及使用什么数据结构??

论坛徽章:
0
24 [报告]
发表于 2005-05-13 13:46 |只看该作者

请教文本处理:123与321合并为123

从编程的角度我倾向于使用散列做,这样比较直观,可读性好,代码也简洁。将每行分割存储到三个变量中用if (~/[$a$b$c]{3}/)进行筛选,读取内容并计数用while循环。问题就是先判断还是后判断!

论坛徽章:
0
25 [报告]
发表于 2005-05-13 15:03 |只看该作者

请教文本处理:123与321合并为123

[quote]原帖由 "怒剑狂啸"]3}/)进行筛选,读取内容并计数用while循环。问题就是先判断还是后判断![/quote 发表:


对目的字串分割并预排列看来大家意见是统一的,即然使用HASH肯定最后判断合理一些,我的意见是使用多重hash的结构

%hash={name_sorted, %subhash}
%subhash={real_char, count}

最重要的是当一个name_sorted是exist的时候subhash里面的所有key的count都要+1
最后仅仅只要比较subhash的key即可

怒剑你认为对不对?

论坛徽章:
0
26 [报告]
发表于 2005-05-13 15:36 |只看该作者

请教文本处理:123与321合并为123

多重散列可能有点复杂哦!而且你还得枚举所有的可能情况,比如文件中如果只有123,你还得把所有可能的组合都加1,有点浪费,我的意见就比如我写的第二个程序,一次性将文件中的内容读取到散列中,减少了不必要的系统开销,然后将关键字分割,并在散列键中查找匹配~/[$a$b$c]{3}/,并求和,匹配到的一律从散列中删除,这样散列中最后就只留下一组,方法和我写的第二个程序类似,你说呢?

论坛徽章:
0
27 [报告]
发表于 2005-05-13 16:13 |只看该作者

请教文本处理:123与321合并为123

[quote]原帖由 "怒剑狂啸"]3}/,并求和,匹配到的一律从散列中删除,这样散列中最后就只留下一组,方法和我写的第二个程序类似,你说呢?[/quote 发表:


如果先将所有的值读入一个hash的话在使用查找匹配~/[$a$b$c]{3}/,那肯定会大量的扫描这个hash,这肯定是不可取的吧,即使额外使用一个辅助的散列也无法降低查找匹配的次数到一个合理的值上
我的算法就通过多重hash将循环控制在一个小的rang里面

另外我觉得记录所有的不同种类的值是必须的,因为最后肯定要找出最小的那个key啊

论坛徽章:
0
28 [报告]
发表于 2005-05-13 17:10 |只看该作者

请教文本处理:123与321合并为123

最后匹配的时候就像我的第二个程序,扫描是递减的,因为我的delete函数不停地在散列中删除,所以循环匹配会越来越少,最后就只剩下唯一值,不过不是最小的key,我想总比枚举不存在的值所需要的内存开销,和每一个key循环计数所需的cpu处理能力要好一些,我最后只要将所有匹配的key的值求和,然后删除冗余就行了。当文件很大时,你的开销是很大的!

论坛徽章:
0
29 [报告]
发表于 2005-05-13 17:26 |只看该作者

请教文本处理:123与321合并为123

按照你的思路,是不是先将所有的文本内容读入一个hash,然后随便弹出一个hash元素根据其key值循环整个hash并查找匹配,是么?

也就是说在你查找真个hash的时候不管组成是不是匹配都要被你for/each/foreach一次是不是,你感觉是不是如果使用双层hash做索引会快的多呢?循环次数更少??

弹出一个element后仅仅在其name-sorted的子hash里面查找而不用查找整个hash不是更合理么?

论坛徽章:
0
30 [报告]
发表于 2005-05-16 07:54 |只看该作者

请教文本处理:123与321合并为123

首先纠正一下我犯的错误:
~/[$a$b$c]{3}/
这一句并不能很好的起作用,因为它会将$a$a$a等情况也匹配在内,我还是把我的最终代码贴出来吧!
首先,我用下面的代码生成了一个1000000行的文件进行测试,

  1. #!/usr/bin/perl
  2. #file.pl
  3. ($count=shift) || ($count=1);
  4. foreach (1..$count) {
  5.         printf("%03d\n",$_) foreach (0..999) ;
  6. }
复制代码

这个代码包含了所有可能的情况,我用file.pl 1000 >; test.txt导出到文件中
接着我用下面的代码进行测试
  1. #!/usr/bin/perl
  2. open (FILE,"test.txt");
  3. $hash{$_}++ while (chomp($_=<FILE>;));
  4. close FILE;
  5. while (($key,$value)=each%hash) {
  6.         ($a,$b,$c)=split(//,$key);
  7.         @tmp=("$a$c$b","$b$a$c","$b$c$a","$c$b$a","$c$a$b");
  8.         foreach (@tmp) {
  9.                 $keys{$_}++ if (exists$hash{$_}) ;
  10.         }
  11.         foreach (keys%keys) {
  12.                 if ($_ ne $key) {
  13.                         $hash{$key}+=$hash{$_};
  14.                         delete $hash{$_};
  15.                 }
  16.         }
  17.         %keys=();
  18.         print sort($a,$b,$c),",$hash{$key}\n";
  19. }
  20. ($sys,$user)=times;
  21. print $sys+$user;
复制代码

程序执行时间1.26s
测试环境:CPU:pentium4 1.5GHZ Mem:256M OSebian Linux + perl 5.8.4
superdoctor,期待你的测试结果!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP