![]() |
подскажите алгоритм
Народ подскажите, как считать большой текстовый файл(допустим словарь) и очистить его от повторов или наоборот, например найти элемент повторяющийся наибольшее кол-во раз, какой самый быстрый способ (желательно на php)?
|
Убирал совпадения из фалика в 200000 строк таким макаром:
Код:
<?php |
А еще бы комментов :)......
|
>>Народ подскажите, как считать большой текстовый файл
2Helios мало того что алгоритм неэффективен так он еще и под заданную задачу не подходит. |
Комменты:
После считывания файла все его строки сортирую, при этом одинаковые окажутся рядом. На это совпадение и проверяю. При желании можно прикрутить strtoupper/strtolower дабы не обращать внимания на регистр. 2ZaCo Напиши эффективнее, ты ж чингачкук. |
2Helios я напишу вот только задачи не вижу.
|
Цитата:
|
Цитата:
Т.к. память безгранична за счет раздела подкачки, то... ;) |
2 ZaCo задача - находить повторяющиеся элементы в текстовом файле и производить с ними различные действия
|
Скрипт ентот исполняться будет не сотню раз одновременно, а в один поток, поэтому на ОЗУ жаловаться ИМХО нет смысла. А насчет того, что считывать нужно весь файл сразу - в другом случае прогонять поиск совпадений по циклу и сортировку пришлось бы после каждого считывания => время исполнения увеличилось бы в разы.
З.Ы.: Кто знает другие варианты - пишите, а то и самому интерессно) |
Helios
твой код можно заменить одной функцией array_unique которуая удалит все дубликаты из массива. Я думаю алгоритм для больших файлов должен быть следующим: открытие файла (fopen) чтение строки. пробежать по файлу в поисках дубликата с места нахождения этой строки. Если найдено то занести в массив. В итоге будет два массива, один чистый а в другом будут все найденные совпадения. |
Это по тому что, написал киба (perl, портировать на php не составит труда)
Код:
foreach(@tmp) { push(@unqie,$_) if !$seen{$_}; $seen{$_}=1; }@unique - список в котором окажутся все уникальные строки %seen - хэш, в котором будут повторы (key=>имя_повтора, value=>всегда 1) Хотя я не совсем уверен, что это есть оптимальный алгоритм... Хотя хз... UPD: Код:
E:\>perl unique.pl |
Написал аналог php'шной функции
sub array_unique(@) { @input=@_; %temp=(); foreach $item (@input) { push(@output, $item) unless $temp{$item}++; } return @output; } использовать так: @arr=array_unique(@arr); |
Я модифицировал функцию от кибы и получилось вот что:
Код:
sub array_uniqueКод:
E:\>perl unique.pl |
| Время: 03:33 |