免费注册 查看新帖 |

Chinaunix

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

[C] 含泪求助帮我改改C程序,提高处理数据效率 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2008-12-19 09:48 |只看该作者
#! /usr/bin/perl

# redspid@gmail.com    20060829

use warnings;
use strict;

my %statistics = ();
chomp(my $file = $ARGV[0]);

open(FILE, "$file") or die $!;
while (<FILE>) {
&nbsp;&nbsp;&nbsp;&nbsp;chomp;
&nbsp;&nbsp;&nbsp;&nbsp;if (defined($statistics{$_}))
&nbsp;&nbsp;&nbsp;&nbsp;{ $statistics{$_} ++ }
&nbsp;&nbsp;&nbsp;&nbsp;else { $statistics{$_} = 1 }
}
close FILE;

while (my ($a, $b) = each(%statistics)) {
&nbsp;&nbsp;&nbsp;&nbsp;if ($b > 1) { print "$a --> $b\n" }
}

论坛徽章:
0
22 [报告]
发表于 2008-12-19 10:38 |只看该作者
原帖由 hellioncu 于 2008-12-19 09:15 发表



你的代码问题实在比较多。
1、一个文件读了两次,实在浪费,如果早的编译器都不会支持char Str[50]的。建议先获取文件大小,申请足够的内存,一次性读取,或者改用mmap
2、memset、memcpy、strlen之类太 ...



大哥,能不能帮我改下代码,小弟,我刚入手C,好多东西都不懂

论坛徽章:
0
23 [报告]
发表于 2008-12-19 10:45 |只看该作者
原帖由 duanjigang 于 2008-12-19 09:27 发表
用二叉树存储,每次读取一行遍历树查找,读完时遍历一遍树,打印信息,这样的方法试过没有?

正好这几天用二叉树,顺便做一个给你,具体时间我没测试,感觉还挺快的,你可以试试
不过看你的email都是sina的,所以做了个特殊处理。希望能对你有用。
//duanjigang@2008-12-19 for test

#include <stdio.h>
#define NAME_LEN 128
#define MAX_MAIL 100000
typedef struct _mail
{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char name[128];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int  num;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int len;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned int&nbsp;&nbsp;&nbsp;&nbsp;left;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned int&nbsp;&nbsp;&nbsp;&nbsp;right;
}mail;
mail mail_list[MAX_MAIL];
int&nbsp;&nbsp;&nbsp;&nbsp;m_index = 0;
int insert_tree(mail* tree, mail *node);
int main(int argc, char* argv[])
{

&nbsp;&nbsp;&nbsp;&nbsp;if(argc != 2)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("usuage:%s file\n", argv[0]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FILE * fp = NULL;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int i = 0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((fp = fopen(argv[1], "r"))== NULL)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("open file %s fail\n", argv[1]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(fgets(mail_list[m_index].name, NAME_LEN - 1, fp))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char* p = mail_list[m_index].name;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while((*p != '\n') &&(*p != '@'))p++;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if(*p == '@')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   {   
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*p = 0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mail_list[m_index].len = p - mail_list[m_index].name;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mail_list[m_index].num = 1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_index++;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   }

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(fgets(mail_list[m_index].name, NAME_LEN - 1, fp))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char* p = mail_list[m_index].name;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while((*p != '\n') &&(*p != '@'))p++;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(*p == '@')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*p = 0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mail_list[m_index].num = 1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mail_list[m_index].len = p - mail_list[m_index].name;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!insert_tree(mail_list, &mail_list[m_index]))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_index++;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fclose(fp);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i = 0; i < m_index; i++)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(mail_list[i].num > 1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%d: %s@sina.com\n", mail_list[i].num, mail_list[i].name);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
}
int insert_tree(mail* tree, mail* node)
{
&nbsp;&nbsp;&nbsp;mail* p = tree, *par = tree;
&nbsp;&nbsp;&nbsp;int len = tree->len;
&nbsp;&nbsp;&nbsp;if(len < node->len)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   len = node->len;
&nbsp;&nbsp;&nbsp;while(p)
&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(strncmp(p->name, node->name, len) < 0)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;par = p;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = p->left;
&nbsp;&nbsp;&nbsp;&nbsp;}else
&nbsp;&nbsp;&nbsp;&nbsp;if(strncmp(p->name, node->name, len) > 0)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;par = p;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = p->right;
&nbsp;&nbsp;&nbsp;&nbsp;}else
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p->num++;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//printf("%d %s\n", p->num, p->name);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 1;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;if(strncmp(par->name, node->name, len) < 0)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;par->left = node;
&nbsp;&nbsp;&nbsp;&nbsp;}else
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;par->right = node;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}

gcc test.c -o test
./test  fileName > out

论坛徽章:
0
24 [报告]
发表于 2008-12-19 10:56 |只看该作者
原帖由 redspider 于 2008-12-19 09:48 发表
#! /usr/bin/perl

# redspid@gmail.com    20060829

use warnings;
use strict;

my %statistics = ();
chomp(my $file = $ARGV[0]);

open(FILE, "$file" or die $!;
while ...



这种问题果然还是perl好使

论坛徽章:
0
25 [报告]
发表于 2008-12-19 10:57 |只看该作者
LZ的程序主要在两个地方有问题
1。 最后那个2重循环 是没有必要的可以先排序再扫描一边就可以了 或者用set 或hash
2。 为了取文件行数扫描了一遍文件有些太奢侈了 呵呵。
可以先估计一下输入的规模 预先分配一块大的空间。

论坛徽章:
0
26 [报告]
发表于 2008-12-19 11:02 |只看该作者
原帖由 duanjigang 于 2008-12-19 10:45 发表

正好这几天用二叉树,顺便做一个给你,具体时间我没测试,感觉还挺快的,你可以试试
不过看你的email都是sina的,所以做了个特殊处理。希望能对你有用。
//duanjigang@2008-12-19 for test

#include
# ...


大哥,编译时出错了
  1. [root@test ~]# gcc -o user user.c
  2. user.c: In function `insert_tree':
  3. user.c:84: warning: assignment makes pointer from integer without a cast
  4. user.c:89: warning: assignment makes pointer from integer without a cast
  5. user.c:100: warning: assignment makes integer from pointer without a cast
  6. user.c:103: warning: assignment makes integer from pointer without a cast
复制代码



555555

论坛徽章:
0
27 [报告]
发表于 2008-12-19 11:05 |只看该作者
个人感觉
hash一下效率会高,而且代码写起来比较简单

论坛徽章:
0
28 [报告]
发表于 2008-12-19 11:17 |只看该作者
原帖由 zdxvv 于 2008-12-19 11:05 发表
个人感觉
hash一下效率会高,而且代码写起来比较简单

hash 我不会用,555555

论坛徽章:
0
29 [报告]
发表于 2008-12-19 13:09 |只看该作者
原帖由 大血落弯刀 于 2008-12-19 11:17 发表

hash 我不会用,555555



可以先把它压成一个md5的值,然后Hash一下.输出.可以用strstr()取字符用用户名.个人想法.

论坛徽章:
0
30 [报告]
发表于 2008-12-19 14:40 |只看该作者
原帖由 大血落弯刀 于 2008-12-19 11:02 发表


大哥,编译时出错了
[root@test ~]# gcc -o user user.c
user.c: In function `insert_tree':
user.c:84: warning: assignment makes pointer from integer without a cast
user.c:89: warning: assignm ...

加上类型转换,警告错去掉
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP