перестановки, выбранные из множества S, содержащего m элементов, в другой список длиной N (N> m) - PullRequest
1 голос
/ 01 октября 2019

Я прочитал несколько реализаций, например: Каков наилучший способ найти все комбинации элементов в массиве?

Что приятно в их реализации, так это то, что многие из них являются универсальными,не только массив int (или, что еще хуже, массив только положительных int)

Однако я не могу найти то, что может принимать элементы, которые являются массивом (массив имен "S") размера m. Взяв элементы из массива "S", поместите их в другой массив "P" размером n (с n меньше m, общее ограничение, которое я не понимаю).

Например,

S = [-1, 1]

P[j] = [1,1,1,1], [1, -1, 1, 1], [1, -1, -1, 1], [1, -1, -1, -1], [-1, -1, -1, -1], ... [-1, 1, 1, -1], [1, -1, -1, 1], [-1, 1, -1, 1], [1, -1, 1, -1]

j = permutations = 0 ... pow(m,n), in this example pow(2, 4) = 16 

Что-нибудь в C # или Python, пожалуйста?

Кроме того, сложность времени ...

Ссылки:

Как лучше всего найти все комбинации элементов в массиве?

https://codereview.stackexchange.com/questions/194967/get-all-combinations-of-selecting-k-elements-from-an-n-sized-array?newreg=92ded52aec7b4f9aaf161db14d07ee7a

Ответы [ 3 ]

1 голос
/ 02 октября 2019

Csharp версия (Не разрешать смешанный тип. Также размер> 100 может привести к поломке вашего компьютера)

        static IEnumerable<IEnumerable<T>> Permutations<T>(IEnumerable<T> set, int size)
        {
            Stack<IList<T>> stack = new Stack<IList<T>>();
            foreach(var item in set)
            {
                var list = new List<T>() { item };
                stack.Push(list);
            }

            while(stack.Count>0)
            {
                var next = stack.Pop();
                if(next.Count==size)
                {
                    yield return next;
                }
                else
                {

                    foreach(var item in set)
                    {
                        var list = new List<T>();
                        list.AddRange(next);
                        list.Add(item);
                        stack.Push(list);
                    }
                }
            }
        }

Для использования:

            int[] possibleValues = new int[] { -1, 1 };
            var permutations = Permutations(possibleValues, 4);
            foreach(var permutation in permutations)
            {
                foreach (int x in permutation)
                {
                    Console.Write($"{x} \t");
                }
            }
1 голос
/ 03 октября 2019
import itertools

size = 4

for S in list ( itertools . product ([1 , -1] , repeat = size )):
1 голос
/ 01 октября 2019

Хотелось бы что-нибудь подобное?

def f(ms, k):
  stack = [[m] for m in ms]
  while stack:
    next = stack.pop()
    if len(next) == k:
      yield next
    else:
      stack.extend([(next[:] + [m]) for m in ms])

print([comb for comb in f([-1, 1], 4)])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...