zoukankan      html  css  js  c++  java
  • 算法导论 第六章 堆排序 6.5-8

    题目描述

    6.5-8HEAP-DELETE(A,i)操作能过将结点i从堆A中删除。对于一个包括n个元素的堆,请设计一个能够在O(lg n)时间内完成的HEAP-DELETE操作。

    思路:把堆中的最后一个元素A[A.heap-size]放到结点i上,然后A.heap-size - 1.

    分三种情况:

    (1) A[A.heap-size] = A[i] 无需调整,时间复杂度为O(1).

    (2) A[A.heap-size] > A[i] 调用HEAP-INCREASE-KEY(A, i, key) 时间复杂度为O(lg n).

    (3) A[A.heap-size] < A[i] 调用MAX-HEAPIEY(A, i),维护堆的性质,时间复杂度为O(lg n).

     1 class TestController extends Controller{
     2     /**
     3      * 维护堆的性质. 
     4      * 
     5      * @param  Array $a 
     6      * @param  int $i 
     7      * @param  int $heapsize
     8      * @access public
     9      * @return void
    10      */
    11     public function MaxHeapify($a, $i, $heapsize){
    12         $largest = 0;
    13         $left = 2*$i;
    14         $right = (2*$i)+1;
    15         $temp = 0;
    16         if ($left <= $heapsize && $a[$left] > $a[$i]) {
    17             $largest = $left;
    18         }else {
    19             $largest = $i;
    20         }
    21         if ($right <= $heapsize && $a[$right] > $a[$largest]) {
    22             $largest = $right;
    23         }
    24         if ($largest != $i) {
    25             $temp = $a[$i];
    26             $a[$i] = $a[$largest];
    27             $largest = $temp;
    28             $this::MaxHeapify($a, $largest, $heapsize);
    29         }
    30     }
    31     /**
    32      * 增加某个键的值. 
    33      * 
    34      * @param  Array $a 
    35      * @param  int $i 
    36      * @param  int $heapsize
    37      * @access public
    38      * @return void
    39      */
    40     public function HeapIncreaseKey($a, $i, $key,$heapsize){
    41         $parent = floor($i/2);
    42         $temp = 0;
    43         if ($key < $a[$i]) {
    44             return "have a problem";
    45         }
    46         $a[$i] = $key;
    47         while ($i <= 1 && $a[$parent] < $a[$i]) {
    48             $temp = $a[$parent];
    49             $a[$parent] = $a[$i];
    50             $a[$i] = $temp;
    51         }
    52     }
    53     /**
    54      * 删除键. 
    55      * 
    56      * @param  Array $a 
    57      * @param  int $i 
    58      * @param  int $heapsize
    59      * @access public
    60      * @return void
    61      */
    62     public function HeapDelete($a, $i, $heapsize){
    63         $temp = $a[$heapsize];
    64         if ($heapsize < 1) {
    65             return "have a problem";
    66         }
    67         if ($a[$heapsize] == $a[$i]) {
    68             $heapsize = $heapsize - 1;
    69         }elseif ($a[$heapsize] > $a[$i]) {
    70             $this::HeapIncreaseKey($a, $i, $a[$heapsize], $heapsize);
    71         }elseif ($a[$heapsize] < $a[$i]) {
    72             $this::MaxHeapify($a, $i, $heapsize);
    73         }
    74         $heapsize = $heapsize - 1;
    75         return $a;
    76     }
    77 }
  • 相关阅读:
    【设计】概要设计-详细设计-到底需要输出什么???
    【Java】Eclipse代码格式化-代码模板
    【Scala】Scala学习资料
    【Java】阿里巴巴Java开发手册(纪念版)
    【Storm】学习笔记
    【HBase】学习笔记
    【Hadoop】Combiner的本质是迷你的reducer,不能随意使用
    【Hadoop】mapreduce采用多进程与spark采用多线程比较
    【ES】elasticsearch学习笔记
    【MySQL】MySQL统计NULL字段处理
  • 原文地址:https://www.cnblogs.com/Ronnie-97/p/12896142.html
Copyright © 2011-2022 走看看