免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 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
发表于 2018-04-07 18:37 |显示全部楼层
https://baike.baidu.com/item/%E6%8E%92%E5%88%97%E7%BB%84%E5%90%88/706498

1,2,3,...,N   取 N
-----------------------------------------------------
有重复=> N^N = N * N * N * N * ....* N
无重复=> N! = N * (N-1) * (N-2) * ... *3 *2 *1

ex: 1,2,3
有重复 111,112,113,...,331,332,333 = 3^3 = 27
无重复 123, 132, ..., 321 = 3! = 3*2*1 = 6



1,2,3,...,N   取 M
---------------------------------------------------
有重复=> N^M = N * N * N ... * N     
无重复=> N! / (N-M)! = N*(N-1)*(N-2)* ... (N-M) =

ex: 1,2,3,4,5 取 3
有重复  111, 112, 113, 114,115, ..., 551,552, 553, 554, 555
  5 * 5 * 5 = 5^3 = 125
无重复 123, 124, 125, ...., 541, 542 ,543
  5 * 4 * 3 = 5!/(5-3)! = (5*4*3*2*1) / (2*1) = 60

$ echo 200 4 | awk '{a=b=1;for(n=1;n<=$2;n+=1){a*=$1;b*=($1-n)};print $1" 取 "$2"\n有重复="a,"\n无重复="b,"\n"b/a}'
200 取 4
有重复=1600000000
无重复=1521390024
0.950869


论坛徽章:
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
发表于 2018-04-07 20:34 |显示全部楼层
回复 11# jason680

那些太复杂了  看不懂   只想要能够实现代码

论坛徽章:
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
发表于 2018-04-07 21:10 |显示全部楼层
本帖最后由 Windows19 于 2018-04-09 10:39 编辑

回复 11# jason680

$ echo 40 4 | awk '{a=b=1;for(n=1;n<=$2;n+=1){a*=$1;b*=($1-n)};print $1" 取 "$2"\n有重复="a,"\n无重复="b,"\n"b/a}'                                              40 取 4
有重复=2560000
无重复=1974024   (我做了测试,并没有这么多)
0.771103

下面测试1至40个数
1.....40号码做了测试不重复的并没有你上面数据那么多

40个号段我是分4个文本分开测试  (因为放在一个文本中还没有代码,所以才分开4个)

使用下面代码可以得到2560000行
$ awk -vmaxdepth=4 'function rev(_ARGVEND_,i){deep++;for(i=0;i++<NR;){s=s?s""a:a;if(deep==maxdepth){print s}else{rev()};s=substr(s,1,length(s)-length(a))};deep--}{$0==""?NR--:a[++i]=$0}END{rev()}' file >2560000行

然后我将40个数分开4个文本后测试 , 每个文本写进10个数字进行测试  跑出结果到240000行(24万行我认为是正确的,也是我我想要的结果),  并不是你所示1974024行(197万多行)




测试:
每个文本写进10个数字
cat 1.txt
1
2
3
4
5
6
7
8
9
10

cat 2.txt
11...20

cat 3.txt
21...30

cat 4.txt
31...40



跑出结果到240000行(24万行我认为是正确的,也是我我想要的结果),,

上面代码只是想把它能够优化一下  整合到使用1一个文本中来控制它 因为多个文本确实不方便 不知道有没优化余地





论坛徽章:
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
发表于 2018-04-07 21:27 |显示全部楼层
这两种算法应该要相差10倍多  

论坛徽章:
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
发表于 2018-04-08 11:15 |显示全部楼层
                                                                              

论坛徽章:
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
发表于 2018-04-08 11:21 |显示全部楼层
回复 13# Windows19

相信也好,不相信也好
真象 有时另人难以相信...

40 取 4
1,2,3,4, ... ,37,38,39,40

以下举例:...
1,11,21,31
10,20,30,40

能否在0.txt中找到以下结果?
1,2,3,4
1,2,3,5
1,2,3,40        
11,12,13,14
40,1,2,3
40,39,38,37

论坛徽章:
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
发表于 2018-04-08 13:31 |显示全部楼层
回复 16# jason680

sorry 嗯, 你是对的, 从你方析,另外你又提醒了我    我又做了测试 认识到原来放在一个文中和分开几个文本出来结果确实是有分别的  还是你水平高,想的问题透彻
Thanks


现在只能这样了, 按几个文件为基础 1.txt 2.txt 3.txt 4.txt  程序算法将几个文件循环排列位置后分别输出2,3,4组结果, 我想如果可以将13楼24条命令整合成一条命令也是非常好的   不知道是否可以整合?     整合成一条命又可以灵活输出2组 或者3,4组这样算法 就更理想

Thanks

论坛徽章:
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
发表于 2018-04-08 14:20 |显示全部楼层
你还是先说说,你想做什么?

要做什么事,为什么要组合排列文档资料
数据有多少?(30行,300行还是3000行)...
数据只要一多 排列组合结果 不是你能想象的...

另外1楼与13楼是不同一件事...
你要牛排(197万多行)...
最后结果 面包加前菜(24万行)就好...

论坛徽章:
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
发表于 2018-04-08 14:46 |显示全部楼层
回复 18# jason680

数据大概不到200百行要13楼(24万行)这种结果就好...

主要就是将4文件变换不同位置输出结果  基于4个文件 可以输出2,3,4组合变化
例如其于4文件内容输出 2组合 有12种不同排列内容输出
1.txt 2.txt
1.txt 3.txt
1.txt 4.txt

2.txt 3.txt
2.txt 4.txt
2.txt 1.txt

3.txt 2.txt
3.txt 1.txt
3.txt 4.txt

4.txt 1.txt
4.txt 2.txt
4.txt 3.txt

3组合也如此变换位置...
1.txt 2.txt .txt
有24种不同排列内容输出

4组合也如此变换位置...
1.txt 2.txt 3.txt 4.txt
也有24种不同排列内容输出
将2,3,4不同排列内容结果 分别输出到 一个2组,3组,4组各个文本中去


论坛徽章:
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
发表于 2018-04-08 15:10 |显示全部楼层
回复 18# jason680

awk -vmaxdepth=1,2,3,4 'function rev(_ARGVEND_,i){j++;for(i=0;i++<a[j];){s=s""b[j,i];if(j==length(a)){print s}else{rev()};s=substr(s,1,length(s)-length(b[j,i]))};j--}{f==FILENAME?a++:a[++i]++;f=FILENAME;b[i,FNR]=$0;}END{rev()}' 1.txt 2.txt 3.txt 4.txt >分别按参数输出2,3,4组 3个文件       统一命名  2,3,4组排列结果.txt
如果参数改变为
awk -vmaxdepth=2,4 就分别按参数输出2,4组 2个文件 分别按组命名   2组排列结果.txt     4组排列结果.txt


如果参数改变为
awk -vmaxdepth=4 就分别按参数输出4组 1个文件  命名4组排列结果.txt


如果参数改变为
awk -vmaxdepth=1 就分别按参数输出1组 1个文件 将4个文件合并起来输出  命名1组.txt

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP