|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
21.05.2012, 20:08 | #1 | |
любитель-далеко не
Участник клуба
Регистрация: 13.04.2010
Сообщений: 1,156
|
Оптимальный алгоритм - получить список из N наиболее часто встречающихся элементов
Друзья, приветствую всех и здравия желаю)
Если кто когда-то уже размышлял над проблемой указанной в заголовке выскажите какие-нибудь соображения по поводу решения задачи вроде следующей: Цитата:
Собственно - буду очень благодарен за любые советы комментарии по поводу задачи - как по-вашему это сделать "оптимальнее". Особенно алгоритм сортировки . p.s. - да - знаю, что об этом писал великий Дональд Кнут - и буду очень благодарен если вы не просто отошлёте меня к данной книги (надеюсь, что к книге))) и ещё и скажите название алгоритма (который рассматривается у Кнута) наиболее оптимального в данном случае. Заранее благодарю) |
|
21.05.2012, 21:07 | #2 |
Заблокирован
Старожил
Регистрация: 20.07.2008
Сообщений: 4,032
|
Самый простой способ это двоичное дерево, где хранится слово и число раз сколько оно встретилось. Проходим по файлу, если не нашли слово, то добаляем в дерево и счетчик ставим 1, иначе увеличиваем счетчик.
Это сбор уникальных слов и их количества. Как найти наиболее часто встречаемые нужно подумать, но думаю нужно этим занимается при увеличении счетчика. |
21.05.2012, 21:32 | #3 |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
Ну да, мне тоже видится список образцов и частота их использования... Вариант 2. Отсортировать все слова (в смысле текст) и считать количество повторений. Но не знаю что будет быстрей... Для русского языка наверно это будет союз и
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика |
21.05.2012, 22:11 | #4 | |
Форумчанин Подтвердите свой е-майл
Регистрация: 31.03.2008
Сообщений: 179
|
Цитата:
Последний раз редактировалось akasex; 22.05.2012 в 00:41. Причина: Added link |
|
21.05.2012, 22:30 | #5 | |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Цитата:
По-моему так свои индексы обновляют все серьезные СУБД при вставке записи.
I'm learning to live...
|
|
21.05.2012, 22:49 | #6 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Возможно поможет эта реализация http://morpher.ru/Russian/Stats.aspx
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
22.05.2012, 08:42 | #7 | |
любитель-далеко не
Участник клуба
Регистрация: 13.04.2010
Сообщений: 1,156
|
Цитата:
(но вообще -насколько я понимаю - это лишь конкретный способ определения "веса слова" - так как после того, как текст отсортирован - нам придётся считать повторы - после же сортировать результирующий массив и получать эти самые N значений) Аватар, akasex благодарю за ссылки. Levsha100 , Stilet наверное правда лучше всего что-то "бинарное"...буду смотреть. |
|
22.05.2012, 09:38 | #8 | |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
Цитата:
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика |
|
22.05.2012, 20:55 | #9 | |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Цитата:
I'm learning to live...
|
|
23.05.2012, 02:50 | #10 | |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,085
|
Решил вспомнить молодость, написал на плюсах какую-то фигню, но баги вылазят, судя по результатам, но сути дела эти ошибки не должны менять.
Скачал где-то войну и мир на 3 метра, написал прогу. Она насчитала вот это: Цитата:
Описываю принцип: Слова загоняются в дерево (не помню только уже как оно называется, в разделах про поиск описывается оно). Ветви дерева - буквы слов, а листья - специальный маркер, показывающий конец слова. В общем, ветви корня дерева - первые буквы всех найденных слов. От всех этих первых букв идут уже вторых буквы этих самых слов. Если слово состоит из одной буквы, то вместо второй буквы должен быть маркер, который можно совместить со счетчиком популярности слова. Таким образом, если идти от корня к листьям, то можно прочесть все найденные слова. Ну, а потом нужно найти N листьев этого дерева, с наибольшим счетчиком. Я сделал это через тупую рекурсию. Из STL использовал только list и его sort с merge для сортировки и объединения упорядоченных списков, соответственно. Попробовал скопировать этот же текст несколько раз. В итоге получил 64 метра на диске, оперативки в диспетчере жрала прога столько же, а время выполнения не больше 15 секунд (основное время заняло чтение из файла и создание дерева на основе этих данных). |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
из текстового файл получить 5 наиболее часто встречающихся слов и число их появлений (на Delphi) | sifa | Помощь студентам | 5 | 09.01.2012 18:34 |
в тексте слова, содержащие ровно одну из 10 наиболее часто встречающихся букв | yaroslav_bondarev | Паскаль, Turbo Pascal, PascalABC.NET | 3 | 16.12.2011 10:11 |
дан текст, написать код, нахождения 10 наиболее часто встречающихся букв | yaroslav_bondarev | Паскаль, Turbo Pascal, PascalABC.NET | 9 | 14.12.2011 22:08 |
Получить массив из элементов, встречающихся в исходном массиве ровно один раз без повторений | Shikarmo4000 | Помощь студентам | 0 | 25.05.2010 01:27 |
Найти (в процентах) частоту появления каждого из m наиболее часто встречающихся элементов | sk1p | Паскаль, Turbo Pascal, PascalABC.NET | 2 | 26.09.2008 23:57 |