二叉堆时间复杂度 php,二叉堆(Binary Heap)
二叉堆這個(gè)數(shù)據(jù)結(jié)構(gòu)有點(diǎn)意思,自己做了個(gè)總結(jié),內(nèi)容結(jié)構(gòu)如下:
二叉堆性質(zhì)
二叉堆操作
應(yīng)用
二叉堆性質(zhì):
堆(Heap)是一個(gè)可以被看成近似完全二叉樹的結(jié)構(gòu),具有完全二叉樹的特性:
缺少的葉子節(jié)點(diǎn)總是位于右子節(jié)點(diǎn)
n個(gè)節(jié)點(diǎn)的完全二叉樹高度:k=? log2n?(向上取整)
從1開始按層序編號(hào),那么第i個(gè)節(jié)點(diǎn)有如下性質(zhì):
其左子節(jié)點(diǎn)索引是:2i
其又子節(jié)點(diǎn)索引是:2i+1
其父節(jié)點(diǎn)索引為 : i // 2
同時(shí)具有堆的特性:
堆頂元素就是最值,O(1)時(shí)間就能優(yōu)先拿到
從根節(jié)點(diǎn)(堆頂)到堆中每一個(gè)節(jié)點(diǎn)都是一個(gè)有序序列。
存儲(chǔ)方式可以用線性的數(shù)組來(lái)實(shí)現(xiàn),實(shí)現(xiàn)簡(jiǎn)單易操作,不過(guò)要注意數(shù)組下標(biāo)從0開始,這個(gè)位置預(yù)留占位,節(jié)點(diǎn)的索引從1開始編號(hào)。
2.png
binarytree.png
二叉堆操作:
BinaryHeap():創(chuàng)建一個(gè)空的二叉堆對(duì)象
insert(key):將新元素加入到堆中
findMin():返回堆中的最小項(xiàng),最小項(xiàng)仍保留在堆中
delMin():返回堆中的最小項(xiàng),同時(shí)從堆中刪除
isEmpty():返回堆是否為空
size():返回堆中節(jié)點(diǎn)的個(gè)數(shù)
buildHeap(lst):從一個(gè)包含節(jié)點(diǎn)的列表里創(chuàng)建新堆
# 直接導(dǎo)入Pythonds包使用其提供的有關(guān)堆的數(shù)據(jù)結(jié)構(gòu)。
from pythonds.trees import BinaryHeap
bheap=BinaryHeap()
bheap.insert(5)
#用list來(lái)實(shí)現(xiàn)對(duì)堆的操作
class BinaryHeap(object):
"""定義一個(gè)二叉堆"""
def __init__(self):
self.heapList = [0] # 第一個(gè)堆元素從1開始編號(hào),索引為0占位不用
self.currentSize = 0
def percolateUP(self, i):
'''將第i個(gè)元素上浮到合適位置'''
while i // 2 > 0:
if self.heapList[i] < self.heapList[i // 2]:
self.heapList[i], self.heapList[
i // 2] = self.heapList[i // 2], self.heapList[i]
else:
break
i = i // 2
def percolateDown(self, i):
'''將第i個(gè)元素下沉到合適位置'''
while (2 * i) <= self.currentSize:
minIndex = self.minChild(i)
if self.heapList[i] > self.heapList[minIndex]:
self.heapList[i], self.heapList[
minIndex] = self.heapList[minIndex], self.heapList[i]
else:
break
i = minIndex
def minChild(self, i):
'''返回第i個(gè)元素左右子節(jié)點(diǎn)中最小值'''
if (2 * i + 1) > self.currentSize:
return 2 * i # 只有一個(gè)子節(jié)點(diǎn)(左子節(jié)點(diǎn))
elif self.heapList[2 * i] < self.heapList[2 * i + 1]:
return 2 * i
else:
return 2 * i + 1
def insert(self, key):
'''將新元素加入到堆中'''
self.heapList.append(key)
self.currentSize = self.currentSize + 1
self.percolateUP(self.currentSize) # 新值上浮
def findMin(self):
'''返回堆中的最小項(xiàng),最小項(xiàng)仍保留在堆中'''
return heapList[1]
def delMin(self):
'''返回堆中的最小項(xiàng),同時(shí)從堆中刪除'''
result = self.heapList[1]
# 將最后一個(gè)元素?fù)Q到堆頂并刪除堆頂元素
self.heapList[1] = self.heapList.pop()
self.currentSize = self.currentSize - 1
self.percolateDown(1) # 將堆頂元素下沉
return result
def isEmpty(self):
'''返回堆是否為空'''
return len(heapList) == 1
def size(self):
'''返回堆中節(jié)點(diǎn)的個(gè)數(shù)'''
return len(heapList) - 1
def printHeap(self):
print(self.heapList[1:])
def buildHeap(self, lst):
'''從一個(gè)包含節(jié)點(diǎn)的列表里創(chuàng)建新堆,用下沉法將時(shí)間復(fù)雜度控制在O(n)'''
self.currentSize = len(lst)
i = self.currentSize // 2 #從最后一個(gè)節(jié)點(diǎn)的父節(jié)點(diǎn)開始過(guò)濾下沉!
self.heapList = [0] + lst[:]
while i > 0:
self.percolateDown(i)
i = i - 1
self.printHeap()
應(yīng)用之一-----------------優(yōu)先隊(duì)列:
可以在O(1)時(shí)間拿到最值,獲取最優(yōu)解,實(shí)現(xiàn)對(duì)VIP或者進(jìn)程的優(yōu)先級(jí)等操作
pic_19.png
應(yīng)用之二-----------------堆排序:
總結(jié)
以上是生活随笔為你收集整理的二叉堆时间复杂度 php,二叉堆(Binary Heap)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 南开大学计算机原理在线作业,南开大学20
- 下一篇: php ie 下载 乱码,php ie下