Быстрый поиск
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.134] |
|
|
правила раздела Алгоритмы

| Страницы: (4) 1 2 [3] 4 все ( Перейти к последнему сообщению ) |
Быстрый поиск
|
Сообщ.
#31
,
|
|
|
|
мерять надо! ведь n сравнений (особенно с cmpsb) и n переходов по ссылке - не одно и то же! похоже всётаки придётся написать qsort. только на с++е мне чото не хочется писать, да и в сети qsortов полно, и помнится в стандартной библиотеке qsort есь. остаётся написать только то, что должно быть после сортировки, т е собственно выбрасывание одинаковых строк. если не знаешь, как ето сделать без одалживания памяти - я тебе напишу, только надо будет знать, в каком формате строки.
|
|
Сообщ.
#32
,
|
|
|
|
А если весь массив со строками существенно больше, чем размер доступной оперативной памяти? У MeG метод более универсальный
![]() P.S. Еще можно вспомнить алгоритм сжатия LZW -- структуру словаря етого алгоритма |
|
Сообщ.
#33
,
|
|
|
|
Цитата Visitor, 25.09.03, 18:45:05 А если весь массив со строками существенно больше, чем размер доступной оперативной памяти? У MeG метод более универсальный ![]() вопервых если массив не умещается в память, то даже и думать нечего, а вовторых уменя насколько я понимаю меньше памяти тратится. Цитата Visitor, 25.09.03, 18:45:05 P.S. Еще можно вспомнить алгоритм сжатия LZW -- структуру словаря етого алгоритма ![]() тыбы ещё рар предложил ;D |
|
Сообщ.
#34
,
|
|
|
|
Вот RAR, с его алгоритмом LZ, как раз не подойдет
![]() А словарь-дерево из LZW или такое как у MeG, в случае слов естественного языка большим не будет. Вот представь себе такую задачу: некое собрание сочинений (например, Билиотека Мошкова) в електронном виде. Нужно из него сделать список всех форм всех имеющихся там слов русского языка. Читать слова придется из какого-то потока, а хранить словарь можно и в памяти. Хотя я бы, в етом случае, хранил слова просто в балансированном двоичном дереве. ![]() |
|
Сообщ.
#35
,
|
|
|
|
В LZW происходит то же самое: сравнение слова со всеми словами из словаря. К тому же, я что-то не совсем понимаю, какое LZW имеет отношение к делу.
2 wormball: qsort, создание дерева и т.п. нужно использовать только 1 раз, в самом начале. Так что, если qsort будет быстрее создания дерева, а двоичный поиск медленнее создания дерева (а мне почему-то кажется, что именно так и будет), то что быстрее - нужно рассчитывать уже по кол-ву поисков. |
|
Сообщ.
#36
,
|
|
|
|
Цитата Jin X, 26.09.03, 23:37:42 Так что, если qsort будет быстрее создания дерева, а двоичный поиск медленнее создания дерева (а мне почему-то кажется, что именно так и будет), то что быстрее - нужно рассчитывать уже по кол-ву поисков. ещё раз объясняю: двоичного поиска не будет! после сортировки надо будет за линейное время сравнивать слова с идущими за ними словами. |
|
Сообщ.
#37
,
|
|
|
|
Да, точно... прогон
![]() Но тогда при поиске (не совпадений, а просто слова) будет |
|
Сообщ.
#38
,
|
|
|
|
подведем итоги обсуждения
предложенные методы поиска и удаления дубликатов:
Предлагаю сравнить все эти методы живьем. Смысл? Оценить предложенные методы с различных сторон. Требования к реализации достаточно свободные, любой язык, любые библиотеки. В общем, можно использовать все что вам доступно и удобно, в том числе готовые решения. Проверяем на одном словаре. Оцениваем:
Jin X, wormball, Demo_S, Visitor прошу участвовать |
|
Сообщ.
#39
,
|
|
|
|
как всё сложно ;D
|
|
Сообщ.
#40
,
|
|
|
|
я грубо ошибся при оринтировочной оценке требуемого количества узлов в моем дереве для словаря, размер намного больше.
если кому нужен исходник, вышлю |
|
Сообщ.
#41
,
|
|
|
|
если всеравно что использовать, может попробуешь Perl, у него единица языка - слово. Для определения одинаковых слов очень подходит.
Производительность высокая, можешь сравнить со своей производительностью, результаты были бы интересны пишется на перле для такого дела всего несколько строчек |
|
Сообщ.
#42
,
|
|
|
|
Ну вот ориентировочные результаты: с помощью обычного (не балансированного) двоичного дерева из 100M текстов RFCxxxx словарь (слова состоящие из символов, у которых isalpha != 0) строится 17 сек на PIII-700
|
|
Сообщ.
#43
,
|
|||||
|
|
код на Perl, без какой либо оптимизации правда, читает прямо из файла
Это собственно вся сортировка если бы каждое слово было на новой строчке было еще быстрей. А так как видно еще перебор каждой строки происходит. 2Visitor сравните, будет, конечно, не 17 сек, но результат интересен. запускается как perl название_скрипта файл_для_сортировки_без_расширения входной файл подразумевается .txt |
|
Сообщ.
#44
,
|
|||
|
|
rfcs.txt: 107 857 600 bytes
Тоже недолго... Вот только памяти он почему-то 120M сожрал в прцессе выполнения??? |
|
Сообщ.
#45
,
|
|
|
|
Да
2.16 неплохо, если память под массивы выделить сразу на все эл-ты, и сделать так, что слово есть 1 строчка. Можно будет еще время выграть, но это уже для фанатов. |