考试总结
要明白数据结构如何建立的
还要明白他们是如何使用的
https://www.youtube.com/watch?v=fJORlbOGm9Y
https://www.youtube.com/watch?v=LhhRbRXhB40
Heap 建立
class Heap(object):
__slots__ = ('data','size','lessfn')
def __init__(self,lessfn):#比较大小匿名函数
self.data = []
self.size = 0
self.lessfn = lessfn
def __parent(self,loc):
return (loc-1)//2 #loc为子集,找到他的父级,
def __bubbleUp(self,loc):#向上换
while loc > 0 and self.lessfn(self.data[loc],self.data[self.__parent(loc)]):
#当LOC的INDEX大于0,并且,比较子>父
(self.data[loc], self.data[self.__parent(loc)]) = (self.data[self.__parent(loc)], self.data[loc])
#子和父调换位置
loc = self.__parent(loc)#子变为父
def __bubbleDown(self,loc):#向下换
swapLoc = self.__smallest(loc)#找到最小的
while swapLoc != loc:
(self.data[loc], self.data[swapLoc]) = (self.data[swapLoc], self.data[loc])
loc = swapLoc
swapLoc = self.__smallest(loc)
def __smallest(self,loc):#找到最小的LOC和他的2个子
ch1 = loc*2 + 1#找子
ch2 = loc*2 + 2#找子
#检查边界
if ch1 >= self.size:#当子大于了个数说明超出了范围,返回
return loc
if ch2 >= self.size:#如果第二个子集大于个数,说明,没有CH2,那比较CH1
if self.lessfn(self.data[loc],self.data[ch1]):#比较大小 LOC小
return loc #返回父
else:
return ch1
# now consider all 3
if self.lessfn(self.data[ch1],self.data[ch2]):#两个子集比较大小,
# 如果 CHI1小
if self.lessfn(self.data[loc],self.data[ch1]):#比较大小
return loc
else:
return ch1
else:
if self.lessfn(self.data[loc],self.data[ch2]):
return loc
else:
return ch2
def insert(self,item):
self.data.append(item)#在LIST后面加入
self.size += 1
self.__bubbleUp(self.size-1)#与父比较
def pop(self):
'''
Removes and returns top of the heap
:return: Item on top of the heap
'''
retjob = self.data[0]#把最上面的POP UP
self.size -= 1
if self.size > 0:
self.data[0] = self.data.pop(self.size)
self.__bubbleDown(0)
return retjob
def __len__(self):
return self.size #个数
def __str__(self):
ret = ""
for item in range(self.size):
ret += str(self.data[item]) + " "
return ret
数据类型:
构成,里面的函数,表示他性质。
外面的为怎么用他
Heap 主要与前他自己的父比较大小
把ARRAY的INDEX变成堆的结构,移位