证明Heap算法生成排列

时间:2013-11-10 20:21:15

标签: algorithm permutation pseudocode

我需要证明Heap算法的正确性,以生成排列。它的伪代码如下:

HeapPermute(n)
//Implements Heap’s algorithm for generating permutations
//Input: A positive integer n and a global array A[1..n]
//Output: All permutations of elements of A
if n = 1
   write A
else
   for i ←1 to n do
   HeapPermute(n − 1)
   if n is odd
      swap A[1] and A[n]
   else swap A[i] and A[n]

(取自Levitin设计和分析算法的介绍)

我知道我需要使用归纳来证明其正确性,但我不确定如何去做。我已经证明了数学方程式而不是算法。

我认为证据看起来像这样......

1) For n = 1, heapPermute is obviously correct. {1} is printed. 
2) Assume heapPermute() outputs a set of n! permutations for a given n. Then 
??

我只是不确定如何完成诱导步骤。我甚至在这里正确的轨道?任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

是的,这听起来不错。考虑如何递归地定义一组所有排列,即如何{1..n}的排列可以用{1.. n-1}的排列来表达。为此,请回想一下有n!个排列的归纳证明。归纳步骤如何进行?

答案 1 :(得分:1)

  
      
  1. 对于n = 1,heapPermute显然是正确的。打印{1}。
  2.   
  3. 假设heapPermute()输出一组n!给定n的排列。然后
  4.   
  5. ...
  6.   

现在,根据前两个假设,显示heapPermutate(n+1)返回所有(n + 1)!排列。

答案 2 :(得分:0)

递归方法绝对是可行的方法。鉴于您的前两个步骤,为了证明heapPermutate(n+1)返回所有$(n + 1)!$排列,您可能需要解释每个元素是否与其余元素的每个排列相邻。

如果您希望通过示例查看解释,this blog post提供了一个解释。