免费注册 查看新帖 |

Chinaunix

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

[文本处理] 相乘 算法 [复制链接]

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
21 [报告]
发表于 2018-04-08 21:14 |只看该作者
回复 19# Windows19

$ echo 200 4 | awk '{t=1;a=$1;for(n=1;n<=$2;n+=1){t*=a*n};print $2"个文档, 文档="a"行, 结果="t"行";for(n=3;n<=10;n+=2){print "\n文档字符串,每行平均以"n"个来算\nx..xy..yz...zw...w + [回車] => 1行"n*4+1"个字符";print t"行=> "t*(n*4+1)/(1024^3)"GB"} }'
4个文档, 文档=200行, 结果=38400000000行

文档字符串,每行平均以3个来算
x..xy..yz...zw...w + [回車] => 1行13个字符
38400000000行=> 464.916GB

文档字符串,每行平均以5个来算
x..xy..yz...zw...w + [回車] => 1行21个字符
38400000000行=> 751.019GB

文档字符串,每行平均以7个来算
x..xy..yz...zw...w + [回車] => 1行29个字符
38400000000行=> 1037.12GB

文档字符串,每行平均以9个来算
x..xy..yz...zw...w + [回車] => 1行37个字符
38400000000行=> 1323.22GB

回帖到此...

论坛徽章:
13
CU大牛徽章
日期:2013-04-17 11:20:3615-16赛季CBA联赛之吉林
日期:2017-05-25 16:45:4715-16赛季CBA联赛之福建
日期:2017-03-13 11:33:442017金鸡报晓
日期:2017-02-08 10:39:422017金鸡报晓
日期:2017-01-10 15:13:29IT运维版块每日发帖之星
日期:2016-03-15 06:20:01IT运维版块每日发帖之星
日期:2015-10-02 06:20:00CU十二周年纪念徽章
日期:2013-10-24 15:41:34CU大牛徽章
日期:2013-09-18 15:15:45CU大牛徽章
日期:2013-09-18 15:15:15CU大牛徽章
日期:2013-04-17 11:46:39CU大牛徽章
日期:2013-04-17 11:46:28
22 [报告]
发表于 2018-04-10 09:31 |只看该作者
本帖最后由 xdsnet 于 2018-04-10 09:38 编辑

排列、组合问题?
此外这个是否输入数据已经去重?输出是否需要去重?

如果行数太多(你所谓的上千行),这个计算机肯定会爆掉的。
就是不重复的情况,如果是取3行,有A(N,3)=N!/((N-3)!),假设有500行,就有500*499*498可能,而且你每一行的字符数还不定,所以存储空间也是惊人的。

论坛徽章:
0
23 [报告]
发表于 2018-04-10 12:49 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
22
2015年亚洲杯之科威特
日期:2015-04-18 15:27:07每日论坛发贴之星
日期:2016-01-27 06:20:0015-16赛季CBA联赛之广夏
日期:2016-03-28 16:20:51程序设计版块每日发帖之星
日期:2016-04-09 06:20:00CU十四周年纪念徽章
日期:2016-05-03 09:35:1415-16赛季CBA联赛之天津
日期:2016-11-18 08:31:3115-16赛季CBA联赛之山西
日期:2016-12-07 16:29:5315-16赛季CBA联赛之八一
日期:2017-01-10 11:34:3415-16赛季CBA联赛之吉林
日期:2017-03-30 22:51:1915-16赛季CBA联赛之广夏
日期:2017-04-13 20:51:52程序设计版块每日发帖之星
日期:2016-01-27 06:20:00每日论坛发贴之星
日期:2015-12-28 06:20:00
24 [报告]
发表于 2018-04-10 14:48 |只看该作者
回复 22# xdsnet

数据肯定没重复的 已处理过  再说行数可以取小一点
不淡大小  只谈实现

论坛徽章:
22
2015年亚洲杯之科威特
日期:2015-04-18 15:27:07每日论坛发贴之星
日期:2016-01-27 06:20:0015-16赛季CBA联赛之广夏
日期:2016-03-28 16:20:51程序设计版块每日发帖之星
日期:2016-04-09 06:20:00CU十四周年纪念徽章
日期:2016-05-03 09:35:1415-16赛季CBA联赛之天津
日期:2016-11-18 08:31:3115-16赛季CBA联赛之山西
日期:2016-12-07 16:29:5315-16赛季CBA联赛之八一
日期:2017-01-10 11:34:3415-16赛季CBA联赛之吉林
日期:2017-03-30 22:51:1915-16赛季CBA联赛之广夏
日期:2017-04-13 20:51:52程序设计版块每日发帖之星
日期:2016-01-27 06:20:00每日论坛发贴之星
日期:2015-12-28 06:20:00
25 [报告]
发表于 2018-04-10 14:49 |只看该作者
回复 21# jason680

谢谢解释

论坛徽章:
13
CU大牛徽章
日期:2013-04-17 11:20:3615-16赛季CBA联赛之吉林
日期:2017-05-25 16:45:4715-16赛季CBA联赛之福建
日期:2017-03-13 11:33:442017金鸡报晓
日期:2017-02-08 10:39:422017金鸡报晓
日期:2017-01-10 15:13:29IT运维版块每日发帖之星
日期:2016-03-15 06:20:01IT运维版块每日发帖之星
日期:2015-10-02 06:20:00CU十二周年纪念徽章
日期:2013-10-24 15:41:34CU大牛徽章
日期:2013-09-18 15:15:45CU大牛徽章
日期:2013-09-18 15:15:15CU大牛徽章
日期:2013-04-17 11:46:39CU大牛徽章
日期:2013-04-17 11:46:28
26 [报告]
发表于 2018-04-11 10:49 |只看该作者
本帖最后由 xdsnet 于 2018-04-11 11:20 编辑

如果已经去重,且知道行数,其实有一个很取巧的方法可以很快的得出结果,而且有重复的甚至比没有重复的更快。 这需要用到一个数学知识了 假设有N行(相互不重复,对应0,1,2,...,N-1 的序号),则取M个,每行可以重复时,就是有N*N..N(M个N相乘),所以如果有M段数字Z,每段有K种可能(K>=N),则这个整体的0到Z的最大值 间的各个数字可以映射为取值可能,因为K可以用二进制表示,所以可以转换为K(n),其中n是K对应的二进制位数,所以内容转换为有nM位的二进制数,可以分成M段,每段有n位,其对应的符合条件的数k(k<=N)就是符合条件的行序号。 这样依次增加输出数字(判断分段数值是否符合范围),就可以查出对应的重复行的可能,增加条件保证每段不重复就可以输出 不重复的可能。

这个算法的优点是O(n)复杂度的了。

不过这个算法实现可能需要用到大整数 位运算,不知道你好不好实现。 比如,有8行,要取3行,因为N=8,对应n=3,M=3,所以需要一个9位二进制数表示可能(重复时刚好全覆盖)
  1. // 伪C语言 逻辑实现
  2. for(i=0;i<1024;i++){
  3.      line1= (i>>(3*0)) & 0x7;
  4.      line2= (i>>(3*1)) & 0x7;
  5.      line3= (i>>(3*2)) & 0x7;

  6.      // 如果扩展,这里line等可能需要用数组存储, 1024要换成n*M+1位二进制数, 0x7要换成对应n的n位1二进制数,3换成n对应数字,0,1,2等其实是和M相关的,后面就可以用到循环中
  7.      // 例如 for(j=0;j<M;j++){
  8.     //       line[j]=(i>>(3*j)) & 0x7;
  9.     //  }

  10.      // 这里根据 line1,line2,line3 输出可重复的结果
  11.      if(line1==line2 || line1== line3 || line2==line3){ // 这里过滤重复情况
  12.           continue
  13.      }
  14.      //  这里根据 line1,line2,line3 输出不重复的结果
  15. }
复制代码

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP