找出两个将近十万多条记录的文件中的不同记录

来源:互联网 发布:尚硅谷java视频 编辑:程序博客网 时间:2024/05/23 11:49
% Author:shizhixin% Email:szhixin@gmail.com% Blog:http://blog.csdn.net/shizhixin% Date:2012-05-29% 实验记录:% 找出两个文件a,b中不同的记录,文件中记录的个数分别为m,n% 方法一:最直接的方法是通过两重循环,这样时间复杂度O(m*n)% 方法二:先进行快速排序,然后通过折半查找的方式找到记录% 方法三:先快速排序,然后类似链表的合并操作,利用两个指针移动核对相同记录% % 本实验采取的是方法三,开始用方法一,程序跑了一晚都没完,这个算法基本上就是分钟级别。% 试验中主要因为两个文件很大程度上是相似的,不同的记录大概只有几百条,而且m几乎等于n,% 所以用这个方法应该是最好的。% % 思考:% 如果m<<n,我想应该用方法二最好,可以先对b文件进行快速排序,然后对于a中的每个% 记录进行折半查找。% % 程序说明:% output.csv:中存放的是如下类型数据:% 51602266657% 516022661469% ...% fits文件夹下都是fit文件,文件格式为:% spSpec-51602-0266-065.fit% 程序完成的功能是通过比对csv文件中的前三列与fits文件夹下的文件名中的数字,% 选取csv中有但是fits中没有的记录存在diffa中% 选取fits中有但是csv中没有的记录存在diffb中。%  ticclear;clcb=csvread('output.csv');b = b(:,1:3);files=dir('fits\*.fit');t=1;numhave=size(files,1);a = zeros(numhave, 3);for i = 1:numhave    a(i,1)=str2num(files(i).name(8:12));    a(i,2)=str2num(files(i).name(14:17));    a(i,3)=str2num(files(i).name(19:21));enddiffa = zeros(900,3);diffb = zeros(900,3);posfa = 1;posfb = 1;i=1;j=1;while i<=numhave & j<=size(b,1)    % for i=1:numhave%a    % for j=1:size(b,1)%b    i    j    r = cmp3(a(i,:),b(j,:));    switch r        case 1 %a>b            diffb(posfb,:) = b(j,:);            posfb = posfb + 1;            j = j+1;        case -1            diffa(posfa,:) = a(i,:);            posfa = posfa + 1;            i = i+1;        case 0            i = i+1;            j = j+1;    end    % end    % endendif i>numhave    remain = size(b,1)-j+1;    diffb(posfb:posfb+remain-1, :) = b(j:end, :);else    remain = size(a,1)-i+1;    diffa(posfa:posfa+remain-1, :) = a(i:end, :);endtoc% Author:shizhixin% Email:szhixin@gmail.com% Blog:http://blog.csdn.net/shizhixin% Date:2012-05-29% 比较array_a和array_b的大小% array_a和array_b都是三个数组成的,% 比较的大小优先顺序是从第一个到第三个,如果前面有大的,% 后面不做判断。如:[51 2 8] > [50 9 100]% 三个数字一样才是相等,返回0,array_a>array_b 返回1,否则返回-1function result = cmp3(array_a, array_b)switch cmp2(array_a(1),array_b(1))    case 1        result = 1;    case -1        result = -1;    otherwise        switch cmp2(array_a(2),array_b(2))            case 1                result = 1;            case -1                result = -1;            otherwise                switch cmp2(array_a(3),array_b(3))                    case 1                        result = 1;                    case -1                        result = -1;                    otherwise                        result = 0;                end        endendend%比较两个数大小function r = cmp2(a, b)if a > b    r = 1;elseif a < b    r = -1;else    r = 0;endend


原创粉丝点击