% 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
找出两个将近十万多条记录的文件中的不同记录
最新推荐文章于 2023-06-27 18:16:20 发布