Python 二进制堆/给类一个最大值
下面是我所做的,但它不能处理insert的最大要求 如何为类指定一个最大值,并在insert中检查它,然后删除最不重要的元素。然后找出实现中最不重要的元素 在试图解决这个问题时遇到了一些问题Python 二进制堆/给类一个最大值,python,max,binary-heap,Python,Max,Binary Heap,下面是我所做的,但它不能处理insert的最大要求 如何为类指定一个最大值,并在insert中检查它,然后删除最不重要的元素。然后找出实现中最不重要的元素 在试图解决这个问题时遇到了一些问题 import math import random class BinaryHeap: def __init__(self, array, direction=1, size=100): if(size > len(array)): self.size = len(array
import math
import random
class BinaryHeap:
def __init__(self, array, direction=1, size=100):
if(size > len(array)):
self.size = len(array)
else:
self.size = size;
self.bBinaryHeap = array[:]
if 0 < direction:
self.compare = self.greater
else:
self.compare = self.less
self.buildBinaryHeap()
def node(self, index):
return (index << 1) + 1
def parent(self, index):
return (index - 1) >> 1
def bBinaryHeapifyDown(self, index):
swap = self.bBinaryHeap[index]
while self.node(index) < self.size:
node = self.node(index)
if node + 1 < self.size and self.compare(self.bBinaryHeap[node], self.bBinaryHeap[node + 1]) > 0:
node += 1
if self.compare(swap, self.bBinaryHeap[node]) > 0:
self.bBinaryHeap[index] = self.bBinaryHeap[node];
else:
break
index = node
self.bBinaryHeap[index] = swap
def upheapify(self, index):
while 0 < index and self.compare(self.bBinaryHeap[index], self.bBinaryHeap[self.parent(index)]) < 0:
parent = self.parent(index)
swap = self.bBinaryHeap[parent]
self.bBinaryHeap[parent] = self.bBinaryHeap[index]
self.bBinaryHeap[index] = swap
index = parent
def buildBinaryHeap(self):
indices = range(0, int(self.size / 2))
reversed(indices)
for index in indices:
self.bBinaryHeapifyDown(index)
def insert(self, value):
self.shrink()
index = self.size
self.bBinaryHeap[index] = value
self.size += 1
self.upheapify(index)
def search(self, value):
for index in range(self.size):
if self.bBinaryHeap[index] == value:
return index
def delete(self, value):
index = self.search(value)
self.size -= 1
self.bBinaryHeap[index] = self.bBinaryHeap[self.size]
parent = self.parent(index)
if (index == 0) or (self.compare(self.bBinaryHeap[parent], self.bBinaryHeap[index]) < 0):
self.bBinaryHeapifyDown(index)
else:
self.upheapify(index)
def shrink(self):
capacity = len(self.bBinaryHeap)
if capacity == self.size:
self.bBinaryHeap.extend([0] * capacity)
def greater(self, value1, value2):
if value1 == value2:
return 0
elif value1 < value2:
return 1
elif value1 > value2:
return -1
def less(self, value1, value2):
if value1 == value2:
return 0
elif value1 < value2:
return -1
elif value1 > value2:
return 1
def getLevel(self, index):
return int(math.floor(math.log(index + 1, 2)))
def displayBinaryHeap(self):
printBinaryHeap = str(self.bBinaryHeap)
height = self.getLevel(self.size)
previous = -1
for index in range(self.size):
getLevel = self.getLevel(index)
n = height - getLevel
indent = int(math.pow(2, n + 1) - 2)
spacing = 2 * indent
if getLevel != previous:
printBinaryHeap += '\n'
printBinaryHeap += ' ' * indent
previous = getLevel
else:
printBinaryHeap += ' ' * spacing
printBinaryHeap += '%4d' % self.bBinaryHeap[index]
print(printBinaryHeap)
if __name__ == "__main__":
size =10
array = [random.randint(0, 100) for i in range(size)]
bBinaryHeap = BinaryHeap(array, 1, 100)
print('Binary bBinaryHeap:')
bBinaryHeap.displayBinaryHeap()
导入数学
随机输入
类二进制堆:
def uuu init uuuu(self,array,direction=1,size=100):
如果(大小>透镜(阵列)):
self.size=len(数组)
其他:
自我尺寸=尺寸;
self.bBinaryHeap=数组[:]
如果0<方向:
自我比较=自我更大
其他:
self.compare=self.less
self.buildBinaryHeap()
def节点(自身,索引):
返回(索引>1)
def BBINARYEAPPYDOWN(自身,索引):
swap=self.bBinaryHeap[index]
而self.node(index)0:
节点+=1
如果self.compare(swap,self.bBinaryHeap[node])>0:
self.bBinaryHeap[index]=self.bBinaryHeap[node];
其他:
打破
索引=节点
self.bBinaryHeap[index]=交换
def自动校准(自我,索引):
而0值2:
返回-1
def less(自身、值1、值2):
如果value1==value2:
返回0
elif值1<值2:
返回-1
elif值1>值2:
返回1
def getLevel(自我,索引):
返回int(math.floor(math.log(索引+1,2)))
def displayBinaryHeap(自身):
printBinaryHeap=str(self.bBinaryHeap)
高度=self.getLevel(self.size)
先前=-1
对于范围内的索引(self.size):
getLevel=self.getLevel(索引)
n=高度-getLevel
缩进=整数(数学功率(2,n+1)-2)
间距=2*缩进
如果getLevel!=上一个:
printBinaryHeap+='\n'
printBinaryHeap+=''*缩进
previous=getLevel
其他:
printBinaryHeap+=''*间距
printBinaryHeap+='%4d'%self.bBinaryHeap[索引]
打印(printBinaryHeap)
如果名称=“\uuuuu main\uuuuuuuu”:
尺寸=10
数组=[random.randint(01100)表示范围内的i(大小)]
bBinaryHeap=BinaryHeap(数组,1100)
打印('Binary bBinaryHeap:')
bBinaryHeap.displayBinaryHeap()
您的代码有许多缩进错误。在python中,缩进计数
关于该代码:
if 0 < direction:
self.compare = self.greater
else:
self.compare = self.less
并在插入中检查它
然后删除最不重要的元素
然后找出实现中最不重要的元素是什么
我该如何把它写进我的代码中,我知道你在做什么。我必须重做整个事情吗?
class BinaryHeap:
pass
BinaryHeap.max = 10
print(BinaryHeap.max)
--output:--
10
class BinaryHeap:
max = 10
def insert(self):
print(self.max)
bh = BinaryHeap()
bh.insert()
--output:--
10
x = 0b1111
print(x) #15
y = x >> 1
print("{:b}".format(y)) #111
print(y) #7
x = 0b1110
print(x) #=>14
b_str = "{:b}".format(x)
print(repr(b_str)) #=> '1110'
for direction in [1, -1]:
if direction > 0:
least_signif = b_str[-1]
else:
least_signif = b_str[0]
print(least_signif)
--output:--
0
1