|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Anatolij Kupriyanov 2:5050/69.1 16 Apr 2001 08:15:54 To : Alexander Babanov Subject : Perl:10% из массива -------------------------------------------------------------------------------- Я совершенно случайно заметил, что в Воскресенье Апрель 15 2001 11:20, Alexander Babanov писал Pavel Reich: AB> ЮІ±° Quoted soap from Pavel Reich to All Юґullo Pavel! PR>> Есть список и нужно получить список в 10 раз меньше. То есть получить PR>> 10% _случайных_ элементов списка. Если без случайности, это понятно - PR>> отрезаешь и все. А вот со случайностью? Да так, чтобы не повторялись? PR>> Hапример из списка (1..100) получаем 5 15 21 33 40 47 51 58 70 89 PR>> И как это сделать наиболее рационально... AB> Хорошую эффективность (по памяти и времени) при больших N должно дать AB> использование хеша для проверки повторений. Либо, что еще лучше, но будет AB> портить массив, прописывание какого-нибудь ключа на место выбранного AB> элемента. AB> Во втором случае: AB> @a = (10001..20000); AB> for (1..1000) { AB> $i = int rand 10000; AB> if(defined $a[$i]) { AB> push @b, $a[$i]; AB> undef $a[$i]; AB> } AB> else { AB> $r++; AB> redo; AB> } AB> } AB> print "$r\n"; AB> Дает 40-70 перезапусков на тысячу элементов. И pастёт линейно. :( Для 1_000_000 я не смог дождаться, когда он закончит (а ждал я несколько минут). Вот такая штука pаботает за 12 секунд: $с=1000000; @a=sort {$a <=> $b} (sort {1-int rand 3} (1..$с))[0..$с/10]; C уважением, Anatolij Kupriyanov. [МФ УдГУ] [(Microsoft!=SUXX)&&(LINUX!=RULEZ)] [Two Beer or not to be] ш ты говоришь: "Куда же ты отсюда?" Ты знаешь,главное - прочь, а там все равно ... еще 50 грамм инвестиций - и я недвижимость... --- ifmail v.2.15 * Origin: kan@scb.udsu.ru (2:5050/69.1) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/27803ada74b8.html, оценка из 5, голосов 10
|