国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

說說你對堆的理解?如何實現(xiàn)?應用場景?

這篇具有很好參考價值的文章主要介紹了說說你對堆的理解?如何實現(xiàn)?應用場景?。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

說說你對堆的理解?如何實現(xiàn)?應用場景?

一、是什么

堆(Heap)是計算機科學中一類特殊的數(shù)據(jù)結構的統(tǒng)稱

堆通常是一個可以被看做一棵完全二叉樹的數(shù)組對象,如下圖:

說說你對堆的理解?如何實現(xiàn)?應用場景?

總是滿足下列性質:

  • 堆中某個結點的值總是不大于或不小于其父結點的值
  • 堆總是一棵完全二叉樹

堆又可以分成最大堆和最小堆:

  • 最大堆:每個根結點,都有根結點的值大于兩個孩子結點的值
  • 最小堆:每個根結點,都有根結點的值小于孩子結點的值

二、操作

堆的元素存儲方式,按照完全二叉樹的順序存儲方式存儲在一個一維數(shù)組中,如下圖:

說說你對堆的理解?如何實現(xiàn)?應用場景?

用一維數(shù)組存儲則如下:

[0, 1, 2, 3, 4, 5, 6, 7, 8]

根據(jù)完全二叉樹的特性,可以得到如下特性:

  • 數(shù)組零坐標代碼的是堆頂元素
  • 一個節(jié)點的父親節(jié)點的坐標等于其坐標除以2整數(shù)部分
  • 一個節(jié)點的左節(jié)點等于其本身節(jié)點坐標 * 2 + 1
  • 一個節(jié)點的右節(jié)點等于其本身節(jié)點坐標 * 2 + 2

根據(jù)上述堆的特性,下面構建最小堆的構造函數(shù)和對應的屬性方法:

class MinHeap {
  constructor() {
    // 存儲堆元素
    this.heap = []
  }
  // 獲取父元素坐標
  getParentIndex(i) {
    return (i - 1) >> 1
  }

  // 獲取左節(jié)點元素坐標
  getLeftIndex(i) {
    return i * 2 + 1
  }

 // 獲取右節(jié)點元素坐標
  getRightIndex(i) {
    return i * 2 + 2
  }

  // 交換元素
  swap(i1, i2) {
    const temp = this.heap[i1]
    this.heap[i1] = this.heap[i2]
    this.heap[i2] = temp
  }

  // 查看堆頂元素
  peek() {
    return this.heap[0]
  }

  // 獲取堆元素的大小
  size() {
    return this.heap.length
  }
}

涉及到堆的操作有:

  • 插入
  • 刪除

插入

將值插入堆的底部,即數(shù)組的尾部,當插入一個新的元素之后,堆的結構就會被破壞,因此需要堆中一個元素做上移操作

將這個值和它父節(jié)點進行交換,直到父節(jié)點小于等于這個插入的值,大小為k的堆中插入元素的時間復雜度為O(logk)

如下圖所示,22節(jié)點是新插入的元素,然后進行上移操作:

說說你對堆的理解?如何實現(xiàn)?應用場景?

?相關代碼如下:

// 插入元素
insert(value) {
  this.heap.push(value)
  this.shifUp(this.heap.length - 1)
}

// 上移操作
shiftUp(index) {
  if (index === 0) { return }
  const parentIndex = this.getParentIndex(index)
  if(this.heap[parentIndex] > this.heap[index]){
    this.swap(parentIndex, index)
    this.shiftUp(parentIndex)
  }
}

刪除

常見操作是用數(shù)組尾部元素替換堆頂,這里不直接刪除堆頂,因為所有的元素會向前移動一位,會破壞了堆的結構

然后進行下移操作,將新的堆頂和它的子節(jié)點進行交換,直到子節(jié)點大于等于這個新的堆頂,刪除堆頂?shù)臅r間復雜度為O(logk)

整體如下圖操作:

說說你對堆的理解?如何實現(xiàn)?應用場景?

?相關代碼如下:

// 刪除元素
pop() {
  this.heap[0] = this.heap.pop()
  this.shiftDown(0)
}

// 下移操作
shiftDown(index) {
  const leftIndex = this.getLeftIndex(index)
  const rightIndex = this.getRightIndex(index)
  if (this.heap[leftIndex] < this.heap[index]){
    this.swap(leftIndex, index)
    this.shiftDown(leftIndex)
  }
  if (this.heap[rightIndex] < this.heap[index]){
    this.swap(rightIndex, index)
    this.shiftDown(rightIndex)
  }
}

時間復雜度

關于堆的插入和刪除時間復雜度都是Olog(n),原因在于包含n個節(jié)點的完全二叉樹,樹的高度不會超過log2n

堆化的過程是順著節(jié)點所在路徑比較交換的,所以堆化的時間復雜度跟樹的高度成正比,也就是Olog(n),插入數(shù)據(jù)和刪除堆頂元素的主要邏輯就是堆化

三、總結

  • 堆是一個完全二叉樹
  • 堆中每一個節(jié)點的值都必須大于等于(或小于等于)其子樹中每個節(jié)點的值
  • 對于每個節(jié)點的值都大于等于子樹中每個節(jié)點值的堆,叫作“大頂堆”
  • 對于每個節(jié)點的值都小于等于子樹中每個節(jié)點值的堆,叫作“小頂堆”
  • 根據(jù)堆的特性,我們可以使用堆來進行排序操作,也可以使用其來求第幾大或者第幾小的值

參考文獻

  • https://baike.baidu.com/item/%E5%A0%86/20606834
  • https://xlbpowder.cn/2021/02/26/%E5%A0%86%E5%92%8C%E5%A0%86%E6%8E%92%E5%BA%8F/

如果對您有所幫助,歡迎您點個關注,我會定時更新技術文檔,大家一起討論學習,一起進步。

?說說你對堆的理解?如何實現(xiàn)?應用場景?文章來源地址http://www.zghlxwxcb.cn/news/detail-855148.html

到了這里,關于說說你對堆的理解?如何實現(xiàn)?應用場景?的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 說說你對貪心算法、回溯算法的理解?應用場景?

    說說你對貪心算法、回溯算法的理解?應用場景?

    貪心算法,又稱貪婪算法,是算法設計中的一種思想 其期待每一個階段都是局部最優(yōu)的選擇,從而達到全局最優(yōu),但是結果并不一定是最優(yōu)的 舉個零錢兌換的例子,如果你有1元、2元、5元的錢幣數(shù)張,用于兌換一定的金額,但是要求兌換的錢幣張數(shù)最少 如果現(xiàn)在你要兌換

    2024年04月28日
    瀏覽(31)
  • 說說你對vue的mixin的理解,有什么應用場景?

    說說你對vue的mixin的理解,有什么應用場景?

    Mixin 是面向對象程序設計語言中的類,提供了方法的實現(xiàn)。其他類可以訪問 mixin 類的方法而不必成為其子類 Mixin 類通常作為功能模塊使用,在需要該功能時“混入”,有利于代碼復用又避免了多繼承的復雜 先來看一下官方定義 mixin (混入),提供了一種非常靈活的方式,來

    2024年03月09日
    瀏覽(29)
  • 說說你對slot的理解?slot使用場景有哪些?

    說說你對slot的理解?slot使用場景有哪些?

    定義 在Vue.js中,slot(插槽)是一種用于組件之間內(nèi)容分發(fā)的機制。它允許你在父組件中編寫子組件的內(nèi)容,從而增加了組件的靈活性和可重用性。 Slot 藝名插槽,花名“占坑”,我們可以理解為 slot 在組件模板中占好了位置,當使用該組件標簽時候,組件標簽里面的內(nèi)容就

    2024年02月07日
    瀏覽(23)
  • 說說你對算法中時間復雜度,空間復雜度的理解?如何計算?

    說說你對算法中時間復雜度,空間復雜度的理解?如何計算?

    算法(Algorithm)是指用來操作數(shù)據(jù)、解決程序問題的一組方法。對于同一個問題,使用不同的算法,也許最終得到的結果是一樣的,但在過程中消耗的資源和時間卻會有很大的區(qū)別 衡量不同算法之間的優(yōu)劣主要是通過時間和空間兩個維度去考量: 時間維度:是指執(zhí)行當前算

    2024年04月09日
    瀏覽(24)
  • 說說對WebSocket的理解?應用場景?

    說說對WebSocket的理解?應用場景?

    WebSocket,是一種網(wǎng)絡傳輸協(xié)議,位于 OSI 模型的應用層。可在單個 TCP 連接上進行全雙工通信,能更好的節(jié)省服務器資源和帶寬并達到實時通迅 客戶端和服務器只需要完成一次握手,兩者之間就可以創(chuàng)建持久性的連接,并進行雙向數(shù)據(jù)傳輸 從上圖可見, websocket 服務器與客戶

    2024年04月08日
    瀏覽(56)
  • 你對SPA單頁面的理解,它的優(yōu)缺點分別是什么?如何實現(xiàn)SPA應用呢?

    你對SPA單頁面的理解,它的優(yōu)缺點分別是什么?如何實現(xiàn)SPA應用呢?

    SPA(single-page application),翻譯過來就是單頁應用SPA是一種網(wǎng)絡應用程序或網(wǎng)站的模型,它通過動態(tài)重寫當前頁面來與用戶交互,這種方法避免了頁面之間切換打斷用戶體驗在單頁應用中,所有必要的代碼(HTML、JavaScript和CSS)都通過單個頁面的加載而檢索,或者根據(jù)需要(通

    2024年02月10日
    瀏覽(19)
  • 說說你對圖的理解?相關操作有哪些?

    說說你對圖的理解?相關操作有哪些?

    在計算機科學中,圖是一種抽象的數(shù)據(jù)類型,在圖中的數(shù)據(jù)元素通常稱為結點, V 是所有頂點的集合, E 是所有邊的集合 如果兩個頂點 v , w ,只能由 v 向 w ,而不能由 w 向 v ,那么我們就把這種情況叫做一個從? v ?到? w ?的有向邊。 v 也被稱做初始點, w 也被稱為終點。這

    2024年04月22日
    瀏覽(28)
  • 說說你對集合的理解?常見的操作有哪些?

    說說你對集合的理解?常見的操作有哪些?

    集合(Set),指具有某種特定性質的事物的總體,里面的每一項內(nèi)容稱作元素 在數(shù)學中,我們經(jīng)常會遇到集合的概念: 有限集合:例如一個班集所有的同學構成的集合 無限集合:例如全體自然數(shù)集合 在計算機中集合道理也基本一致,具有三大特性: 確定性:于一個給定的

    2024年04月16日
    瀏覽(21)
  • 說說你對數(shù)據(jù)結構的理解?有哪些?區(qū)別?

    說說你對數(shù)據(jù)結構的理解?有哪些?區(qū)別?

    數(shù)據(jù)結構是計算機存儲、組織數(shù)據(jù)的方式,是指相互之間存在一種或多種特定關系的數(shù)據(jù)元素的集合 前面講到,一個程序 = 算法 + 數(shù)據(jù)結構,數(shù)據(jù)結構是實現(xiàn)算法的基礎,選擇合適的數(shù)據(jù)結構可以帶來更高的運行或者存儲效率 數(shù)據(jù)元素相互之間的關系稱為結構,根據(jù)數(shù)據(jù)元

    2024年04月10日
    瀏覽(24)
  • 說說你對樹的理解?相關的操作有哪些?

    說說你對樹的理解?相關的操作有哪些?

    在計算機領域,樹形數(shù)據(jù)結構是一類重要的非線性數(shù)據(jù)結構,可以表示數(shù)據(jù)之間一對多的關系。以樹與二叉樹最為常用,直觀看來,樹是以分支關系定義的層次結構 二叉樹滿足以下兩個條件: 本身是有序樹 樹中包含的各個結點的不能超過 2,即只能是 0、1 或者 2 如下圖,左

    2024年04月17日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包