【问题标题】:Unique permutation generator?独特的排列生成器?
【发布时间】:2014-04-21 07:35:57
【问题描述】:

问题:我有一些数字列表,例如[1,1,2]。我需要生成独特的排列。排列是[1,1,2],[1,1,2],[1,2,1],[1,2,1],[2,1,1],[2,1,1]。我只需要生成唯一的排列,即[1,1,2],[1,2,1],[2,1,1]

我的尝试:我的第一次尝试是保留一组现有排列,并为itertools.permutations 生成器创建一个过滤器,该过滤器将使用该组过滤掉重复项。但是,出于效率原因,我宁愿一开始就不生成这些排列。即使是 12 个数字的小列表,也只有 1% 是唯一的。

我有一个想法,我似乎无法一直弄清楚:我可以创建列表中唯一值的排列,即[1,2],将剩余的数字放在所有不同的地方.

感谢您的帮助,明确地说,我不想过滤掉重复的排列,我只想首先生成唯一的排列。

【问题讨论】:

  • 您能否告诉您可以用来过滤某些重复项的最佳算法的顺序是什么?我想知道这一点,以便考虑一种具有更好顺序的预防算法(如果存在)。
  • 这里还有一个python答案stackoverflow.com/questions/6284396/…
  • ebarr,那里提出的解决方案似乎不起作用。我在 Python 中实现了它,它实际上并没有生成任何排列。我想我也明白了原因:函数是递归的。当用空集调用时,它返回一个空集。在执行过程中,如果它的子调用返回一个空集,它就会返回一个空集。因此,它深入研究,用一个空集调用自己,然后一直返回空集。我可能实现错了,因为它只是伪代码......如果需要,我可以展示我的 python 实现。
  • jrennie,这需要您在内存中拥有整个排列列表才能将其转换为集合。有 11 件物品会占用我机器内存的全部 4GB。我可以在 596GB 的硬盘上存储 13 件物品。 15 个项目,我将不得不求助于以 120 tb 处理某个服务器场上的列表...实际上,我有 256 个项目,我需要多个存储空间来存储排列。 (具体来说,我们的宇宙中的每个原子都需要一个宇宙,而这些宇宙中的每个原子都需要为我存储 1 个整数。)

标签: python algorithm permutation


【解决方案1】:

我从previous Stack Overflow answer 改编了这段代码:

def distinct_permutations(seq):
  from collections import Counter

  def perm_unique_helper(item_counts, perm, i):
    if i < 0:
      yield tuple(perm)
    else:
      for item in item_counts:
        if item_counts[item] <= 0:
          continue
        perm[i] = item
        item_counts[item] -= 1
        # In Python < 3.3 you can replace the yield from with a loop
        yield from perm_unique_helper(item_counts, perm, i - 1)
        item_counts[item] += 1

  item_counts = Counter(seq)
  L = len(seq)

  return perm_unique_helper(item_counts, [0] * L, L - 1)

我的笔记本电脑无法使用 set(permutations(seq)) 方法执行长度为 11 的输入序列,但使用此方法可以!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    相关资源
    最近更新 更多