使用最少的更改次数将树转换为堆

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用最少的更改次数将树转换为堆相关的知识,希望对你有一定的参考价值。

给定k-ary树,我想将其转换为具有最小更改次数的最小堆。更改定义为重新标记节点。

我发现的一个解决方案是,我可以尝试更改节点值或不更改的dp解决方案。但它的时间复杂度会呈指数级增长吗?任何想法,(最好是最优证明)。

示例:说树是1-3,3-2,1-4,4-5。其中1是root。然后我可以将节点3重新标记为1或2,即1变化它变为最小堆。

答案

如果您只想确保树满足堆属性(存储在每个节点中的密钥小于或等于存储在节点子节点中的密钥),那么您应该能够使用类似构建的东西 - 堆算法,以O(n)运行。

考虑这棵树:

                    8
              -------------
             |      |      |
            15      6      19
           /       |    / |  
          7    3    5   12 9  22

现在,从下往上工作,你将每个节点尽可能地推到树下。也就是说,如果节点大于其子节点,则将其替换为其子节点中的最小节点,并在必要时直到达到叶级别为止。

例如,你看一个值为15的节点。它比它的最小子节点大,所以你交换它,制作子树:

           3
         /   
        7     15

此外,6个交换位置有5个,19个交换位置有9个,给你这棵树:

                    8
              -------------
             |      |      |
             3      5      9 
            /      |    / |  
           7  15    6   12 19  22

请注意,在叶级别的下一个节点,每个节点都小于其最小的子节点。

现在,根。由于规则是将节点与其最小的子节点交换,因此将8与3交换,给出:

                    3
              -------------
             |      |      |
             8      5      9 
            /      |    / |  
           7  15    6   12 19  22

但是你没有完成,因为8大于7.你用8交换8,你得到这棵树,符合你的条件:

                    3
              -------------
             |      |      |
             7      5      9 
            /      |    / |  
           8  15    6   12 19  22

如果树是平衡的,则整个过程具有复杂度O(n)。如果树严重不平衡,则复杂度为O(n ^ 2)。无论树的初始顺序如何,都有一种方法可以保证O(n),但它需要改变树的形状。

我不会声称算法保证任何给定树的“最小更改次数”。但是,我可以证明,对于平衡树,算法是O(n)。请参阅https://stackoverflow.com/a/9755805/56778,它解释了二进制堆。该解释也适用于d-ary堆。

以上是关于使用最少的更改次数将树转换为堆的主要内容,如果未能解决你的问题,请参考以下文章

算法leetcode每日一练2220. 转换数字的最少位翻转次数

算法leetcode每日一练2220. 转换数字的最少位翻转次数

LeetCode 2027. 转换字符串的最少操作次数

LeetCode 2027. 转换字符串的最少操作次数

BFS之单词最少转换次数

Leetcode刷题100天—2027. 转换字符串的最少操作次数(字符串)—day56