Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.11.21;
Скачать: [xml.tar.bz2];

Вниз

перемешивание стека   Найти похожие ветки 

 
race1   (2004-11-07 14:45) [0]

есть данные, хранящиеся в виде стека, т.е. каждый эл-т имеет указатель на пред. и след. эл-ты. как теперь можно эти эл-ты случайным образом переставить местами? т.е. была цепочка с данными 1->2->3->4, а сделать цепочку, например, такую: 3->1->2->4


 
Anatoly Podgoretsky ©   (2004-11-07 15:03) [1]

Вообще то это не стек.


 
palva ©   (2004-11-07 15:05) [2]

А двунаправленный список


 
KilkennyCat ©   (2004-11-07 15:07) [3]

очень легко: записываем в него данные в нужном порядке.


 
palva ©   (2004-11-07 15:10) [4]

А переставить можно следующим образом:
Берем первый элемент, порождаем целое случайное число s из диапазона 0..n и двигаем этот элемент вправо на s шагов. Потом берем следующий элемент, порождаем случайное число s из диапазона 0..n-1 и т.д. Если s = 0, то двигать, конечно, не надо.


 
KilkennyCat ©   (2004-11-07 15:25) [5]


> palva ©   (07.11.04 15:10) [4]

в этом случае, если работать как со стеком, мы потеряем какой-нить элемент, если у нас будет только одна переменная. Соответственно, если у нас будет больше переменных, то проще не рассматривать работу аналогично стеку, а юзать массив.


 
Anatoly Podgoretsky ©   (2004-11-07 15:31) [6]

Не проще, надо выполнять учебное задание.


 
KilkennyCat ©   (2004-11-07 15:33) [7]


> Anatoly Podgoretsky ©   (07.11.04 15:31) [6]


тогда я - пас :) не люблю делать учебные задания.


 
race1   (2004-11-07 17:08) [8]

это не учебное задание :) учебные задания я обычно сам делаю

> palva
можно доработать: создать доп. массив уже используемых значений, и генерировать не смещение, а индекс, кугда переместить текущий эл-т. при генерации числа для след. эл-та смотрим массив, если сгенерированное число уже занято - генерируем другое число

правда, в этом случае диапозон генерирования всегда будет n для каждого эл-та и может потребовать значительного времени пока сгенерятся все числа из диапозона 0..n :)

как этот момент доработать?


 
palva ©   (2004-11-08 00:06) [9]

Вы правы в своих расчетах. Причем для последних чисел потребуется много обращений к датчику, прежде чем они будут выбраны. Доработать можно тем способом, что хранить все НЕВЫБРАННЫЕ числа одним куском в памяти и генерировать индекс числа внутри этого куска. При этом отрезок генерации будет все время уменьшаться, сначала от 1 до n, затем от 1 до n-1 и т. д. В Delphi есть даже специальная функция для выбора случайного целого числа из диапазона. Правда, реализовать это без большого числа перестановок - не знаю как.

Возможен такой алгоритм, который я недавно предлагал на другом форуме.
http://www.relib.com/forums/topic.asp?id=842829
Там бейсик, но не думаю, что трудно разобраться. Это перемешивание последовательности 1..n. Идея такая: Сначала массив содержит последовательность от 1 до n. Основной цикл проходит с последнего элемента до второго (i := n downto 2) На каждом шаге цикла i-й элемент меняется местами с одним из предыдущих. Кандидат на перестановку выбирается случайным образом из диапазона 1..i, причем если получилось i, то перестановку, естественно, не делаем. Получается ровно n-1 обращений к случайному датчику.


 
Anatoly Podgoretsky ©   (2004-11-08 00:30) [10]

race1   (07.11.04 17:08) [8]
Тогда все просто

это тебе учебное задание, сделай сам


 
race1   (2004-11-08 13:17) [11]

>palva
спасибо

вот и я тут ещё придумал - берём 1-ый эл-т нащего списка, генерим число i = 0..n, и делаем i шагов вправо. если список закончился, переходим в начало и продолжаем смещаться. если текущий эл-т уже добавлен в новый список, смещаемся вправо пока не найдём первый недобавленный эл-т. при нахождении нового эл-та добавляем его в конец нового списка. т.е. новый список формируется по-порядку, но эл-ты для него берутся случайным образом из исходного списка. в теории тоже достаточно быстрый метод

главное что не нужно промежуточных массивов - мы работаем со списком и формируем список "на лету"


 
KilkennyCat ©   (2004-11-08 13:29) [12]


> race1   (08.11.04 13:17) [11]


что-то меня тут смущает...



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.11.21;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.034 c
14-1099551919
BiN
2004-11-04 10:05
2004.11.21
Транспортная революция. Будет ли она?


1-1099910119
Megabyte
2004-11-08 13:35
2004.11.21
Как в проекте другую форму сделать главной?


1-1099484048
Cosinus
2004-11-03 15:14
2004.11.21
Хм... OnDrawCell работает не так, как задумано.


6-1095054706
Alexis
2004-09-13 09:51
2004.11.21
отсутствуют ф-ции WSACreateEvent, WSAEventSelect в Winsock.pas


1-1100011791
Kray
2004-11-09 17:49
2004.11.21
MsWord поиск по надписям





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский