資料結構之堆詳解_C 語言

來源:互聯網
上載者:User

1. 概述

堆(也叫優先隊列),是一棵完全二叉樹,它的特點是父節點的值大於(小於)兩個子節點的值(分別稱為大頂堆和小頂堆)。它常用於管理演算法執行過程中的資訊,應用情境包括堆排序,優先隊列等。

2. 堆的基本操作

堆是一棵完全二叉樹,高度為O(lg n),其基本操作至多與樹的高度成正比。在介紹堆的基本操作之前,先介紹幾個基本術語:

A:用於表示堆的數組,下標從1開始,一直到n
PARENT(t):節點t的父節點,即floor(t/2)
RIGHT(t):節點t的左孩子節點,即:2*t
LEFT(t):節點t的右孩子節點,即:2*t+1
HEAP_SIZE(A):堆A當前的元素數目
下面給出其主要的四個操作(以大頂堆為例):
2.1 Heapify(A,n,t)
該操作主要用於維持堆的基本性質。假定以RIGHT(t)和LEFT(t)為根的子樹都已經是堆,然後調整以t為根的子樹,使之成為堆。

複製代碼 代碼如下:

void Heapify(int A[], int n, int t)
 
{
 
  int left = LEFT(t);
 
  int right = RIGHT(t);
 
  int max = t;
 
  if(left <= n)     max = A[left] > A[max] ? left : max;
 
  if(right <= n)     max = A[right] > A[max] ? right : max;
 
  if(max != A[t])
 
  {
 
    swap(A, max, t);
 
    Heapify(A, n, max);
 
  }
 
}

2.2  BuildHeap(A,n)
該操作主要是將數組A轉化成一個大頂堆。思想是,先找到堆的最後一個非葉子節點(即為第n/2個節點),然後從該節點開始,從後往前逐個調整每個子樹,使之稱為堆,最終整個數組便是一個堆。
複製代碼 代碼如下:

void BuildHeap(int A[], int n)
 
{
 
  int i;
 
  for(i = n/2; i<=n; i++)
 
  Heapify(A, n, i);
 
}

2.3 GetMaximum(A,n)
該操作主要是擷取堆中最大的元素,同時保持堆的基本性質。堆的最大元素即為第一個元素,將其儲存下來,同時將最後一個元素放到A[1]位置,之後從上往下調整A,使之成為一個堆。
複製代碼 代碼如下:

void GetMaximum(int A[], int n)
 
{
 
  int max = A[1];
 
  A[1] = A[n];
 
  n--;
 
  Heapify(A, n, 1);
 
  return max;
 
}

2.4  Insert(A, n, t)
向堆中添加一個元素t,同時保持堆的性質。演算法思想是,將t放到A的最後,然後從該元素開始,自下向上調整,直至A成為一個大頂堆。
複製代碼 代碼如下:

void Insert(int A[], int n, int t)
 
{
 
  n++;
 
  A[n] = t;
 
  int p = n;
 
  while(p >1 && A[PARENT(p)] < t)
 
  {
 
    A[p] = A[PARENT(p)];
 
    p = PARENT(p);
 
  }
 
  A[p] = t;
 
  return max;
 
}

3.  堆的應用

3.1  堆排序
堆的最常見應用是堆排序,時間複雜度為O(N lg N)。如果是從小到大排序,用大頂堆;從大到小排序,用小頂堆。

3.2  在O(n lg k)時間內,將k個排序表合并成一個排序表,n為所有有序表中元素個數。

【解析】取前100 萬個整數,構造成了一棵數組方式儲存的具有小頂堆,然後接著依次取下一個整數,如果它大於最小元素亦即堆頂元素,則將其賦予堆頂元素,然後用Heapify調整整個堆,如此下去,則最後留在堆中的100萬個整數即為所求 100萬個數字。該方法可大大節約記憶體。
3.3 一個檔案中包含了1億個隨機整數,如何快速的找到最大(小)的100萬個數字?(時間複雜度:O(n lg k))

4. 總結

堆是一種非常基礎但很實用的資料結構,很多複雜演算法或者資料結構的基礎就是堆,因而,瞭解和掌握堆這種資料結構顯得尤為重要。

5. 參考資料

(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.