Алгоритм C++ для N! упорядочивания

У меня есть список объектов N, и я задаюсь вопросом, как я могу циклично выполниться через список для получения каждой комбинации. Существуют, не удваивается, таким образом, я должен получить весь N! упорядочивания. Дополнительная память не является никакой проблемой, я пытаюсь думать о самом простом алгоритме, но я испытываю затруднения.

5
задан sud03r 26 January 2010 в 19:23
поделиться

5 ответов

15
ответ дан 18 December 2019 в 06:22
поделиться

Расширение ответов на другие, вот пример std :: next_permution адаптирован из cplusplus.com

#include <iostream>
#include <algorithm>
using namespace std;

void outputArray(int* array, int size)
{
  for (int i = 0; i < size; ++i) { cout << array[i] << " "; }
}

int main ()
{
  int myints[] = { 1, 2, 3, 4, 5 };
  const int size = sizeof(myints);

  cout << "The 5! possible permutations with 5 elements:\n";

  sort (myints, myints + size);

  bool hasMorePermutations = true;
  do
  {
    outputArray(myints, size);
    hasMorePermutations = next_permutation(myints, myints + size);
  }
  while (hasMorePermutations);

  return 0;
}
8
ответ дан 18 December 2019 в 06:22
поделиться

Простой алгоритм с использованием рекурсии:

псевдокод

getPermutations(CurItemList , CurPermList)

if CurItemList.isempty()
    return CurPermList
else
    Permutations = {}

    for i = 1 to CurItemList.size() 
        CurPermList.addLast(CurItemList.get(i))

        NextItemList = CurItemList.copy()
        NextItemList.remove(i)

        Permutations.add(getPermutations(NextItemList, CurPermList))

        CurPermList.removeLast()


return Permutations

// To make it look better
Permutations(ItemList) 
    return getPermutations(ItemList, {})

Я не проверил его, но должен работать. Может быть, это не самый умный способ сделать это, но это простой способ. Если что-то не так, пожалуйста, дайте мне знать!

0
ответ дан 18 December 2019 в 06:22
поделиться

Для Java не забудьте взять на изменение GroupUnit и ().

-121--3926441-

Tomahawk имеет расширенные компоненты, такие как < t: inputText > , которые имеют атрибут forureId . Там вам придется установить его как < t: inputText ForureId = «levelone-leveltwo »/> - т.е. вы не сможете использовать автоматически созданные имена контейнеров.

Я бы посоветовал против такого - я не вижу веской причины, почему : следует изменить на -

-121--3302943-

Попробуйте создать набор комбинаций рекурсивно с фиксированным количеством возможных элементов. Набор всех возможных комбинаций будет объединением наборов комбинаций из 1 элемента, 2 элементов,... до N элементов.

Затем можно атаковать каждую комбинацию фиксированного размера по отдельности.

0
ответ дан 18 December 2019 в 06:22
поделиться

C ++ STL имеет Next_Permution для этой цели.

2
ответ дан 18 December 2019 в 06:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: