% 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:中存放的是如下类型数据:  
% 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: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,否则返回-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  

原文:http://blog.csdn.net/shizhixin/article/details/7613525

posted on 2012-05-30 20:19  rooly  阅读(287)  评论(0)    收藏  举报