找出两个将近十万多条记录的文件中的不同记录
来源:互联网 发布:尚硅谷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