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

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

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

1. 概述

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

2. 堆的基本操作

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

A:用于表示堆的數(shù)組,下標(biāo)從1開始,一直到n
PARENT(t):節(jié)點(diǎn)t的父節(jié)點(diǎn),即floor(t/2)
RIGHT(t):節(jié)點(diǎn)t的左孩子節(jié)點(diǎn),即:2*t
LEFT(t):節(jié)點(diǎn)t的右孩子節(jié)點(diǎn),即:2*t+1
HEAP_SIZE(A):堆A當(dāng)前的元素?cái)?shù)目
下面給出其主要的四個(gè)操作(以大頂堆為例):
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)化成一個(gè)大頂堆。思想是,先找到堆的最后一個(gè)非葉子節(jié)點(diǎn)(即為第n/2個(gè)節(jié)點(diǎn)),然后從該節(jié)點(diǎn)開始,從后往前逐個(gè)調(diào)整每個(gè)子樹,使之稱為堆,最終整個(gè)數(shù)組便是一個(gè)堆。
復(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)
該操作主要是獲取堆中最大的元素,同時(shí)保持堆的基本性質(zhì)。堆的最大元素即為第一個(gè)元素,將其保存下來,同時(shí)將最后一個(gè)元素放到A[1]位置,之后從上往下調(diào)整A,使之成為一個(gè)堆。
復(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)
向堆中添加一個(gè)元素t,同時(shí)保持堆的性質(zhì)。算法思想是,將t放到A的最后,然后從該元素開始,自下向上調(diào)整,直至A成為一個(gè)大頂堆。
復(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)用是堆排序,時(shí)間復(fù)雜度為O(N lg N)。如果是從小到大排序,用大頂堆;從大到小排序,用小頂堆。

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

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

4. 總結(jié)

堆是一種非常基礎(chǔ)但很實(shí)用的數(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的實(shí)現(xiàn)原理詳解

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

    在本篇文章當(dāng)中我們將主要分析?OpenMP?當(dāng)中的?parallel?construct?具體時(shí)如何實(shí)現(xiàn)的,以及這個(gè)?construct?調(diào)用了哪些運(yùn)行時(shí)庫函數(shù),并且詳細(xì)分析這期間的參數(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分析 本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-05-05
  • C語言詳細(xì)講解二分查找用法

    C語言詳細(xì)講解二分查找用法

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

    C++計(jì)算ICMP頭的校驗(yàn)和實(shí)例

    這篇文章主要介紹了C++計(jì)算ICMP頭的校驗(yàn)和的方法,代碼簡單實(shí)用,對(duì)于校驗(yàn)ICMP報(bào)文來說有不錯(cuò)的實(shí)用價(jià)值,需要的朋友可以參考下
    2014-10-10
  • C語言枚舉的使用以及作用

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

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

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

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

    手動(dòng)添加bits/stdc++.h到vs2017的詳細(xì)步驟

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

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

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

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

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

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

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

最新評(píng)論

翁牛特旗| 三台县| 青岛市| 马关县| 依安县| 获嘉县| 三亚市| 新巴尔虎右旗| 六安市| 潼南县| 怀宁县| 项城市| 饶平县| 长顺县| 尼玛县| 汝南县| 上饶县| 长白| 阜康市| 旬邑县| 大方县| 蒲城县| 孙吴县| 来凤县| 伊川县| 习水县| 精河县| 陇川县| 铜陵市| 南京市| 宣武区| 申扎县| 诸城市| 东宁县| 霍城县| 吴川市| 连城县| 昆山市| 定日县| 光山县| 青龙|