% Author:shizhixin % Email:[email protected] % Blog:https://blog.csdn.net/shizhixin % Date:2012-05-29 % 实验记录: % 找出两个文件a,b中不同的记录,文件中记录的个数分别为m,n % 方法一:最直接的方法是通过两重循环,这样时间复杂度O(m*n) % 方法二:先进行快速排序,然后通过折半查找的方式找到记录 % 方法三:先快速排序,然后类似链表的合并操作,利用两个指针移动核对相同记录 % % 本实验采取的是方法三,开始用方法一,程序跑了一晚都没完,这个算法基本上就是分钟级别。 % 试验中主要因为两个文件很大程度上是相似的,不同的记录大概只有几百条,而且m几乎等于n, % 所以用这个方法应该是最好的。 % % 思考: % 如果m<<n,我想应该用方法二最好,可以先对b文件进行快速排序,然后对于a中的每个 % 记录进行折半查找。 % % 程序说明: % output.csv:中存放的是如下类型数据: % 51602 266 65 7 % 51602 266 146 9 % ... % fits文件夹下都是fit文件,文件格式为: % spSpec-51602-0266-065.fit % 程序完成的功能是通过比对csv文件中的前三列与fits文件夹下的文件名中的数字, % 选取csv中有但是fits中没有的记录存在diffa中 % 选取fits中有但是csv中没有的记录存在diffb中。 % tic clear;clc b=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)); end diffa = 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 % end end if 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, :); end toc % Author:shizhixin % Email:[email protected] % Blog:https://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,否则返回-1 function 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 end end end %比较两个数大小 function r = cmp2(a, b) if a > b r = 1; elseif a < b r = -1; else r = 0; end end% Author:shizhixin % Email:[email protected] %