PHP 優先隊列的實現

來源:互聯網
上載者:User

優先隊列其實就是一個最大堆,主要是對最大堆的操作上的一些調整

 1 <?php 2      #最大優先隊列的實現 3   4      #交換函數 5      function swap(&$arr, $inx1, $inx2) { 6          $temp = $arr[$inx1]; 7          $arr[$inx1] = $arr[$inx2]; 8          $arr[$inx2] = $temp; 9      }10      11      #最大堆節點下沉調整12      #@param $arr 待調整數組13      #@param $start 待調整數組的開始座標14      #@param $end 待調整數組的結束座標15      function max_heapify(&$arr, $start, $end) {16          $max_inx = $start;17  18          $left_inx = ($start + 1) * 2 - 1; #左孩子座標19          $rig_inx = $left_inx + 1; #右孩子座標20  21          if ($left_inx <= $end) { #如果存在左孩子,開始調整22              if ($arr[$left_inx] > $arr[$max_inx]) {23                  $max_inx = $left_inx;24              }25  26              if($rig_inx <= $end && $arr[$rig_inx] > $arr[$max_inx]) { #只有擁有左孩子才調整右孩子27                  $max_inx = $rig_inx;28              }29          }30  31          if ($max_inx != $start) {32              swap($arr, $max_inx, $start);33              max_heapify($arr, $max_inx, $end);34          }35      }36  37      #建立最大堆38      function build_max_heap(&$arr) {39          for ($i = floor(count($arr) / 2) - 1; $i >= 0; $i--) { #從最後一個非葉子節點開始調整數組,構建最大堆40              max_heapify($arr, $i, count($arr) - 1);41          }42      }43  44      #取出最大元素並刪除45      function heap_extract_max(&$arr) {46          $len = count($arr);47          swap($arr, 0, $len - 1); #首尾交換48  49          #保持最大堆性質50          $max = array_pop($arr);51          max_heapify($arr, 0, $len - 2);52          return $max;53      }      54  55      #插入一個比原值大的元素或插入一個新元素到隊列56      #@param $heap 待插入堆57      #@param $inx 待插入座標58      #@param $key 待插入值59      function heap_increase_key(&$heap, $inx, $key) {60          if ($inx >= count($heap)) {61              $heap[] = $key;62              $inx = count($heap) - 1;63          } else if ($heap[$inx] >= $key) {64              die("必須插入比原值大的Key");65          } else {66              $heap[$inx] = $key;67          }68  69          #開始調整節點,從插入值與其父母比較,如果比父母大,則上浮插入元素,直到比較到堆頂,否則退出比較70          while (($p = floor($inx / 2)) >= 0) {71              if ($heap[$p] < $heap[$inx]) {72                  swap($heap, $p, $inx);73                  $inx = $p;74              } else {75                  break;76              }77          }78      }79  80  81      $arr = array(1, 5, 7, 4, 2);82      build_max_heap($arr);83      print_r($arr);84      echo "<br>";85      heap_extract_max($arr);86      print_r($arr);87      echo "<br>";88      heap_increase_key($arr, 3, 10);89      print_r($arr);90      echo "<br>";91      heap_increase_key($arr, 10, 9);92      print_r($arr);93  ?>

 

Array ( [0] => 7 [1] => 5 [2] => 1 [3] => 4 [4] => 2 ) 
Array ( [0] => 5 [1] => 4 [2] => 1 [3] => 2 ) 
Array ( [0] => 10 [1] => 5 [2] => 1 [3] => 4 ) 
Array ( [0] => 10 [1] => 9 [2] => 5 [3] => 4 [4] => 1 )

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.