更新:以前の「方法3」に満足できなかったので、パフォーマンスを向上させるために少し再調整しました。今では、ナイーブのほぼ10倍の速度で実行されますstrcmp
。
strcmp
私のマシンで勝ちます(Linux Mint 12では2011b)。特に、よりもはるかにうまく機能しますismember
。ただし、手動で事前に並べ替えを行うと、速度が少し向上します。次の速度テストを検討してください。
NumIter = 100;
N = 495000;
K = N / 20;
List = cell(N, 1);
for i = 1:20
List(i*K - K + 1:i*K) = cellstr(char(i+96));
end
StrToFind = cell(NumIter, 1);
for j = 1:NumIter
StrToFind{j} = char(round(rand * 20) + 96);
end
%# METHOD 1 (ismember)
tic
for j = 1:NumIter
Index1 = ismember(List, StrToFind{j});
Soln1 = List(Index1);
end
toc
%#METHOD 2 (strcmp)
tic
for j = 1:NumIter
Index2 = strcmp(StrToFind{j}, List);
Soln2 = List(Index2);
end
toc
%#METHOD 3 (strmp WITH MANUAL PRE-SORTING)
tic
for j = 1:NumIter
CurStrToFind = StrToFind{j};
K = 100;
I1 = zeros(K, 2); I1(1, :) = ones(1, 2);
I2 = zeros(K, 2); I2(end, 1) = 1; I2(end, 2) = N;
KDiv = floor(N/K);
for k = 2:K-1
CurSearchNum = k * KDiv;
CurListItem = List{CurSearchNum};
if CurListItem < CurStrToFind; I1(k, 1) = 1; end;
if CurListItem > CurStrToFind; I2(k, 1) = 1; end;
I1(k, 2) = CurSearchNum; I2(k, 2) = CurSearchNum;
end
a = find(I1(:, 1), 1, 'last');
b = find(I2(:, 1), 1, 'first');
ShortList = List(I1(a, 2):I2(b, 2));
Index3 = strcmp(CurStrToFind, ShortList);
Soln3 = ShortList(Index3);
end
toc
出力は次のとおりです。
Elapsed time is 6.411537 seconds.
Elapsed time is 1.396239 seconds.
Elapsed time is 0.150143 seconds.