С нами с 22.10.03
Сообщения: 598
Рейтинг: 706
|
Добавлено: 15/10/06 в 10:28 |
Понадобилось мне перемешать текстовый файл со списком ФХГ. Написал простенькую програмку и вспомнил, что пару раз кто-то на форуме про такое спрашивал. Так-что если кому надо, пользуйтесь. Во второй строке указываем имя файля и запускаем. Сгодится для перемешивания списка ФХГ например. Вместо shuffle() используется более "перемешивающий" алгоритм.
|
|
|
|
С нами с 26.02.03
Сообщения: 2352
Рейтинг: 987
|
Добавлено: 15/10/06 в 14:48 |
Код: | $fhgs=file($file);
$v0 = count($fhgs);
$v0 = $v0-1;
$v1=$v0*3;
for ($i=0;$i<$v1;$i++){
$n1=rand(0,$v0);
$n2=rand(0,$v0);
$v2=$fhgs[$n1];
$fhgs[$n1]=$fhgs[$n2];
$fhgs[$n2]=$v2;
} |
А ты уверен, что это более "перемешивающий" алгорит ? Известная аксиома програмирования на РНР - не нужно придумывать свои функции, когда есть стандартные.
Я не докалываюсь , просто самому иногда необходимо использовать данную операцию. Может кто-то что то более эфективное предложит.
|
|
|
|
С нами с 22.10.03
Сообщения: 598
Рейтинг: 706
|
Добавлено: 15/10/06 в 16:02 |
Cibtor писал: | А ты уверен, что это более "перемешивающий" алгорит ? Известная аксиома програмирования на РНР - не нужно придумывать свои функции, когда есть стандартные.
Я не докалываюсь , просто самому иногда необходимо использовать данную операцию. Может кто-то что то более эфективное предложит. |
$v1=$v0*3; - перемешивает три раза, в отличии от shuffle позволяет регулировать степень "перемешки" в ущерб времени. С год назад был топик по поводу перемешивания, где и был предложен этот алгоритм и где сошлись на мнении, что он самый толковый.
|
|
|
|
С нами с 26.02.03
Сообщения: 2352
Рейтинг: 987
|
Добавлено: 15/10/06 в 21:22 |
pashtet писал: | в отличии от shuffle позволяет регулировать степень "перемешки" в ущерб времени |
А по какому алгоритму мешает shuffle? Код: | $n1=rand(0,$v0);
$n2=rand(0,$v0); |
Меня смущает вот этот код с не самыми быстрыми операциями. IMHO в shuffle дожно быть сделанно как-то оптимальнее
|
|
|
|
С нами с 22.10.03
Сообщения: 598
Рейтинг: 706
|
Добавлено: 15/10/06 в 21:44 |
Cibtor писал: | А по какому алгоритму мешает shuffle? Код: | $n1=rand(0,$v0);
$n2=rand(0,$v0); | Меня смущает вот этот код с не самыми быстрыми операциями. IMHO в shuffle дожно быть сделанно как-то оптимальнее |
Судя по http://php.net/shuffle не по этому. Это оказывается
Цитата: | This is an attempt to get the Fisher Yates shuffle right, and as optimized as possible |
Может и оптимальнее, т.к. по любому на СИ, но в данном случае производительность не столько важна, сколько возможность регулировки, для меня по крайней мере.
|
|
|
|
С нами с 03.04.03
Сообщения: 2464
Рейтинг: 1841
|
Добавлено: 16/10/06 в 00:50 |
также в качестве альтернативы можно использывать прогу EListPro
перемешивание , подсчет строк, удаление повторов и т.д
|
|
|
|
С нами с 01.03.06
Сообщения: 629
Рейтинг: 620
|
Добавлено: 16/10/06 в 14:16 |
pashtet писал: | Так-что если кому надо, пользуйтесь. Сгодится для перемешивания списка ФХГ например. |
за пользуйтесь конечно огромное спасибо - думаю многим в копилочку пригоится если еще нету, а самим написать не под силу. но у скрипта в связи с " $fhgs=file($file); " есть ограничение на объем памяти... и если действительно нужно перетусить обычный список ФХГ то ее не хватит однозначно на большинстве хостингов.
|
|
|
|
С нами с 22.10.03
Сообщения: 598
Рейтинг: 706
|
Добавлено: 16/10/06 в 15:08 |
Heavy писал: | за пользуйтесь конечно огромное спасибо - думаю многим в копилочку пригоится если еще нету, а самим написать не под силу. но у скрипта в связи с " $fhgs=file($file); " есть ограничение на объем памяти... и если действительно нужно перетусить обычный список ФХГ то ее не хватит однозначно на большинстве хостингов. |
А зачем ее запускать на хостинге, локально в самый раз. Да и памяти под PHP можно отвести можно побольше и время выполнения скрипта увеличить etc. У меня список из 5к ФХГ мешает за пару сек на дефолтных установках. Дюрон 1300, 512 РАМ
|
|
|
|
С нами с 01.03.06
Сообщения: 629
Рейтинг: 620
|
Добавлено: 16/10/06 в 23:13 |
pashtet писал: |
А зачем ее запускать на хостинге, локально в самый раз. Да и памяти под PHP можно отвести можно побольше и время выполнения скрипта увеличить etc. У меня список из 5к ФХГ мешает за пару сек на дефолтных установках. Дюрон 1300, 512 РАМ |
затем что бы не тратить время на ручную работу - и все делалось само и в свое время... и мешать списки не в 5к ФХГ, а как минимум в 500к ;) но это так - к слову было - т.к. такие вещи на вируталах смысла делать всеравно нету...
|
|
|
|
С нами с 07.02.05
Сообщения: 691
Рейтинг: 435
|
Добавлено: 16/10/06 в 23:39 |
Гг, чтобы фхг перемешивать уже дедик нужен? Boxer text editor вам в помощь ;)
|
|
|
|
С нами с 01.03.06
Сообщения: 629
Рейтинг: 620
|
Добавлено: 16/10/06 в 23:52 |
WinXXXP писал: |
Гг, чтобы фхг перемешивать уже дедик нужен? Boxer text editor вам в помощь ;) |
что бы перемешать фхг - подошла бы и пара китайцев... но речь топика далеко не о том... я просто обратил внимание на один аспект - а именно требовательность к объему памяти отводящемуся под выполнение скрипта!
|
|
|
|
С нами с 22.10.03
Сообщения: 598
Рейтинг: 706
|
Добавлено: 17/10/06 в 08:31 |
Cibtor писал: | Код: | $n1=rand(0,$v0);
$n2=rand(0,$v0); | Меня смущает вот этот код с не самыми быстрыми операциями. IMHO в shuffle дожно быть сделанно как-то оптимальнее |
В общем, ты прав. shuffle работает в среднем в 20-30 раз быстрее этого алгоритма. Но! Если засечь время работы скрипта, то разброс времени для shuffle < 5%, для предложенного алгоритма - 20-30%.
ИМХО, и скорость, и стабильность shuffle получается в ущерб степени перемешивания. Например, сравнимые результаты будут при $v1=$v0/30;
freeuser писал: | также в качестве альтернативы можно использывать прогу EListPro |
WinXXXP писал: | Гг, чтобы фхг перемешивать уже дедик нужен? Boxer text editor вам в помощь ;) |
Хорошие програмки. Но я код привел в том числе и в качестве примера, вдруг кому надо его в свой скрипт встроить, например -)
Heavy писал: | списки не в 5к ФХГ, а как минимум в 500к ;) |
Скорее всего их надо не просто мешать, но и: получать, обрабатывать, скачивать, куда то в каком-то формате вставлять etc. А это уже очень бы хотелось на мускуле делать. бо все эти пертубации критичны и ко времени выполнения скрипта и к надежности и т.д.
Можешь предложить что нить лучше?
|
|
|
|
С нами с 01.03.06
Сообщения: 629
Рейтинг: 620
|
Добавлено: 17/10/06 в 21:17 |
pashtet писал: |
Скорее всего их надо не просто мешать, но и: получать, обрабатывать, скачивать, куда то в каком-то формате вставлять etc. А это уже очень бы хотелось на мускуле делать. бо все эти пертубации критичны и ко времени выполнения скрипта и к надежности и т.д.
Можешь предложить что нить лучше? |
"получать, обрабатывать и скачивать & etc" можно делать и не с перемешанными. насчет мускуля не понял - скачивать через мускуль хочешь или перемешивать ;) шучу... и кстати - начальный список ФХГ - впринципе тоже можно считать уже в какой-то степени перемешенным но суть не в том - на практике как правило на самом деле не требуется ничего перемешивать - зачастую достаточно перетосить не более сотни другой а если требуется постоянно из пары сотен килоФХГ выбрать случаных штук 100 - то перемешивать для этого все тоже смысла никакого не имеет... поэтому определи свою задачу - с какой целью и что требуется перемешивать... а там будет видно что тебе можно подсказать.
|
|
|
|
С нами с 22.10.03
Сообщения: 598
Рейтинг: 706
|
Добавлено: 17/10/06 в 22:14 |
Heavy писал: | поэтому определи свою задачу - с какой целью и что требуется перемешивать... а там будет видно что тебе можно подсказать. |
Да нет у меня особой задачи-то :-) Просто скрипт написал и решил поделиться, а тут вот что поднялось :-) Но если уж тебя задело file($file), то вот как средствами ПХП обратиться к произвольной строке файла подсказать можешь :-)
|
|
|
|
С нами с 22.10.03
Сообщения: 598
Рейтинг: 706
|
Добавлено: 17/10/06 в 22:16 |
Оффтопик: pashtet писал: | Да нет у меня особой задачи-то :-) | Разве что сигнатурку поспамить :-)
|
|
|
|
С нами с 01.03.06
Сообщения: 629
Рейтинг: 620
|
Добавлено: 17/10/06 в 23:16 |
pashtet писал: |
Да нет у меня особой задачи-то :-) Просто скрипт написал и решил поделиться, а тут вот что поднялось :-) Но если уж тебя задело file($file), |
про поделится я уже написал и про "поднялось" косвенно тоже
и меня ничего особо не задело - просто оставил свой комментарий ;)
pashtet писал: | то вот как средствами ПХП обратиться к произвольной строке файла подсказать можешь :-) |
средствами ПХП не скажу, да и нет смысла - т.к. не "зная" файл - на произвольную строку не "перейдешь", но один из вариантов - проиндексировать строки файла - т.е. создать например файл с индексами на строки. как ни крути он полюбому в разы и разы будет меньши ориганльного файла и ускорит выбор строк.
|
|
|
|