2015-03-07 1 views
1
n_dicwords = [np.sum([c.lower().count(w.decode('utf-8')) for w in dictionary]) 
               for c in documents] 

Здесь я пытаюсь определить свою функцию времени инженерные вычисления:Временная сложность для сопоставления и подсчета между двумя списками

Используя эту строку кода, которая проходит через каждый документ и проверяет, является ли или нет, и если да, то сколько его слов также появляется в этом словаре, который у меня есть, он генерирует функцию, называемую n_dicwords. Извините, что я такой noob для теории сложности, я думаю, что сложность времени для создания этой функции O (n * m * w), где n - количество документов, m - количество слов в каждом документе, w - номер слов в словаре. Я прав? И если есть ли способ улучшить это?

Большое вам спасибо! Я очень благодарен за вашу помощь!

ответ

1

Я немного удивлен тем, что конструкция «x in s» в python - это O (n), где n - количество элементов n списка. Итак, ваша оценка правильная. Немного более правильный способ взглянуть на это: поскольку ваш документ или счет в нем не изменяются вообще, важными числами являются общее количество слов, которые необходимо проверить, и длину словаря, против которого они находятся проверено. Очевидно, это вовсе не изменяет количество вычислений, оно просто приводит нас к быстро узнаваемой форме O (m * n).

Возможно, вы можете хранить словарь в бинарном дереве, что уменьшит его до O (log (n)).

Поиск «бинарного дерева python» в Google, мне было интересно, как пакет, называемый «bintrees».

Однако Эрик Вестерас указывает, что структура данных «набор» на основе python является хешированной базой данных и имеет сложность O (1) в среднем случае, а O (n) - в худшем и очень редком дело.

См https://docs.python.org/2/library/stdtypes.html#set

+2

На самом деле стандартный набор в python - это хэш-набор (который для этого использования еще лучше), поэтому никаких дополнительных пакетов не требуется. –

+0

О! Вы правы, я пропустил это! –

+0

Почему вы удивлены, что 'x in s' является O (n)? Это почти буквально говорит «каждый« х »с индексом от 0 до« n-1' в 's'». – OJFord

1

Если код под код не делает любой умный материал ваш анализ сложности должен быть правильным.

Если производительность в этой части важна, вы должны использовать алгоритм поиска строк с несколькими шаблонами, который пытается решить в значительной степени точную проблему, которую вы делаете.

Для начала ознакомьтесь с Aho-Corasick, который является наиболее часто используемым и работает в линейном времени. В Googling «Aho-Corasick python» появилось несколько различных реализаций, поэтому, хотя я не использовал их лично, я бы подумал, что вам не придется реализовывать сам алгоритм, чтобы использовать его.

Если вам просто нужен ваш код для запуска немного быстрее, и вам не нужно получать лучшую производительность, вы могли бы просто использовать набор для словаря. В python нормальный набор является хэш-множеством, поэтому он имеет постоянный поиск по времени. Тогда вы можете просто проверить каждое слово, если оно находится в словаре.

+0

Я изменил свой словарь из списка типов, чтобы установить тип, но кажется, что требуется немного больше времени: start = time.clock() 'n_dicwords = [np.sum ([c.lower(). Count (w ,декодировать ('UTF-8')) для ш в словаре]) для с в subsample_documents] печати "Время съемки:", time.clock() - начать Время съемки: 21.483408' – Blue482

+0

'dictionary_set = SET (словарь); n_dicwords = [np.sum ([c.lower(). count (w.decode ('utf-8')) для w в словаре_set]) для c в subample_documents] print «Время принятое:», time.clock() - start Время съемки: 24.844395' Или это нормально, что время вычисления может быть непоследовательным? – Blue482

+1

Итерация по множеству столь же дорога, как итерация по списку. Вы должны перебирать слова в документе и для каждого слова, проверьте, находится ли он в словаре. Теперь вы повторяете слова в словаре и каждый из них проверяет, находятся ли они в документе, т. Е. Вы делаете это неправильно. –

Смежные вопросы