用C\C++怎么实现两个大型文件的比较?效率高点的

F_vamprie 2011-03-28 09:17:57
两个30M文件,文件行数不定,需要比较每行字符串是否相同,相同的存到一个文件中,不同的存到另一个文件中。我做的是按行循环读取用一一进行比较,但效率太低,运行一边得2个多小时,请高手指点!用简单的代码更好,非常感谢,最好用C语言,C++我不太懂。在线等,急!
...全文
783 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
Zhhmily 2011-03-29
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 ischarles 的回复:]
你的算法复杂度是O(n!),n是行数
用以下算法可以在O(nlogn)的时间复杂度内完成:
1 按照行首字母顺序排序两个文件的每一行:O(nlogn)
2 遍历第一个文件的每行,并用二分查找找到与第二个文件相同的行数:O(logn)
查找比较总共的复杂度是O(nlogn).

因此该算法总共的复杂度是O(nlogn)
[/Quote]

赞同
hongwenjun 2011-03-29
  • 打赏
  • 举报
回复
typedef vector<string>::const_iterator vs_itr;
//函数申明
bool findkey(vs_itr beg, vs_itr end, const string &key)
{
string::size_type pos;
while (beg != end) {
pos = (*beg).find(key);
if (pos != string::npos)
return true;
beg++;
}
return false;
}


//调用
if (findkey(vec_winfun.begin(), vec_winfun.end(), *iter)) { // 测试 Key 是否在容器里
found_key.push_back(*iter);
}

如果不是行对行对应,这样用就比较吃力
如果每行都比较长,可以把每行 都生成 hash,然后比较 hash
这样数据量,效率会高点

[Quote=引用 8 楼 f_vamprie 的回复:]

不同行,而且每一行都需要比较类似于两个for循环的比较,例:for(i=0;i<strlen(file1);i++)
.......
{
……
[/Quote]
qiang81020 2011-03-29
  • 打赏
  • 举报
回复
busybox --> diff源代码
pathuang68 2011-03-29
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 f_vamprie 的回复:]

得在windows下操作
[/Quote]
有windiff
ischarles 2011-03-29
  • 打赏
  • 举报
回复
1 按照每行点分隔后的字符串的字母顺序排序存入一个数组:O(nlogn)
2 遍历第一个数组,并用二分查找找到与第二个数组比较:O(logn)
查找比较总共的复杂度是O(nlogn).
赵4老师 2011-03-29
  • 打赏
  • 举报
回复
system("fc 文件1 文件2 >文件3");
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……
hongwenjun 2011-03-29
  • 打赏
  • 举报
回复
http://blogold.chinaunix.net/u2/82382/showart.php?id=2072959
知道到了点资料
#include <map>
#include <string>
using namespace std;
...
map<string, string> namemap;

//增加。。。
namemap["岳不群"]="华山派掌门人,人称君子剑";
namemap["张三丰"]="武当掌门人,太极拳创始人";
namemap["东方不败"]="第一高手,葵花宝典";
...

//查找。。
if(namemap.find("岳不群") != namemap.end()){
...
}


hongwenjun 2011-03-29
  • 打赏
  • 举报
回复
挺有挑战性的,说下我的想法,不知道是否可以实现
30M 文件A 算30字节一行 1M行数
30M 文件B 算30字节一行 1M行数
分别生成每行的 hash值,分别装到 vec_hash 和 vec_hash_key 容器.
hash的好处是等长,遍历比较效率高
wbruce 2011-03-28
  • 打赏
  • 举报
回复
unix下用diff,windows下就用beyond compare
F_vamprie 2011-03-28
  • 打赏
  • 举报
回复
其实我还得把读取出来的每行进行“,”分割,比较的是分割后其中的几部分
ischarles 2011-03-28
  • 打赏
  • 举报
回复
你也可以装cygin,这样可以在windows下用diff.
或者用powershell, 输入比如:
compare-object (get-content one.txt) (get-content two.txt)
之类的指令来比较
ischarles 2011-03-28
  • 打赏
  • 举报
回复
你的算法复杂度是O(n!),n是行数
用以下算法可以在O(nlogn)的时间复杂度内完成:
1 按照行首字母顺序排序两个文件的每一行:O(nlogn)
2 遍历第一个文件的每行,并用二分查找找到与第二个文件相同的行数:O(logn)
查找比较总共的复杂度是O(nlogn).

因此该算法总共的复杂度是O(nlogn)
F_vamprie 2011-03-28
  • 打赏
  • 举报
回复
我的开发环境是在windows下的,那个可能行,但不让我用呵呵,谢谢你
qq120848369 2011-03-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 bluesky12312388 的回复:]

引用 3 楼 qq120848369 的回复:

放到LNIUX下,用啥命令就比较出来了,记不起来

diff
[/Quote]

恩,就这个。楼主可以去体验一下。
F_vamprie 2011-03-28
  • 打赏
  • 举报
回复
不同行,而且每一行都需要比较类似于两个for循环的比较,例:for(i=0;i<strlen(file1);i++)
.......
{
for(i=0;i<strlen(file2);i++)
.......
}
这样的比较,你的意思是都读到容器里在一一比较吗?
hongwenjun 2011-03-28
  • 打赏
  • 举报
回复
[Quote=引用楼主 f_vamprie 的回复:]
两个30M文件,文件行数不定,需要比较每行字符串是否相同,相同的存到一个文件中,不同的存到另一个文件中。我做的是按行循环读取用一一进行比较,但效率太低,运行一边得2个多小时,请高手指点!用简单的代码更好,非常感谢,最好用C语言,C++我不太懂。在线等,急!
[/Quote]
C++ 简单点 把两个 30M 文件分别 读到容器里, vecAF vecBF 大概要使用 100M-150M 内存
两个文件行数一样的吧, 相同行和相同行比较 就简单了,再 建立另个容器 vceOK vecNO两个容器 70M内存
总共 200M内存就可以拿下程序了
hongwenjun 2011-03-28
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20110328/19/ace9d89a-88c7-4721-9d83-574b56c7564b.html?95679
看下我昨天刚写,第四张图
F_vamprie 2011-03-28
  • 打赏
  • 举报
回复
得在windows下操作
bluesky12312388 2011-03-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 qq120848369 的回复:]

放到LNIUX下,用啥命令就比较出来了,记不起来
[/Quote]
diff
qq120848369 2011-03-28
  • 打赏
  • 举报
回复
放到LNIUX下,用啥命令就比较出来了,记不起来
加载更多回复(2)

70,037

社区成员

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

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