成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試官:說說你對堆的理解?如何實現?應用場景?

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

[[426251]]

本文轉載自微信公眾號「JS每日一題」,作者灰灰。轉載本文請聯系JS每日一題公眾號。

一、是什么

堆(Heap)是計算機科學中一類特殊的數據結構的統稱

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

總是滿足下列性質:

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

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

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

二、操作

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

用一維數組存儲則如下:

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

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

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

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

  1. class MinHeap { 
  2.   constructor() { 
  3.     // 存儲堆元素 
  4.     this.heap = [] 
  5.   } 
  6.   // 獲取父元素坐標 
  7.   getParentIndex(i) { 
  8.     return (i - 1) >> 1 
  9.   } 
  10.    
  11.   // 獲取左節點元素坐標 
  12.   getLeftIndex(i) { 
  13.     return i * 2 + 1 
  14.   } 
  15.    
  16.  // 獲取右節點元素坐標 
  17.   getRightIndex(i) { 
  18.     return i * 2 + 2 
  19.   } 
  20.    
  21.   // 交換元素 
  22.   swap(i1, i2) { 
  23.     const temp = this.heap[i1] 
  24.     this.heap[i1] = this.heap[i2] 
  25.     this.heap[i2] = temp 
  26.   } 
  27.    
  28.   // 查看堆頂元素 
  29.   peek() { 
  30.     return this.heap[0] 
  31.   } 
  32.    
  33.   // 獲取堆元素的大小 
  34.   size() { 
  35.     return this.heap.length 
  36.   } 

涉及到堆的操作有:

  • 插入
  • 刪除

插入

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

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

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

相關代碼如下:

  1. // 插入元素 
  2. insert(value) { 
  3.   this.heap.push(value) 
  4.   this.shifUp(this.heap.length - 1) 
  5.  
  6. // 上移操作 
  7. shiftUp(index) { 
  8.   if (index === 0) { return } 
  9.   const parentIndex = this.getParentIndex(index
  10.   if(this.heap[parentIndex] > this.heap[index]){ 
  11.     this.swap(parentIndex, index
  12.     this.shiftUp(parentIndex) 
  13.   } 

刪除

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

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

整體如下圖操作:

相關代碼如下:

  1. // 刪除元素 
  2. pop() { 
  3.   this.heap[0] = this.heap.pop() 
  4.   this.shiftDown(0) 
  5.  
  6. // 下移操作 
  7. shiftDown(index) { 
  8.   const leftIndex = this.getLeftIndex(index
  9.   const rightIndex = this.getRightIndex(index
  10.   if (this.heap[leftIndex] < this.heap[index]){ 
  11.     this.swap(leftIndex, index
  12.     this.shiftDown(leftIndex) 
  13.   } 
  14.   if (this.heap[rightIndex] < this.heap[index]){ 
  15.     this.swap(rightIndex, index
  16.     this.shiftDown(rightIndex) 
  17.   } 

時間復雜度

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

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

三、總結

堆是一個完全二叉樹

堆中每一個節點的值都必須大于等于(或小于等于)其子樹中每個節點的值

對于每個節點的值都大于等于子樹中每個節點值的堆,叫作“大頂堆”

對于每個節點的值都小于等于子樹中每個節點值的堆,叫作“小頂堆”

根據堆的特性,我們可以使用堆來進行排序操作,也可以使用其來求第幾大或者第幾小的值

參考文獻

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/

 

責任編輯:武曉燕 來源: JS每日一題
相關推薦

2021-09-29 07:24:20

場景數據

2021-09-16 07:52:18

算法應用場景

2021-10-09 10:25:41

排序應用場景

2021-10-08 09:59:32

冒泡排序場景

2021-10-13 18:01:33

快速排序場景

2021-11-10 07:47:49

組合模式場景

2021-08-16 08:33:26

git

2021-11-03 14:10:28

工廠模式場景

2021-11-05 07:47:56

代理模式對象

2021-11-09 08:51:13

模式命令面試

2021-10-11 09:38:41

開源

2021-10-12 07:15:02

歸并排序場景

2021-09-06 10:51:27

TypeScriptJavaScript

2021-11-22 23:50:59

責任鏈模式場景

2021-11-11 16:37:05

模板模式方法

2021-10-14 07:55:20

二分查找面試

2021-09-08 07:49:34

TypeScript 泛型場景

2021-09-10 06:50:03

TypeScript裝飾器應用

2021-11-04 06:58:32

策略模式面試

2021-05-31 10:35:34

TCPWebSocket協議
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久一区二区免费视频 | 午夜精品久久久 | 日日摸日日碰夜夜爽2015电影 | 日韩国产三区 | av国产精品 | 99久久99 | 色偷偷噜噜噜亚洲男人 | 国产精品日韩欧美一区二区 | 国产精品美女久久久久aⅴ国产馆 | 久久久久亚洲av毛片大全 | 成人不卡 | 日韩三级免费网站 | 日本一区二区电影 | 日日摸日日添日日躁av | 久久久成人免费一区二区 | 欧美日韩国产在线观看 | 九九九久久国产免费 | 国产一区二区三区视频 | 午夜视频免费 | 在线日韩欧美 | aaa在线| 精品网| 欧美视频成人 | 亚洲精品国产a久久久久久 午夜影院网站 | 91精品国产综合久久久久 | 久久成人国产 | 亚洲成人综合网站 | 亚洲人成人一区二区在线观看 | 国产日韩欧美激情 | 日韩久久久久久 | 日韩免费视频 | 精品综合 | 99国产精品久久久久老师 | 视频在线一区二区 | 午夜精品一区二区三区三上悠亚 | 激情久久网| 中文字幕视频三区 | 九九久久久 | 91精品国产91久久久久久 | 欧美 中文字幕 | 羞羞羞视频 |