原帖1 http://bbs.chinaunix.net/thread-4263348-1-1.html
实际文本100G,内存仅4G以内。磁盘空间按1T算。
文本内容由大量明文字符串组成(ASCII码以内),部分样板:
65425855662efssaezsdfcsf//sff.sdf/'s;f]\sDed33dds3
65425855662efssaezsdfcsf/ /sff.sdf/'s;f] \sDed33sdds1
yjyjgwwwghfg56www g.tgjgcom445.5454.'55.4l5
efssaezsdfcsf//58969752sff.sdf/'s;f]\sDed33sds0
efssaezsdfcsf/ 58969752/sff.sdf/'s;f] \sDed33sdds5
65425855662efssaezsdfcsf/ /sff.sdf/'s;f] \sDed33s00000000
65425855662efs\saezsdf][grytryg*f-x+f5g5ty'5t;54r]\5/e.,6ftfr//www.fsfsf.com
处理结果:
65425855662efssaezsdfcsf/ /sff.sdf/'s;f] \sDed33sdds1
65425855662efssaezsdfcsf//sff.sdf/'s;f]\sDed33dds3
65425855662efssaezsdfcsf/ /sff.sdf/'s;f] \sDed33s00000000
efssaezsdfcsf/ 58969752/sff.sdf/'s;f] \sDed33sdds5
efssaezsdfcsf//58969752sff.sdf/'s;f]\sDed33sds0
65425855662efs\saezsdf][grytryg*f-x+f5g5ty'5t;54r]\5/e.,6ftfr//www.fsfsf.com
yjyjgwwwghfg56www g.tgjgcom445.5454.'55.4l5
处理要求:
提取出每行的 “数字串” 和 “字母串”,标点符号不计入内,统计这些 “关键字” 在全文中重复出现的频率/次数。
然后将含有高频率关键字的行排在前面,关键字出现频率低的行排在后面。
可以先按给出的样板进行处理,但是请考虑达到100G后内存的控制以及效率问题。
详细过程:
[list]每行的关键字提取,并统计其在全文中出现的次数统计(如果单行内出现多次,计为一次)
f(6),efssaezsdfcsf(5),sff(5),s(5),sDed(5),33(5),sdf(5),65425855662(4),3(1),dds(1)
f(6),s(5),sff(5),efssaezsdfcsf(5),33(5),sdf(5),sDed(5),65425855662(4),sdds(2),1(1)
5(3),g(2),www(2),yjyjgwwwghfg(1),56(1),445(1),tgjgcom(1),4(1),l(1),5454(1),55(1)
f(6),33(5),sdf(5),sDed(5),s(5),sff(5),efssaezsdfcsf(5),58969752(2),0(1),sds(1)
f(6),efssaezsdfcsf(5),sff(5),s(5),sDed(5),33(5),sdf(5),5(3),sdds(2),58969752(2)
f(6),efssaezsdfcsf(5),s(5),sff(5),sDed(5),sdf(5),33(5),65425855662(4),00000000(1)
f(6),65425855662(4),5(3),g(2),www(2),x(1),ftfr(1),e(1),com(1),54(1),t(1),ty(1),fsfsf(1),grytryg(1),efs(1),r(1),6(1),saezsdf(1)
按频率系数对每一行排序(从最高的频率开始对比;如果最高的次数相同,则对比第二列,以此类推)
f(6),s(5),sff(5),efssaezsdfcsf(5),33(5),sdf(5),sDed(5),65425855662(4),sdds(2),1(1)
f(6),efssaezsdfcsf(5),sff(5),s(5),sDed(5),33(5),sdf(5),65425855662(4),3(1),dds(1)
f(6),efssaezsdfcsf(5),s(5),sff(5),sDed(5),sdf(5),33(5),65425855662(4),00000000(1)
f(6),efssaezsdfcsf(5),sff(5),s(5),sDed(5),33(5),sdf(5),5(3),sdds(2),58969752(2)
f(6),33(5),sdf(5),sDed(5),s(5),sff(5),efssaezsdfcsf(5),58969752(2),0(1),sds(1)
f(6),65425855662(4),5(3),g(2),www(2),x(1),ftfr(1),e(1),com(1),54(1),t(1),ty(1),fsfsf(1),grytryg(1),efs(1),r(1),6(1),saezsdf(1)
5(3),g(2),www(2),yjyjgwwwghfg(1),56(1),445(1),tgjgcom(1),4(1),l(1),5454(1),55(1)
为了看得清楚一点,仅列出频率系数,前后对比:
Before:
[0]6,5,5,5,5,5,5,4,1,1
[1]6,5,5,5,5,5,5,4,2,1
[2]3,2,2,1,1,1,1,1,1,1,1
[3]6,5,5,5,5,5,5,2,1,1
[4]6,5,5,5,5,5,5,3,2,2
[5]6,5,5,5,5,5,5,4,1
[6]6,4,3,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1
After
[1]6,5,5,5,5,5,5,4,2,1
[0]6,5,5,5,5,5,5,4,1,1
[5]6,5,5,5,5,5,5,4,1
[4]6,5,5,5,5,5,5,3,2,2
[3]6,5,5,5,5,5,5,2,1,1
[6]6,4,3,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1
[2]3,2,2,1,1,1,1,1,1,1,1[/list]
注意上面的结果是同一“单词”在单行中重复多次记为一次的。应考虑按多次计算的情况(或者做个开关允许按不同方式处理)
当然这个细节问题不大,主要还是:硬盘、内存、时间效率。65425855662efssaezsdfcsf/ /sff.sdf/'s;f] \sDed33s00000000
一行内两次算是2次吗?我以为一行内多次也计为1次,还特地做了判断
Windows19 回复 53# 523066680
如果算2次影响效率
那在一行内出现相同的算1次也可以
为了减少过度的测试时间和硬盘消耗,可将此问题稍作修改,改为10G文件(或1G),语言不限。