Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
МАКСИМ.
Зарегистрирован: 03.03.2006 Сообщения: 9 Откуда: СПб
|
Добавлено: Пт Мар 03 2006 03:13 Заголовок сообщения: проблема с комбинаторикой... ;-) |
|
|
Приветствую всех!
у меня есть проблема в создании алгоритма.
кто может мне помочь с какой задачкой?!
дан массив А[n] = { x[1],x[2],..x[i]..,x[n] },
где X[1] - 1-й элемент в массиве,
X[i] - i-й элемент в массиве,
.........................................
n - кол-во натур. чисел.
нужно составить алгоритм , который бы
перемешивал все i в массиве.
причем каждая новая комбинация не повторялась.
откликнитесь кто лучше меня разбирается в комбинаторике.
мне нужен только принцып перетасовки.
А то я уже бьюсь ЦЕЛЫЙ месяц! |
|
Вернуться к началу |
|
|
beliy
Зарегистрирован: 10.12.2004 Сообщения: 124 Откуда: Москва
|
Добавлено: Пт Мар 03 2006 18:01 Заголовок сообщения: |
|
|
самое простое на вскидку:
знаете как карты "бутербродом" перемешивают?
разделяем входной массив на 2 половины:
Код: | a1 = {x[1]..x[n/2-1]} a1 = {x[n/2]..x[n]}
|
и создаем выходной массив, пихая в него поочередно элементы из каждого массива, т.e.:
Код: | output = {x[n/2], x[1], x[n/2 +1], x[2], ..... , x[n], x[n/2 - 1]} |
|
|
Вернуться к началу |
|
|
GREA
Зарегистрирован: 14.05.2003 Сообщения: 758 Откуда: Новосибирск
|
Добавлено: Вс Мар 05 2006 00:55 Заголовок сообщения: |
|
|
Периодически буду повторяться комбинации, думаю, таким способом
Самые простые способы перетасовки. Надежные но очень тупые или не оптимальные по скорости:
1)
Взять первое число массива i=0. Выбрать случайно число 0<=С<n (возможно совпадет с i). Поменять местами i-ый и C-ый элемент. Повторить
(можно делать прям в текущем массиве)
На всякий случай можно сделать несколько итераций, хотя и одной вроде хватит для полноценного перемешивания.
2)
(нужен второй - выходной, пустой в начале массив)
Выбрать случайно место для первого элемента в выходном массиве и скопировать его туда. Далее - выбрать случайно место для второго элемента (кроме занятых уже мест), и повторять, пока не скопируем все элементы в выходной массив. |
|
Вернуться к началу |
|
|
Aragaer
Зарегистрирован: 28.03.2005 Сообщения: 164
|
Добавлено: Вс Мар 05 2006 05:02 Заголовок сообщения: |
|
|
"линейно-конгруэнтный" метод:
Выбрать число C, взаимнопростое с длиной массива и произвольное число N1. После чего i-й элемент поместить в ячейку номер C*i+N1 mod N (N - длина массива). _________________ Open your eyes.
And Awaken. |
|
Вернуться к началу |
|
|
dipsy
Зарегистрирован: 26.01.2005 Сообщения: 424 Откуда: Н. Новгород
|
Добавлено: Пн Мар 06 2006 15:03 Заголовок сообщения: |
|
|
Надо написать рекурентную функцию для n элементов.
Для двух элементов, - можно перечислить рукамии.
Для трёх и более элементов, - берём первый элемент, - ставим на первое место, остальные перемешиваем.
Берём второй, ставим на первое место, - остальные n-1 перемешиваем.
Ну и т.д. Сколько бы элементов мы не взяли, - теоретически мы можем это всё перемешать.
Ни одна комбинация не повторится.
Другое дело, - то что кол-во вычислений здесь растёт как n! ( даже ещё быстрее, но это не важно ), - а значит это решение будет считаться плохим для компьютера, - т.к. надо, чтобы кол-во вычислений росло как n^2 в худшем случае. |
|
Вернуться к началу |
|
|
grf
Зарегистрирован: 05.04.2005 Сообщения: 1242 Откуда: Москва
|
Добавлено: Вт Мар 07 2006 13:57 Заголовок сообщения: |
|
|
Количество комбинаций ограничено.
Тебе необходимо перебрать все комбинации или некоторое число их?
Или необходимо создать вид случайной комбинации, когда на первый взгляд комбинации разные, но они могут повторяться, например возмем четыре числа:
1 2 3 4
2 3 4 1 х
3 2 4 1
2 3 4 1 х
4 3 1 2
2 3 1 4 |
|
Вернуться к началу |
|
|
GREA
Зарегистрирован: 14.05.2003 Сообщения: 758 Откуда: Новосибирск
|
Добавлено: Пт Мар 10 2006 11:48 Заголовок сообщения: |
|
|
Aragaer писал(а): | "линейно-конгруэнтный" метод:
Выбрать число C, взаимнопростое с длиной массива и произвольное число N1. После чего i-й элемент поместить в ячейку номер C*i+N1 mod N (N - длина массива). |
Возможны коллизии |
|
Вернуться к началу |
|
|
|