关于文件比较请教算法思路。。。

casio 2005-07-20 08:10:43
假设有两个文本文件,其中一个a.txt内容如下

123
321
569
888
...

b.txt 内容如下:

123
321
777
569
125
...

a.txt和b.txt行数不固定。请问有什么好的算法实现更快找出在a.txt中有却不存在于b.txt中的888 以及存在于b.txt而不存在于a.txt中的777、125?

...全文
386 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
pure_flame 2005-07-20
  • 打赏
  • 举报
回复
将文件A,B的内容装进容器,使用set_difference算法
casio 2005-07-20
  • 打赏
  • 举报
回复
楼上的想法有道理。之前我都采用的内部排序,所以要循环多次得出结果,如果采用外部排序分别对A.TXT和B.TXT排序,然后采用类似归并排序的算法,效率应该会提高不少。先这样了,谢谢大家。
boxban 2005-07-20
  • 打赏
  • 举报
回复
to: casio(天意)
有一个比较笨的办法,首先是对A.TXT和B.TXT分别排序,然后定义两个结构数组S1、S2,假设数组长度为N,文件行数为M,分别在A.TXT和B.TXT取出N行存入结构数组中,然后对S1,S2折半比较,此操作循环M/N次,完成对两个文件的比较。不过速度太慢。很是郁闷。请教有什么效率高的好办法?
=============================
我觉得你的思路很好呀(前半部 ;p)!
首先将A.TXT和B.TXT的内容“按行”分别排序(如果文件太大,可以考虑外部排序)。
排序以后可以对两个序列进行一次类似归并排序的处理.

这仅需要一趟遍历


zhangcloud 2005-07-20
  • 打赏
  • 举报
回复
mark
casio 2005-07-20
  • 打赏
  • 举报
回复
楼上的哥哥,用c++STL的算法是可以的。有好的方法么?
laomai 2005-07-20
  • 打赏
  • 举报
回复
先问一下,如果用c++STL的算法可不可以?
laomai 2005-07-20
  • 打赏
  • 举报
回复
先留名,回头找人看,呵呵
casio 2005-07-20
  • 打赏
  • 举报
回复
有一个比较笨的办法,首先是对A.TXT和B.TXT分别排序,然后定义两个结构数组S1、S2,假设数组长度为N,文件行数为M,分别在A.TXT和B.TXT取出N行存入结构数组中,然后对S1,S2折半比较,此操作循环M/N次,完成对两个文件的比较。不过速度太慢。很是郁闷。请教有什么效率高的好办法?
积木 2005-07-20
  • 打赏
  • 举报
回复
我先去吐吐血……
casio 2005-07-20
  • 打赏
  • 举报
回复
楼上的方法很好,值得参考,可用于数字不是很大时的情况。但是我的数字是很变态的。举一个比较实际一点的例子:

A.TXT

3103790 037763214268 204 02005052121084320050521220629 3466
3173992 179090536839118 115 02005052122221320050521222321 68
3103961 037167785746 204 02005052122245820050521222733 155
3102751 03948300988 204 02005052122394120050521224247 186
3102839 01082162694 204 02005052123374020050521234404 384
.....

A.TXT

3103790 037763214268 204 02005052121084320050521220629 3466
3173992 179090536839118 115 02005052122221320050521222321 68
3103961 037167785746 204 02005052122245820050521222733 155
3102751 03948300988 204 02005052122394120050521224247 186
3102839 01082162694 204 02005052123374020050521234404 384
1111111 222222222222 333 44444444444444444444444444444 555
....

两个文件都有几千万行,处理这样一个文件,用楼上的方法可能还是有点问题。请问有什么更好的建议吗?
积木 2005-07-20
  • 打赏
  • 举报
回复
。。。居然还有数字以外的东西,发帖子的时候没有看到……
积木 2005-07-20
  • 打赏
  • 举报
回复
本思路试用于里面的数字不是很变态的情况下。例如,就是你的三位数字。
首先取得文件a.txt和b.txt的最大数字 m,n。
申请一个内存空间 a[m] 用来统计文件a.txt中存在哪些数字,
比如你可以得到
a[123]=1;就是a.txt中有一个123。a[100]=0;因为a.txt中没有100。

然后呢,就用b.txt中的数字去a中寻找。

比如b中的123。因为a[123]=1,所以,123这个数字在a.txt和b.txt中同时存在。这个时候将a[123]修正为2。证明这两个数字在a.txt和b.txt中同时存在。

而b中的 888,因为a[888]=0;所以这个数字在a中不存在而在b中存在,直接输出就可以了。

当b中的数字都检测结束后,回头看看数组a中还有什么位置为1,输出这些为1的元素的位置,他们都是在a.txt中存在而在b.txt中不存在的。

这个方法的优点就是查找速度快,因为直接用数组查找,几乎可以说是零代价。缺点就是比较浪费内存空间。做一次初始化是线性的时间(a.txt文件越大,初始化时间越长,当然这是任何对任何方法来说,都是必要的代价。)
casio 2005-07-20
  • 打赏
  • 举报
回复
看来要举个实际例子来说说
第一个文件
<html>
<head>
<tltle>123</title>
</head>
<body>
abc
777
</body>
</html>
第二个文件
<html>
<head>
<tltle>123</title>
</head>
<body>
abc888
777
999
</body>
</html>
可以看到第二个文件的abc后面多了个888
而且777下面多了一行999 通过程序怎么找到这两个变化
如果采用行比较的话因为第二个文件多了一行和第一行没法对应?所以即使勉强比较则会把第一个文件的</body>和第二个文件的999相比较,这当然不是我想要的结果,因为第二个文件实际有</body>, 我想要的结果是 把888 和 999这个两个变化的内容提出来。请高手代码指点啊
FBIq 2005-07-20
  • 打赏
  • 举报
回复
(fp1..
(fp2..
FBIq 2005-07-20
  • 打赏
  • 举报
回复
flag=0;
fscanf(fp,"%d",&n);
while(fscanf(fp,"%d",&t)!=NULL)
if(t==n)
flag=1;

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧