Вы можете использовать Карта , которая предлагает вам эффективную структуру на основе словаря:
Для каждого слова сохраните вектор, показывающий вхождения в каждой строке:
A = {'life is wonderful', 'matlab makes your dreams come true'};
B = {'life would be meaningless without wonderful matlab', 'what a wonderful world', 'the shoemaker makes shoes', 'rock and roll baby'};
mapA = containers.Map();
sizeA = size(A,2);
for i = 1:size(A,2) % for each string
a = regexpi(A(i),'\w+','match');
for w = a{:} % for each word extracted
str = cell2mat(w);
if(mapA.isKey(str)) % if word already indexed
occ = mapA(str);
else % new key
occ = zeros(1,sizeA);
end
occ(i) = occ(i)+1;
mapA(str) = occ;
end
end
% same for B
mapB = containers.Map();
sizeB = size(B,2);
for i = 1:size(B,2)
a = regexpi(B(i),'\w+','match');
for w = a{:}
str = cell2mat(w);
if(mapB.isKey(str))
occ = mapB(str);
else
occ = zeros(1,sizeB);
end
occ(i) = occ(i)+1;
mapB(str) = occ;
end
end
затем для каждого уникального слова, найденного в A, вычислите совпадения с помощью B
match = zeros(size(A,2),size(B,2));
for w = mapA.keys
str = cell2mat(w);
if (mapB.isKey(str))
match = match + diag(mapA(str))*ones(size(match))*diag(mapB(str));
end
end
Результат:
match =
2 1 0 0
1 0 1 0
таким образом, у вас есть сложность #wordsA + #wordsB + #singleWordsA вместо # wordsA * # wordsB
EDIT : или, если вам не нравится Map
, вы можете сохранить векторы вхождения слов в алфавитно упорядоченном векторе.Затем вы можете искать совпадения, одновременно проверяя оба вектора:
(предположим, что мы используем структуру, где атрибут w
- это строка слова, а occ
- вектор вхождения)
i = 1; j = 1;
while(i<=size(wordsA,2) && i<=size(wordsB,2))
if(strcmp(wordsA(i).w, wordsB(j).w))
% update match
else
if(before(wordsA(i).w, wordsA(i).w)) % before: fancy function returning 1 if the first argument comes (alphabetically) before the second one (no builtin function comes to my mind)
i = i+1;
else
j = j+1;
end
end
если вы ищете 'matlab' и знаете, что в 10-й позиции сохранено, 'жизнь' бесполезна для проверки позиций раньше, поскольку вектор упорядочен в алфавитном порядке.Таким образом, у нас есть # wordsA + # wordsB итерация против # wordsA * # wordsB решения с вложенными циклами.