【问题标题】:Heap’s algorithm wiki picture vs algorithmHeap 的算法 wiki 图片 vs 算法
【发布时间】:2021-06-09 01:53:29
【问题描述】:

我正在尝试从 Wikipedia 页面了解 Heap 的算法,我正在尝试将图片与算法进行比较,但我似乎无法弄清楚

这张图片来自维基百科页面

为什么要先切换#1和#2,不应该先切换#1和#4吗?

我使用的是java,但这只是从维基百科复制的代码,我知道一般代码都涉及切换

    if k = 1 then
        output(A)
    else
        // Generate permutations with kth unaltered
        // Initially k == length(A)
        generate(k - 1, A)

        // Generate permutations for kth swapped with each k-1 initial
        for i := 0; i < k-1; i += 1 do
            // Swap choice dependent on parity of k (even or odd)
            if k is even then
                swap(A[i], A[k-1]) // zero-indexed, the kth is at k-1
            else
                swap(A[0], A[k-1])
            end if
            generate(k - 1, A)

        end for
    end if

k 最初是 4,所以它不会先切换 A[0] 和 A[3] 吗?

如果这是一个愚蠢的问题,请提前道歉......

【问题讨论】:

    标签: heaps-algorithm


    【解决方案1】:

    k &gt; 1 时,它做的第一件事就是递归。所以,电话开始了:

    generate(4,A) calls
      generate(3,A) calls
        generate(2,A) calls
          generate(1,A) which prints A
          Now we do the processing for k==2.
          swap(0,1)
          generate(1,A) which prints the new A
          etc.
        
    

    【讨论】:

    • 对不起,如果这是另一个愚蠢的问题,那么 generate(4,A), generate(3,A), generate(2,A), generate(1,A) 是什么?跨度>
    • 原来的调用是要调用generate(4,A),对吧?你有 4 件事要交换,你正在传递数组 A。generate 要做的第一件事是调用generate(k-1,A)。由于 k 为 4,因此结果为 generate(3,A)
    • 好吧,这就是神秘性的来源......它们就像跟踪一切的虚拟变量,神秘性来自算法的拆分方式,以及生成(4,A), generate(3,A),generate(2,A),generate(1,A) 似乎不知从何而来......但实际上它是一个巧妙的会计技巧,包含多个移动部件
    • 这就是递归的工作原理。这就是这个概念的基础。
    猜你喜欢
    • 2021-11-30
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    • 1970-01-01
    相关资源
    最近更新 更多