免费注册 查看新帖 |

Chinaunix

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

[文本处理] 帮助 组合 提高效率 [复制链接]

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
11 [报告]
发表于 2017-06-10 00:33 |只看该作者
本帖最后由 rubyish 于 2017-06-10 23:14 编辑

shishi biru.c


time tcc -run biru.c a3ym4g8 8 > bmne
# TCC : Tiny C Compiler
  1. real        0m1.420s
  2. user        0m1.284s
  3. sys        0m0.133s
复制代码



gcc -Ofast biru.c -o biru
time ./biru a3ym4g8 8 > bmne
# keyi shishi -O2, -O3, -Ofast
  1. real        0m1.295s
  2. user        0m1.144s
  3. sys        0m0.151s
复制代码



tcc biru.c -o biru
time ./biru a3ym4g8 8 > bmne
  1. real        0m1.407s
  2. user        0m1.250s
  3. sys        0m0.157s
复制代码



wc -l bmne
  1. 6725600 bmne
复制代码




biru.c
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. typedef char kar;
  5. typedef unsigned int Int;
  6. typedef const char KAR;

  7. int main (int parameter, KAR *vektor[]) {
  8.     KAR *corak     = vektor[1];
  9.     int haba       = strlen (corak);
  10.     int ulangi     = parameter == 2 ? haba : atoi (vektor[2]);
  11.     kar neste[128] = { 0 };

  12.     for ( int i = 0; i < haba - 1; i++ )
  13.         neste[(int)corak[i]] = corak[i + 1];
  14.     neste[(int)corak[haba - 1] ] = corak[0];

  15.     kar nulla   = corak[0];
  16.     Int denique = 1;

  17.     for (int woorde = 1; woorde <= ulangi; woorde++ ) {
  18.         denique *= haba;
  19.         Int oinez  = denique;
  20.         int hasita = woorde - 1;
  21.         kar oke[woorde + 1];
  22.         oke[woorde] = 0;
  23.         memset (oke, nulla, woorde);

  24.         while (oinez--) {
  25.             puts (oke);

  26.             for ( int i = hasita; i >= 0; i-- ) {
  27.                 oke[i] = neste[(int)oke[i]];
  28.                 if ( oke[i] != nulla ) break;
  29.             }
  30.         }
  31.     }
  32. } /* main */
复制代码

论坛徽章:
2
综合交流区版块每日发帖之星
日期:2016-07-06 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:00
12 [报告]
发表于 2017-06-10 11:22 |只看该作者
回复 7# elu_ligao

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
13 [报告]
发表于 2017-06-12 12:29 |只看该作者
回复 11# rubyish

兄弟的c也写得登峰造极了,膜拜!!!BigThumb!!!

论坛徽章:
31
程序设计版块每日发帖之星
日期:2016-02-06 06:20:00程序设计版块每日发帖之星
日期:2016-07-20 06:20:00程序设计版块每日发帖之星
日期:2016-07-26 06:20:00每日论坛发贴之星
日期:2016-07-26 06:20:00程序设计版块每日发帖之星
日期:2016-07-27 06:20:00每日论坛发贴之星
日期:2016-07-27 06:20:00程序设计版块每日发帖之星
日期:2016-07-28 06:20:00程序设计版块每日发帖之星
日期:2016-07-29 06:20:00程序设计版块每日发帖之星
日期:2016-08-02 06:20:00程序设计版块每日发帖之星
日期:2016-08-06 06:20:00程序设计版块每日发帖之星
日期:2016-08-08 06:20:00程序设计版块每日发帖之星
日期:2016-08-09 06:20:00
14 [报告]
发表于 2017-06-13 10:07 |只看该作者
本帖最后由 bmne 于 2017-06-14 06:13 编辑

回复 11# rubyish


大牛好

实话,没看懂。拼命地学习好几天。略懂一二后,才敢来

我1楼只是举了个例子,实战中每一行中是字符串,另,文档数据的行是没有重复的。

求助:(参看1楼)
1、假如我的文档数据是a.txt(程序直接接文件参数a.txt,不要求直接接文件中的字符)
2、我的a.txt中的每一行是字符串(不一定是唯一的单一字符)
3、根据指定1楼的要求的组合形式,烦请重新给出一个新的  biru.c

谢谢、谢谢



另,你的楼上的biru.c这个。效率确实厉害,不一样的感觉




论坛徽章:
31
程序设计版块每日发帖之星
日期:2016-02-06 06:20:00程序设计版块每日发帖之星
日期:2016-07-20 06:20:00程序设计版块每日发帖之星
日期:2016-07-26 06:20:00每日论坛发贴之星
日期:2016-07-26 06:20:00程序设计版块每日发帖之星
日期:2016-07-27 06:20:00每日论坛发贴之星
日期:2016-07-27 06:20:00程序设计版块每日发帖之星
日期:2016-07-28 06:20:00程序设计版块每日发帖之星
日期:2016-07-29 06:20:00程序设计版块每日发帖之星
日期:2016-08-02 06:20:00程序设计版块每日发帖之星
日期:2016-08-06 06:20:00程序设计版块每日发帖之星
日期:2016-08-08 06:20:00程序设计版块每日发帖之星
日期:2016-08-09 06:20:00
15 [报告]
发表于 2017-06-13 16:48 |只看该作者


请路过的大牛,驻足看看楼上14楼,帮助下。谢谢





论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
16 [报告]
发表于 2017-06-16 01:21 |只看该作者
回复 14# bmne

shishi beeroute:
./beeroute a.txt 3
./beeroute a.txt 1 6 > save
....

beeroute.c
  1. # include <stdio.h>
  2. # include <stdlib.h>
  3. # include <string.h>
  4. # include <ctype.h>

  5. typedef char kar;
  6. typedef char *str;
  7. typedef unsigned Int;
  8. typedef int my;

  9. str gimme (str);
  10. void die ();
  11. void beeroute (str, int, int);

  12. int main (int parameter, str *vektor) {
  13.     if (parameter < 3) die (vektor[0]);
  14.     str corak  = gimme (vektor[1]);
  15.     int alkaa  = atoi (vektor[2]);
  16.     int pituus = parameter == 4 ? atoi (vektor[3]) : alkaa;
  17.     beeroute (corak, alkaa, pituus);
  18. } /* main */

  19. // ______________________SUB______________________

  20. void beeroute (str corak, int alkaa, int pituus){
  21.     int haba   = strlen (corak);
  22.     kar nulla  = corak[0];
  23.     Int totaal = 1;
  24.     kar neste[128];

  25.     for (my i = 0; i < haba - 1; i++)
  26.         neste[(int)corak[i]] = corak[i + 1];
  27.     neste[(int)corak[haba - 1]] = nulla;

  28.     for (my woorde = 1; woorde <= pituus; woorde++) {
  29.         totaal *= haba;
  30.         if (woorde < alkaa) continue;
  31.         Int oinez  = totaal;
  32.         int hasita = woorde - 1;
  33.         kar oke[woorde + 1];
  34.         oke[woorde] = 0;
  35.         memset (oke, nulla, woorde);

  36.         while (oinez--) {
  37.             puts (oke);

  38.             for (my i = hasita; i >= 0; i--) {
  39.                 oke[i] = neste[(int)oke[i]];
  40.                 if (oke[i] != nulla) break;
  41.             }
  42.         }
  43.     }
  44. } /* beeroute */

  45. str gimme (str skedar) {
  46.     static kar groep[128] = { 0 };
  47.     FILE *fil             = fopen (skedar, "r");

  48. NESTE:
  49.     while (!feof (fil)) {
  50.         kar c = fgetc (fil);
  51.         if (!isalnum (c)) continue;
  52.         kar *g = groep;

  53.         while (*g)
  54.             if (c == *g++) goto NESTE;
  55.         *g = c;
  56.     }

  57.     fclose (fil);
  58.     return groep;
  59. }

  60. void die (str zelf) {
  61.     printf ("use:\n");
  62.     printf ("%s file n\t\t[ n  >= 1 ]\n", zelf);
  63.     printf ("%s file n1 n2\t[ n1 < n2 ]\n", zelf);
  64.     exit (1);
  65. }

复制代码

论坛徽章:
31
程序设计版块每日发帖之星
日期:2016-02-06 06:20:00程序设计版块每日发帖之星
日期:2016-07-20 06:20:00程序设计版块每日发帖之星
日期:2016-07-26 06:20:00每日论坛发贴之星
日期:2016-07-26 06:20:00程序设计版块每日发帖之星
日期:2016-07-27 06:20:00每日论坛发贴之星
日期:2016-07-27 06:20:00程序设计版块每日发帖之星
日期:2016-07-28 06:20:00程序设计版块每日发帖之星
日期:2016-07-29 06:20:00程序设计版块每日发帖之星
日期:2016-08-02 06:20:00程序设计版块每日发帖之星
日期:2016-08-06 06:20:00程序设计版块每日发帖之星
日期:2016-08-08 06:20:00程序设计版块每日发帖之星
日期:2016-08-09 06:20:00
17 [报告]
发表于 2017-06-17 06:45 |只看该作者
本帖最后由 bmne 于 2017-06-17 06:49 编辑

回复 17# rubyish



太牛气了,是真正的大牛啊

这一次非常细致仔细的给出各种方案。完全满足任意需要。大将风度,赞一个!!     另,效率飞快

经典之作!!


谢谢、谢谢、谢谢!!




(悄悄幽默问一句:大牛不喜欢喝啤酒吗?




论坛徽章:
31
程序设计版块每日发帖之星
日期:2016-02-06 06:20:00程序设计版块每日发帖之星
日期:2016-07-20 06:20:00程序设计版块每日发帖之星
日期:2016-07-26 06:20:00每日论坛发贴之星
日期:2016-07-26 06:20:00程序设计版块每日发帖之星
日期:2016-07-27 06:20:00每日论坛发贴之星
日期:2016-07-27 06:20:00程序设计版块每日发帖之星
日期:2016-07-28 06:20:00程序设计版块每日发帖之星
日期:2016-07-29 06:20:00程序设计版块每日发帖之星
日期:2016-08-02 06:20:00程序设计版块每日发帖之星
日期:2016-08-06 06:20:00程序设计版块每日发帖之星
日期:2016-08-08 06:20:00程序设计版块每日发帖之星
日期:2016-08-09 06:20:00
18 [报告]
发表于 2017-06-19 07:38 |只看该作者
本帖最后由 bmne 于 2017-06-19 07:45 编辑

回复 17# rubyish


大牛好,今早试了一下,好像有问题啊

比如:我的文件数据是a.txt
a.txt
  1. wanju
  2. E23H
  3. 456
  4. 7
复制代码

比如要求:只输出上述四个字符串的组合

我要求的正确结果应该是这样的(只表示其中一部分,明白即可):
  1. wanjuE23H4567
  2. 7E23Hwanju456
  3. 456wanjuE23H7
  4. E23H456wanju7
  5. ......

复制代码

然而,用你的脚本,却输出的是:(看截图)。也就是说问题是,还没有按照要求进行字符串组合

1.jpg (12.25 KB, 下载次数: 14)

1.jpg

论坛徽章:
31
程序设计版块每日发帖之星
日期:2016-02-06 06:20:00程序设计版块每日发帖之星
日期:2016-07-20 06:20:00程序设计版块每日发帖之星
日期:2016-07-26 06:20:00每日论坛发贴之星
日期:2016-07-26 06:20:00程序设计版块每日发帖之星
日期:2016-07-27 06:20:00每日论坛发贴之星
日期:2016-07-27 06:20:00程序设计版块每日发帖之星
日期:2016-07-28 06:20:00程序设计版块每日发帖之星
日期:2016-07-29 06:20:00程序设计版块每日发帖之星
日期:2016-08-02 06:20:00程序设计版块每日发帖之星
日期:2016-08-06 06:20:00程序设计版块每日发帖之星
日期:2016-08-08 06:20:00程序设计版块每日发帖之星
日期:2016-08-09 06:20:00
19 [报告]
发表于 2017-06-19 07:54 |只看该作者
回复 17# rubyish

效率没的说。组合1.5GB左右的结果,按秒算。确实厉害


论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
20 [报告]
发表于 2017-06-20 00:24 |只看该作者
回复 19# bmne

shishi martii:

martii.c
  1. # include <stdio.h>
  2. # include <stdlib.h>
  3. # include <string.h>
  4. # include <ctype.h>

  5. typedef char kar;
  6. typedef char *str;
  7. typedef unsigned Int;
  8. typedef int my;

  9. str* gimme (str);
  10. void die ();
  11. void martii (str*, int, int);

  12. int main (int para, str *vektor) {

  13.     if (para < 3) die (vektor[0]);
  14.     str *corak = gimme (vektor[1]);
  15.     int alkaa  = atoi (vektor[2]);
  16.     int pituus = para == 4 ? atoi (vektor[3]) : alkaa;
  17.     martii (corak, alkaa, pituus);
  18. } /* main */

  19. // ______________________SUB______________________

  20. void martii (str *corak, int alkaa, int pituus) {
  21.     static int lengde[256];
  22.     int haba = 0;

  23.     while (corak[haba++] != NULL)
  24.         lengde[haba - 1] = strlen (corak[haba - 1]);
  25.     haba -= 1;

  26.     int maks   = haba;
  27.     Int totaal = 1;

  28.     for (my woorde = 1; woorde <= pituus; woorde++) {
  29.         totaal *= haba;
  30.         if (woorde < alkaa) continue;
  31.         Int oinez  = totaal;
  32.         int hasita = woorde - 1;
  33.         int oke[woorde];
  34.         memset (oke, 0, woorde * sizeof(int));
  35.         static kar sosei[256] = { 0 };
  36.         int posisie[woorde + 1];
  37.         posisie[0] = 0;
  38.         int eniro = 0;

  39.         while (oinez--) {
  40.             for (my i = eniro; i < woorde; i++) {
  41.                 int aantal = lengde[oke[i]];
  42.                 memcpy (sosei + posisie[i], corak[oke[i]], aantal);
  43.                 posisie[i + 1] = posisie[i] + aantal;
  44.             }

  45.             sosei[posisie[woorde]] = 0;
  46.             puts (sosei);

  47.             for (eniro = hasita; eniro >= 0; eniro--) {
  48.                 if (++oke[eniro] < maks) break;
  49.                 else oke[eniro] = 0;
  50.             }
  51.         }
  52.     }
  53.     while (*corak) free (*corak++);
  54. } /* martii */

  55. str * gimme (str skedar) {
  56.     static str elfen[256] = { 0 };
  57.     kar laina[36];
  58.     FILE *fil   = fopen (skedar, "r");
  59.     int posisie = 0;

  60.     while (fgets (laina, 36, fil) != NULL) {
  61.         int lengde = strlen (laina);
  62.         int hale   = laina[lengde - 2] == '\r' ? 2 : 1;
  63.         laina[lengde - hale] = 0;
  64.         elfen[posisie++]     = strdup (laina);
  65.     }
  66.     fclose (fil);
  67.     return elfen;
  68. }

  69. void die (str zelf) {
  70.     printf ("use:\n");
  71.     printf ("%s file n\t\t[ n  >= 1 ]\n", zelf);
  72.     printf ("%s file n1 n2\t[ n1 < n2 ]\n", zelf);
  73.     exit (1);
  74. }

复制代码

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP