【问题标题】:Variation of permutation of an array containing Integers包含整数的数组的排列变化
【发布时间】:2013-01-20 14:30:54
【问题描述】:

给定一个整数数组,编写一个程序来打印数组中数字的所有排列。输出应按非升序排序。

例如对于数组{12, 4, 66, 8, 9},输出应该是:

9866412
9866124
9846612
....
....
1246689

我想同时生成所有排列,将它们插入BST,然后在BST 上执行反向排序。 这似乎效率很低,因为我正在存储排列,我们可以做得更好吗?

【问题讨论】:

  • 我们可以做得更好。例如,我们可以针对该问题进行网络搜索。或者我们可以请一群人为我们做这项工作。
  • @doomster 的人们在对这个问题进行了大量研究并自己付出了很多努力之后才在这里发帖。你认为stackoverflow如果是什么?我觉得对我来说这是讨论我觉得难以解决的问题,或者当我觉得可能存在更优化的版本时。有时当我遇到一些与办公室工作有关的问题时,我什至会把这个问题发布到这里,以便与这里的人讨论。如果您称其为“一群人为您做这项工作”.. 让它为您服务,为我讨论

标签: arrays algorithm data-structures permutation


【解决方案1】:

c++ STL:

向量 arr = .. 排序(arr.begin(),arr.end())

{
// 在此处处理您的数据
}while(next_permutation(arr.begin(),arr.end());

这在 O(2^n) 中为你做你想做的事。在内部,它通过有效的方式交换来实现。如果您需要进一步的帮助,请告诉我

【讨论】:

    【解决方案2】:

    首先使用数字对数字进行排序(也许将它们转换为字符串)。例如,9 大于 11。您可以为此实现简单的插入排序。
    所以现在你有一个以这种方式排序的数字列表(比如说 n1、n2、n3、n4)。
    使用此列表,您可以轻松获得所有已排序的排列,合并列表中的元素并在生成过程中交换最后一个。
    即:n1n2n3n4、n1n2n4n3、n1n3n2n4……等等。

    示例:
    4、11、76、100
    100、11、4、76
    10011476, 10011764, 10041176...

    关于复杂性:排序采用k*n^2(使用插入排序,因为它已经到位,您可以节省内存),k 是数字的最长大小(示例中为 3,由数字 100 给出),因为如果有相似的数字,您需要比较它们的所有数字(如 10000 和 100001)。然后你只需要生成所有排列,这需要n!。最终时间复杂度为O(n!),不需要额外的空间。

    【讨论】:

      【解决方案3】:

      如果您使用 Python,模块 itertools 有解决方案,请参阅here

      如果您可以访问 Knuth 的计算机编程艺术第 4 卷,分册 2,它有许多解决方案,包括递归和迭代。

      此外,RosettaCode 有多种语言的解决方案,请参阅here。 Fortran 77 解决方案是迭代的,您可以对其进行调整以满足您的需求,或将其翻译成任何语言。它以字典升序给出解决方案。

      现在,如果我不明白您在问什么,您需要按降序排列的解决方案,考虑连接数字字符串的顺序。直接实现可能很困难,因为例如(100,99,999)谁“小于”(99,100,999),这将小于(999,99,100):“10099999”

      【讨论】:

        【解决方案4】:

        出于推理,我会递归地做:

        • 如果数组的长度为 1,则输出一个排列(数组本身)
        • 如果有两个或更多元素,请一次选择一个元素(先选择最大的元素,然后再选择较小的元素,直到找到最小的元素)。对于选择的每个元素 a,您执行以下操作:
          • 从数组中删除a,得到一个比原数组少一个元素的数组。 递归地生成这个新获得的数组的所有排列,并在每个递归生成的排列前面加上a

        这种方法基本上对应于您将排列存储在搜索树(但是,不是二叉树)中并枚举它们的想法。不过,它使用递归堆栈来执行此操作,并且不存储整个树。

        另一种方法可能使用factorial number system。这可用于正确枚举排列。所以你可以“只倒数并重建相应的排列”。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-02-03
          • 1970-01-01
          • 2013-08-04
          • 2017-05-03
          • 1970-01-01
          • 1970-01-01
          • 2015-03-04
          相关资源
          最近更新 更多