最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

數(shù)據(jù)結(jié)構(gòu)之堆詳解

 更新時間:2014年08月28日 09:18:16   投稿:junjie  
這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu)之堆詳解,本文講解了堆的基本常識堆的基本操作、堆的應(yīng)用等內(nèi)容,需要的朋友可以參考下

1. 概述

堆(也叫優(yōu)先隊列),是一棵完全二叉樹,它的特點是父節(jié)點的值大于(小于)兩個子節(jié)點的值(分別稱為大頂堆和小頂堆)。它常用于管理算法執(zhí)行過程中的信息,應(yīng)用場景包括堆排序,優(yōu)先隊列等。

2. 堆的基本操作

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

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

復(fù)制代碼 代碼如下:

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)
該操作主要是將數(shù)組A轉(zhuǎn)化成一個大頂堆。思想是,先找到堆的最后一個非葉子節(jié)點(即為第n/2個節(jié)點),然后從該節(jié)點開始,從后往前逐個調(diào)整每個子樹,使之稱為堆,最終整個數(shù)組便是一個堆。
復(fù)制代碼 代碼如下:

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

2.3 GetMaximum(A,n)
該操作主要是獲取堆中最大的元素,同時保持堆的基本性質(zhì)。堆的最大元素即為第一個元素,將其保存下來,同時將最后一個元素放到A[1]位置,之后從上往下調(diào)整A,使之成為一個堆。
復(fù)制代碼 代碼如下:

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,同時保持堆的性質(zhì)。算法思想是,將t放到A的最后,然后從該元素開始,自下向上調(diào)整,直至A成為一個大頂堆。
復(fù)制代碼 代碼如下:

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.  堆的應(yīng)用

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

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

【解析】取前100 萬個整數(shù),構(gòu)造成了一棵數(shù)組方式存儲的具有小頂堆,然后接著依次取下一個整數(shù),如果它大于最小元素亦即堆頂元素,則將其賦予堆頂元素,然后用Heapify調(diào)整整個堆,如此下去,則最后留在堆中的100萬個整數(shù)即為所求 100萬個數(shù)字。該方法可大大節(jié)約內(nèi)存。
3.3 一個文件中包含了1億個隨機整數(shù),如何快速的找到最大(小)的100萬個數(shù)字?(時間復(fù)雜度:O(n lg k))

4. 總結(jié)

堆是一種非?;A(chǔ)但很實用的數(shù)據(jù)結(jié)構(gòu),很多復(fù)雜算法或者數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)就是堆,因而,了解和掌握堆這種數(shù)據(jù)結(jié)構(gòu)顯得尤為重要。

5. 參考資料

(1)經(jīng)典算法教程《算法導(dǎo)論》

相關(guān)文章

  • OpenMP?Parallel?Construct的實現(xiàn)原理詳解

    OpenMP?Parallel?Construct的實現(xiàn)原理詳解

    在本篇文章當中我們將主要分析?OpenMP?當中的?parallel?construct?具體時如何實現(xiàn)的,以及這個?construct?調(diào)用了哪些運行時庫函數(shù),并且詳細分析這期間的參數(shù)傳遞,需要的可以參考一下
    2023-01-01
  • C++中的new/delete、構(gòu)造/析構(gòu)函數(shù)、dynamic_cast分析

    C++中的new/delete、構(gòu)造/析構(gòu)函數(shù)、dynamic_cast分析

    這篇文章主要介紹了C++中的new/delete、構(gòu)造/析構(gòu)函數(shù)、dynamic_cast分析 本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-05-05
  • C語言詳細講解二分查找用法

    C語言詳細講解二分查找用法

    二分查找法,又叫做折半查找法,它是一種效率較高的查找方法。但是,折半查找要求線性表必須采用順序存儲結(jié)構(gòu),而且表中元素按關(guān)鍵字有序排列
    2022-04-04
  • C++計算ICMP頭的校驗和實例

    C++計算ICMP頭的校驗和實例

    這篇文章主要介紹了C++計算ICMP頭的校驗和的方法,代碼簡單實用,對于校驗ICMP報文來說有不錯的實用價值,需要的朋友可以參考下
    2014-10-10
  • C語言枚舉的使用以及作用

    C語言枚舉的使用以及作用

    這篇文章主要介紹了C語言枚舉的使用以及使用,閱讀下面內(nèi)容我們將掌握枚舉的相關(guān)概念、掌握枚舉的幾種用法、掌握枚舉在實際產(chǎn)品中的用法,需要的朋友可以參考一下
    2022-03-03
  • 如何使用visual studio2019創(chuàng)建簡單的MFC窗口(使用C++)

    如何使用visual studio2019創(chuàng)建簡單的MFC窗口(使用C++)

    這篇文章主要介紹了如何使用visual studio2019創(chuàng)建簡單的MFC窗口(使用C++),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • 手動添加bits/stdc++.h到vs2017的詳細步驟

    手動添加bits/stdc++.h到vs2017的詳細步驟

    這篇文章主要介紹了手動添加bits/stdc++.h到vs2017的詳細步驟,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • C++20 格式化字符串的實現(xiàn)

    C++20 格式化字符串的實現(xiàn)

    本文主要講述了C++20中新引入的std::format功能,該功能用于格式化字符串,提供了一種簡潔、類型安全且靈活的方式來構(gòu)建格式化字符串,文章從使用場景、格式化規(guī)則、自定義類型的格式化等方面進行了詳細的介紹,感興趣的可以了解一下
    2024-10-10
  • C++中delete指針后最好將其置空的操作方法

    C++中delete指針后最好將其置空的操作方法

    C++編程中,當你使用delete運算符釋放指針所指向的內(nèi)存后,通常將該指針置空,如果一個指針在被刪除后沒有置空,而你在代碼的其他部分再次嘗試刪除同一個指針,可能會導(dǎo)致程序崩潰或產(chǎn)生未定義行為,本文介紹C++中delete指針后最好將其置空的操作方法,感興趣的朋友一起看看吧
    2024-06-06
  • Qt簡單編程實現(xiàn)UDP通訊

    Qt簡單編程實現(xiàn)UDP通訊

    UDP數(shù)據(jù)報協(xié)議是一個面向無連接的傳輸層報文協(xié)議,它簡單易用,不存在?TCP協(xié)議“粘包”的問題,下面我們就來看看如何使用qt簡單實現(xiàn)UDP通訊吧
    2024-04-04

最新評論

德江县| 财经| 新昌县| 喀喇沁旗| 和田市| 平罗县| 晋城| 岳阳市| 平江县| 沁源县| 资溪县| 广南县| 祁东县| 兴宁市| 东乡县| 喜德县| 维西| 屯留县| 巴南区| 罗田县| 蓬安县| 鞍山市| 沁源县| 天祝| 兴业县| 沅江市| 五常市| 宾川县| 潞西市| 林芝县| 青田县| 洱源县| 顺义区| 晋州市| 大化| 清新县| 郧西县| 惠来县| 尼木县| 石城县| 湖州市|