2010-07-21 7 views
3

Учитывая список элементов, существует ли алгоритм перетасовки, который гарантирует, что в конечном итоге выбранная половина будет с одной стороны, а остальная часть - с другой?Как я могу перетасовать список без случайности и гарантировать, что часть элементов в конечном итоге появится с одной стороны?

Пример: {4, 3, 10, 7, 2, 9, 6, 8, 1, 5}

Учитывая установленное выше, я хотел бы иметь алгоритм смешивания, что в конечном итоге перемещает отмеченные слева, хотя сам алгоритм не знает, что есть и не «отмечен».

      {4, 3, 10, 7, 2, 9, 6, 8, 1, 5}
          Х               Х                       X     X               X

Приемлемые результаты были бы:
      {4, 10, 9, 6, 1, 3, 7, 2, 8, 5}
      {1 , 9, 10, 4, 6, 2, 8, 5, 7, 3}
      {1, 4, 9, 10, 6, 3, 7, 5, 8, 2} и т.д.

Сложность: Алгоритм не должен использовать случайные числа для смешивания содержимого, это должен быть итеративный процесс. Итак, Фишер-Йейтс не работает.

+0

Разве это не алгоритм быстрой сортировки? – DumbCoder

+0

чувствует себя как shenanigans =). Помечено один раз - позиции или цифры? – foret

+9

Я не вижу, как алгоритм, не знающий маркировки, может уважать маркировку. –

ответ

1

Будет std::next_permutation() быть тем, что вы хотите? (Так как он создает все возможные перестановки, он, в конце концов, также помещает отметку один раз влево.)

+0

Да, это на самом деле! Большое вам спасибо. Я собираюсь связать это с алгоритмом, который проверяет каждую сторону списка после каждой перестановки, чтобы увидеть, сбалансированы ли сегменты. – Tim

+2

@Tim: Учитывая скорость, с которой количество перестановок расширяется с размером строки, это, вероятно, будет _extremely_ slow. –

5

Разделите свой список на два списка - помечены и не отмечены. Перемешайте оба подсписок и поместите отмеченные с одной стороны, а затем - с другой. Теперь вы можете использовать любой перетасованный алгоритм, который вы хотите.

+0

+1 хотя я бы расширил его, чтобы выбрать половину случайным образом (то есть путем итерации по множеству и удаления каждого элемента с вероятностью одного). Иначе это приведет к тому, что только две половины будут меняться несколько раз (и каждая из них будет перегруппирована). –

+0

@Dave Боюсь, я не следую. Если вы просто выбираете их наугад во-первых, как это отличается от просто перетасовки? Возможно, я неправильно понял вопрос? – corsiKa

+0

Сам алгоритм должен быть слеп к тому, что есть и не помечен. Каждый результат итерации будет проверяться на достоверность, и если это недействительно, процесс продолжается. – Tim

0

Что-то вроде next_permutation выполнит эту работу, и (в конце концов) будет что-то вроде bogo sort. Любой из них в конечном итоге произведет любую возможную перестановку, включая все перестановки, которые вы считаете приемлемыми (наряду с каким-то произвольным числом, которое вы не знаете).

Сортировка Bogo показывает, что ваш: «Алгоритм не должен использовать случайные числа для смешивания содержимого, это должен быть итеративный процесс. Поэтому у Фишера-Йейта нет». является ложной дихотомией. Bogo сортирует беспорядочно и it iterative.

+0

Меньше ложной дихотомии и больше требований: я требую, чтобы алгоритм не использовал случайность, но я не говорю, что цель не может быть достигнута с использованием этого итерации. Скорее, Bogosort - это просто случайное перетасовка, пока не будет найден ответ. Хуже того, сложность случая: O (inf), а среднее значение O (n * n!). – Tim

0

Я думаю, что вы ищете алгоритм, который: * Может быть использован для отображения итерационного процесса для пользователя, который выглядит как перетасовка * Заканчивается с оригинальным набором разделяться на 2 (предварительно выбранных) групп, но случайным образом упорядоченных в пределах каждой группы

Кажется мне, что что-то просто может подойдет вам хорошо рассмотреть ваши десять цифр и с использованием терминологии, помеченные/немаркированным для групп этого алгоритма:

1. Randomly select two members of the set 
2. if swapping these two members would result in a marked number 
    being moved into positions 1-5 then forget about this swap and start again 
3. Swap these elements 
4. Check if positions 1-5 have ONLY marked elements, 
    if so you are done, otherwise start again 

Это не дает эффективное статистически хороший тасовать, как Фишер-Йейтс, но действительно дает вам хороший внешний вид на экране.