免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3800 | 回复: 11
打印 上一主题 下一主题

寻找连续子序列 已解决 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-10-27 22:35 |只看该作者 |倒序浏览
本帖最后由 sequencing 于 2010-10-28 17:37 编辑

有0和非0数据形成的序列,如下格式:
  1. 1
  2. 2
  3. 2
  4. 2
  5. 23
  6. 4
  7. 0
  8. 0
  9. 2
  10. ......
复制代码
想找出连续超过1000个不为0的子序列(100个允许出现一个0)并返回其起始和终止行,请各位大侠帮忙!
PS:二楼的大侠,我改了要求,您再看下

论坛徽章:
0
2 [报告]
发表于 2010-10-27 23:29 |只看该作者
awk -v RS='\n0' 'NF>=1000' <(awk '!n++{print ""}1' file)

论坛徽章:
0
3 [报告]
发表于 2010-10-28 09:24 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
4 [报告]
发表于 2010-10-28 11:39 |只看该作者
  1. awk -v s=0 '
  2. $1==0 {s=0;next}
  3. { if (s==0) {a="Start line:" NR FS $0; s++}
  4.   else {if (s==999) {print a; print "end line:" NR FS $0;s=0}
  5.        else {s++}
  6.      }
  7. }' infile
复制代码

论坛徽章:
0
5 [报告]
发表于 2010-10-28 13:31 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
6 [报告]
发表于 2010-10-28 13:42 |只看该作者
100个允许出现一个0

这是一个很模糊的说法

论坛徽章:
0
7 [报告]
发表于 2010-10-28 14:04 |只看该作者
本帖最后由 sequencing 于 2010-10-28 15:16 编辑

回复 6# ywlscpl


    不好意思,没说清楚,跟5楼的哥们说的差不多
找出这种序列,长度n,(n>=1000),其中>0的个数至少为int(n-n/100+1)个,而且在这个序列中任何连续100项中0出现的次数不超过1

论坛徽章:
0
8 [报告]
发表于 2010-10-28 15:43 |只看该作者
本帖最后由 ywlscpl 于 2010-10-28 21:07 编辑

回复 7# sequencing

try:
边界的处理上有点问题,修正如下
  1. awk 'BEGIN{start=1}$1=="0"{if (NR-last+1<=100) {if (NR-1-start+1>=1000) {printf "%-10s -> %10s\n",start,NR-1;start=NR}else start=last+1}last=NR}END{if (NR-start+1>=1000) printf "%-10s -> %10s\n",start,NR}' file
复制代码

论坛徽章:
0
9 [报告]
发表于 2010-10-28 17:37 |只看该作者
回复 8# ywlscpl


    高手,佩服!
能否说下大概思路,看不大明白,谢谢!

论坛徽章:
0
10 [报告]
发表于 2010-10-28 21:19 |只看该作者
本帖最后由 ywlscpl 于 2010-10-28 21:23 编辑

回复 9# sequencing

要求是:找出这种序列,长度n,(n>=1000),其中非0的个数至少为int(n-n/100+1)个,而且在这个序列中任何连续100项中0出现的次数不超过1

即满足两个条件即可:
1、序列长度>=1000
2、此序列中,任意挑连续100个数,其中出现数为0的次数最多只能为1个
  1. awk 'BEGIN{start=1}$1=="0"{if (NR-last+1<=100) {if (NR-1-start+1>=1000) {printf "%-10s -> %10s\n",start,NR-1;start=NR}else start=last+1}last=NR}END{if (NR-start+1>=1000) printf "%-10s -> %10s\n",start,NR}' file
复制代码
设定序列起始行号为变量start,变量last用于记录当行为0时的行数

对于上面两个条件,既变成:
1、当前行-起始行+1>=1000
2、这个条件的实现其实就是:相邻两个为0的行之间的序列长度必须>100,这样就满足了“任意挑连续100个数,其中出现数为0的次数最多只能为1个”,相邻两个为0的行之间的序列长度:NR-last+1>100,不满足这个条件即 NR-last+1<=100

流程分析:当行为0时($1=="0")
1、条件2不满足了(if (NR-last+1<=100)):判断条件1是否满足(if (NR-1-start+1>=1000) ),满足条件1则打印该序列(print start,NR-1),并置变量start为当前行数NR(新序列的开始);不满足条件1,则置变量start为上一为0行的下一行(新序列开始)。
2、条件2满足:继续当前序列的延续,只需last=NR
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP