LINUX.ORG.RU

Получить все возможные комбинации массива

 


0

1

Приветствую!

Интересует, каким образом наиболее грамотно решить следующую задачу.

Есть массив array('a','b','c','d') нужно в цикле сортировать этот массив так, что бы он преобразовывался в array('a','c','b','d'), array('a','d','c','b'), array('b','a','c','d') и т. д., пока не переберет все возможные варианты расположения элементов (количество элементов от 3 до 8, если это имеет какое-то значение). Гугл не помог, стандартных функций, которые это реализуют, не нашел, возможно не то искал, ибо в php пока не очень силен. Подскажите, если кто знает, как это правильно реализовать.

Спасибо!



Последнее исправление: cetjs2 (всего исправлений: 3)

man Декартово произведение

но как это сделать на ПХП, чтобы в процессе не образовалась тонна мусора еще более интересный вопрос.

Macil ★★★★★
()

каким образом наиболее грамотно решить следующую задачу.

искать в гугле по словам «php array permutation» - там этого настолько завались, что не стоит этим портить ЛОР :-)

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

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

dronozavr
() автор топика
Ответ на: комментарий от dronozavr

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

откуда-ж вы такие берётесь то? сначала посмотри что тебе посоветовали, а потом высказывай суждения. permutation - это именно ПЕРЕСТАНОВКА, как правило последовательная, одна за другой. И именно этому посвещены первые несколько страниц выдачи гугла по приведённым ключевым словам.

MKuznetsov ★★★★★
()

Кнут, Искусство программирования. Том 1. 1.2.5 Перестановки и факториалы.

aedeph_ ★★
()

на правах рекламы:

import itertools
itertools.permutations(['a', 'b', 'c', 'd'])
zz ★★★★
()

google: php + permutations

anonymous
()

если велосипедить генерацию перестановок начиная с возрастяющей [а,б,в,г] перебрав все в порядке лексикографическом до [г,в,б,а]

то алго элементарен.

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

а б в

а в б

в а б

в б а

-----лол ---лол

а а б а б а б а а ----лол ---лол

аааббссс ааабсбсс ааабссбс ааабсссб ааасббсс ааасбсбс и так далее.

qulinxao ★★☆
()

А головой подумать?

  1. Берёшь первый элемент массива.
  2. Берёшь все возможные перестановки оставшихся элементов массива.
  3. Для каждого варианта помещаешь первый элемент на каждую позицию. .....
  4. Выгода!!!!!

Собственно, записывается один-в-один

(define (perm l)
  (define (pl x l acc buff)
    (let ((new-acc (cons (append buff (list x) l) acc)))
      (if (null? l) new-acc
          (pl x (cdr l) new-acc (cons (car l) buff)))))
  (if (< (length l) 2) (list l)
      (fold (lambda (xl acc) (append (pl (car l) xl '() '()) acc)) '() (perm (cdr l)))))

Пых-пыха не знаю, так что сам как-нибудь перепишешь.

harm
()
Ответ на: комментарий от ugoday

А мне кажется что нет.

Вот в sicp эта функция объявлена так:

(define (permutations s)
  (if (null? s)
      (list nil)
      (flatmap (lambda (x)
                 (map (lambda (p) (cons x p))
                      (permutations (remove x s))))
               s)))
все просто, объявления функций flatmap и remove так же просты. А в коде выше всё в кучу свалено.

crowbar
()
Ответ на: комментарий от ugoday

Мериться письками --- уважаемое занятие. Но, вот, меряться чужой? Не-не-не, без меня.

Это просто новое слово в искусстве слива. Продолжай развивать это направление.

crowbar
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.