Строковые массивы с линейным поиском по времени - PullRequest
2 голосов
/ 25 января 2012

Я занимаюсь обработкой строк в Matlab и обычно использую массивы ячеек для хранения отдельных слов в тексте

Пример:

a = {'this', 'is', 'an', 'array', 'of', 'strings'}

Для поиска слова 'of' в этом массиве я перебираю массив и проверяю каждый отдельный элемент на соответствие моему слову. Этот метод не масштабируется, так как, если я получу большой набор данных, мой массив a станет большим, а циклический просмотр элементов не будет разумным. Мне интересно, есть ли какой-нибудь более умный способ, возможно, лучшая нативная структура данных в Matlab, которая может помочь мне запустить это быстрее?

1 Ответ

3 голосов
/ 25 января 2012

A Карта контейнера является одним из вариантов.Я не знаю, какой именно тип обработки строк вы намереваетесь выполнить, но вот пример того, как вы можете хранить каждую строку в качестве ключа, который связан с вектором позиций индекса этого слова в массиве ячеек:

a = {'this', 'is', 'an', 'array', 'of', 'strings', 'this', 'is'};

strMap = containers.Map();  %# Create container
for index = 1:numel(a)      %# Loop over words to add
    word = a{index};
    if strMap.isKey(word)
        strMap(word) = [strMap(word) index];  %# Add to an existing key
    else
        strMap(word) = index;  %# Make a new key
    end
end

Затем можно получить индексные позиции слова:

>> indices = strMap('this')

indices =

     1     7    %# Cells 1 and 7 contain 'this'

Или проверить, существует ли слово в массиве ячеек (т. Е. Если это ключ):

>> strMap.isKey('and')

ans =

     0    %# 'and' is not present in the cell array
...