Есть такая проблема: Имеется текстовый файл с тысячами строк. Задача найти в нем и вывести 5 самых часто встречающихся строк. Скорость обработки должна быть наибольшей, а затрата ресурсов меньше (скажем на примере пхп).
Какие предложения будут ? _________________ ТюмГНГУ |
начни c длин строк ![]() |
char писал(а): начни c длин строк ![]() а причем тут длина строк и как их учитывать ? _________________ ТюмГНГУ |
Длина строк одинакова, просто сами строки различны _________________ ТюмГНГУ |
Xak, я не пойму, тебе это самому надо? или ты эту задачку от анютки притащил и хочешь узнать интелект форумчан? |
сделать выборку части файла, посмотреть в каких позициях символы чаще всего не повторяются, использовать в дальнейших проверках на совпадение строк по всему файлу...
(это если стандартное сравнение строк в языке работает медленнее, чем сравнение нескольких символов в строках) |
а тут или скорость наибольшая или ресурсы наименьшие. всё остальное лишь комбинации _________________ Ин дер гросен фамилие нихт клювен клац-клац ![]() |
Xak
Тыб уж конкурс устраивал, что ли. И не парил занятым людям мозги ![]() _________________ Скажи мне чей Крым, и я скажу кто ты. |
Xak писал(а): Имеется текстовый файлXak писал(а): Длина строк одинаковаВопросы: 1. Насколько длинные там строки? 2. Влезет ли файл целиком в память? 3. Какие строки мы считаем одинаковыми? 3.1. Имеет ли значение регистр символов? Если нет, то какая кодовая страница используется? 3.2. Имеют ли значение ведущие и концевые пробелы? А количество пробелов между словами? 3.3. Нужно ли различать символы с разными кодами, но выглядящие одинаково? 4. Осмысленные ли это строки на некотором языке, или произвольная абракадабра? 5. Сколько байт приходится на символ? 6. Сколько памяти можно использовать? 7. Можем ли мы создавать файлы, если вдруг понадобится? 8. Зачем вообще нужно решать эту задачу? 9. И почему вдруг на php? Я спрашиваю не просто ради того, чтобы пофлудить. Я уже решал подобную задачу. Если решение твоей задачи для тебя имеет практический смысл - помогу. У меня были строки разной длины, вообще говоря, произвольной, пустые строки не считались, регистр значения не имел, одинаково выглядящие символы считались одинаковыми, пробелы в начале и в конце не считались, подряд идущие пробелы считались одним, строки были осмысленные - смесь кириллицы и латиницы в cp866 или ср1251, на выбор, но не то и другое в одном файле, файл в память не помещался, его хеш-масиив тоже; задача была - быстро выяснить, есть ли данная строка в файле, плюс к тому поддерживалась возможность динамической модификации файла - добавить-удалить-изменить строку. Решалась построением хеш-массива и запихиванием его в специальный "индексный" файл с блочной структурой. Думаю, мог бы и "рейтинг популярности" посчитать - хеш-массив по сути упорядоченный, один раз его пробегаем и расставляем встречаемость, потом сортируем и получаем результат. У тебя строки одной длины - это упрощает построение хеша и навигацию, а может хеш и вовсе не нужен, непонятно, надо конкретнее задачу изложить. |
Я не буду конкурс устраивать.
Пускай в компе ооочень много памяти. Пусть тогда время не имеет значения, мне просто интересен сам принцип обработки файла. Я думаю считать все строки в массив и сравнивать каждую с каждой и при совпадении двух строк еще раз сравнивать с остальными не выход. Так вот как быть то ? ![]() ![]() _________________ ТюмГНГУ |
да вариантов масса... можешь создать кучу файлов по числу букв и считывая строчки из твоего файла тут же в новые файлы сортировать...
можешь еще например создать массив контрольных сумм всех строчек - быстрее сравнение/отбрасывание потом пойдет... в общем, - думай, пробуй ![]() |
ну если памяти вагон, то примерно таг
$ч = аррай(); вхиле($а=фреад(филе)) $ч[$a] ++ потом аррай_сорт и выбираем первых 5 строг. _________________ Ин дер гросен фамилие нихт клювен клац-клац ![]() |
andy ice писал(а): ну если памяти вагон, то примерно таг
$ч = аррай(); вхиле($а=фреад(филе)) $ч[$a] ++ потом аррай_сорт и выбираем первых 5 строг. ОК. Ето моно поробовать ![]() _________________ ТюмГНГУ |
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете вкладывать файлы Вы можете скачивать файлы |