C++ 查找算法???

addfourliu 2012-12-27 04:40:50
我现在有两个文件,每个文件中都有100条记录,数据是无序的,也可以把这两个文件看成是excel的两列

我想进行记录比对,看看这两个文件中的记录是不是全部相等

当然,最常规的算法就是从一个文件中去记录,去另一个文件中查找,用两个for循环就可以实现,但是此时的执行效率为O(n²),数据量大的时候效果不是很好,有没有更快的算法呢?
...全文
171 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
stereoMatching 2012-12-27
  • 打赏
  • 举报
回复
其中一列不允许排序? 那就如mmhaojie的建议,用hash table吧 hash table和排序没有什么关系 他是靠hash function来决定你的元素要插在那个位置 c++11已经提供了hash table header file是<unordered_set> 编译器不支援的话,可以先用boost的顶着 google也有提供自己的hash table 再不然就自己动手写一个简单的
oniisama 2012-12-27
  • 打赏
  • 举报
回复
unorderset 你的不二选择
prajna 2012-12-27
  • 打赏
  • 举报
回复
全部读入vector 然后sort 最后compare
码农写博客 2012-12-27
  • 打赏
  • 举报
回复
引用 5 楼 addfourliu 的回复:
引用 2 楼 mmhaojie 的回复: 用hashmap,算法效率直接到O(n) 空间复杂度为其中一个文件的大小。 可是其中一个是不允许排序的。。。
晕,,hashmap排毛序啊,,去看下hashmap的知识
赵4老师 2012-12-27
  • 打赏
  • 举报
回复
仅供参考
//输出PROG中有但LIST中没有的文本行,即集合PROG-LIST
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <search.h>
#define MAXCHARS 512
int MAXLINES=10000,MAXLINES2;
char *buf,*buf2;
char PROG[256]="PROG";//程序Program需要的文件列表
char LIST[256]="LIST";//dir /b /s生成的实际文件列表List
FILE *fp,*fl;
int i,c,n,L,hh;
int ignore_case=0;
char ln[MAXCHARS];
int icompare(const void *arg1,const void *arg2) {
   return stricmp((char *)arg1,(char *)arg2);
}
int compare(const void *arg1,const void *arg2) {
   return strcmp((char *)arg1,(char *)arg2);
}
int main(int argc,char **argv) {
    if (argc>1) strcpy(PROG,argv[1]);//命令行参数1覆盖PROG
    if (argc>2) strcpy(LIST,argv[2]);//命令行参数2覆盖LIST
    if (argc>3) ignore_case=1;//若存在命令行参数3,忽略大小写
    if ((fl=fopen(LIST,"rt"))==NULL) {
        fprintf(stderr,"Can not open %s\n",LIST);
        fprintf(stderr,"Usage: %s [PROG] [LIST] [-i]\n",argv[0]);
        return 1;
    }
    if ((fp=fopen(PROG,"rt"))==NULL) {
        fclose(fl);
        fprintf(stderr,"Can not open %s\n",PROG);
        fprintf(stderr,"Usage: %s [PROG] [LIST] [-i]\n",argv[0]);
        return 2;
    }
    buf=(char *)malloc(MAXLINES*MAXCHARS);
    if (NULL==buf) {
        fclose(fl);
        fclose(fp);
        fprintf(stderr,"Can not malloc(%d LINES*%d CHARS)!\n",MAXLINES,MAXCHARS);
        return 4;
    }
    n=0;
    hh=0;
    i=0;
    while (1) {
        if (fgets(ln,MAXCHARS,fl)==NULL) break;//
        hh++;
        L=strlen(ln)-1;
        if ('\n'!=ln[L]) {//超长行忽略后面内容
            fprintf(stderr,"%s Line %d too long(>%d),spilth ignored.\n",LIST,hh,MAXCHARS);
            while (1) {
                c=fgetc(fl);
                if ('\n'==c || EOF==c) break;//
            }
        }
        while (1) {//去掉行尾的'\n'和空格
            if ('\n'==ln[L] || ' '==ln[L]) {
                ln[L]=0;
                L--;
                if (L<0) break;//
            } else break;//
        }
        if (L>=0) {
            strcpy(buf+i,ln);i+=MAXCHARS;
            n++;
            if (n>=MAXLINES) {
                MAXLINES2=MAXLINES*2;
                if (MAXLINES2==1280000) MAXLINES2=2500000;
                buf2=(char *)realloc(buf,MAXLINES2*MAXCHARS);
                if (NULL==buf2) {
                    free(buf);
                    fclose(fl);
                    fclose(fp);
                    fprintf(stderr,"Can not malloc(%d LINES*%d CHARS)!\n",MAXLINES2,MAXCHARS);
                    return 5;
                }
                buf=buf2;
                MAXLINES=MAXLINES2;
            }
        }
    }
    fclose(fl);
    if (ignore_case) qsort(buf,n,MAXCHARS,icompare);
    else qsort(buf,n,MAXCHARS,compare);
    hh=0;
    while (1) {
        if (fgets(ln,MAXCHARS,fp)==NULL) break;//
        hh++;
        L=strlen(ln)-1;
        if ('\n'!=ln[L]) {//超长行忽略后面内容
            fprintf(stderr,"%s Line %d too long(>%d),spilth ignored.\n",PROG,hh,MAXCHARS);
            while (1) {
                c=fgetc(fp);
                if ('\n'==c || EOF==c) break;//
            }
        }
        while (1) {//去掉行尾的'\n'和空格
            if ('\n'==ln[L] || ' '==ln[L]) {
                ln[L]=0;
                L--;
                if (L<0) break;//
            } else break;//
        }
        if (L>=0) {
            if (ignore_case) {
                if (NULL==bsearch(ln,buf,n,MAXCHARS,icompare)) printf("%s\n",ln);
            } else {
                if (NULL==bsearch(ln,buf,n,MAXCHARS,compare)) printf("%s\n",ln);
            }
        }
    }
    fclose(fp);
    free(buf);
    return 0;
}
提醒:如果A-B为空且B-A为空则说明A和B相等。
addfourliu 2012-12-27
  • 打赏
  • 举报
回复
引用 3 楼 stereoMatching 的回复:
先对两列数据进行排序,然后再一一比较 2 * O(nlogn) + O(n) = O(nlogn) C/C++ code?123std::sort(std::begin(data1), std::end(data1));std::sort(std::begin(data2), std::end(data2));bool is_equal = std::equal(……
可是其中一个是不允许排序的。。。
addfourliu 2012-12-27
  • 打赏
  • 举报
回复
引用 2 楼 mmhaojie 的回复:
用hashmap,算法效率直接到O(n) 空间复杂度为其中一个文件的大小。
可是其中一个是不允许排序的。。。
addfourliu 2012-12-27
  • 打赏
  • 举报
回复
引用 1 楼 icechenbing 的回复:
各自排序,然后比对。
可是其中一个是不允许排序的。。。
stereoMatching 2012-12-27
  • 打赏
  • 举报
回复
先对两列数据进行排序,然后再一一比较 2 * O(nlogn) + O(n) = O(nlogn)

std::sort(std::begin(data1), std::end(data1));
std::sort(std::begin(data2), std::end(data2));
bool is_equal = std::equal(std::begin(data1), std::end(data1), std::begin(data2));
如果编译器还不支援std::begin(), std::end()(c++11才有),可以用传统的方法 data1.begin(), data1.end() array的话就用 data1, data1 + sizeof(data1) / sizeof(array的type)
码农写博客 2012-12-27
  • 打赏
  • 举报
回复
用hashmap,算法效率直接到O(n) 空间复杂度为其中一个文件的大小。
恨天低 2012-12-27
  • 打赏
  • 举报
回复
各自排序,然后比对。

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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