Python HeapSort 时间复杂度
Python HeapSort Time Complexity
我为 HeapSort 编写了以下代码,它运行良好:
class Heap(object):
def __init__(self, a):
self.a = a
def heapify(self, pos):
left = 2*pos + 1
right = 2*pos + 2
maximum = pos
if left < len(self.a) and self.a[left] > self.a[maximum]:
maximum = left
if right < len(self.a) and self.a[right] > self.a[maximum]:
maximum = right
if maximum != pos:
self.a[pos], self.a[maximum] = self.a[maximum], self.a[pos]
self.heapify(maximum)
def buildHeap(self):
for i in range(len(self.a)/2, -1, -1):
self.heapify(i)
def heapSort(self):
elements = len(self.a)
for i in range(elements):
print self.a[0]
self.a[0] = self.a[-1]
self.a = self.a[:-1]
self.heapify(0)
def printHeap(self):
print self.a
if __name__ == '__main__':
h = Heap(range(10))
h.buildHeap()
h.printHeap()
h.heapSort()
但是,由于列表切片,这里的函数heapSort
似乎需要时间O(n^2)
。 (对于大小为 'n' 的列表,将其切片为 'n-1' 将花费 O(n-1) 时间)。
谁能确认我的想法在这里是否正确?
如果是,heapSort
函数中的最小变化应该是什么,以使其在 O(nlogn)
中成为 运行?
是的,我相信你是对的。为了让它更快,替换这样的东西:
self.a = self.a[:-1]
与:
self.a.pop()
列表的 pop()
成员函数移除并 returns 列表中的最后一个元素,具有恒定的时间复杂度。
list
存储为连续内存,这意味着 list
的所有元素都一个接一个地存储。这就是为什么在 list
中间插入一个元素如此昂贵:Python 必须将您插入的位置之后的所有元素向下移动一个,以使 space对于新元素。但是,简单地删除 list
末尾的元素所花费的时间可以忽略不计,因为 Python 只需删除该元素即可。
我为 HeapSort 编写了以下代码,它运行良好:
class Heap(object):
def __init__(self, a):
self.a = a
def heapify(self, pos):
left = 2*pos + 1
right = 2*pos + 2
maximum = pos
if left < len(self.a) and self.a[left] > self.a[maximum]:
maximum = left
if right < len(self.a) and self.a[right] > self.a[maximum]:
maximum = right
if maximum != pos:
self.a[pos], self.a[maximum] = self.a[maximum], self.a[pos]
self.heapify(maximum)
def buildHeap(self):
for i in range(len(self.a)/2, -1, -1):
self.heapify(i)
def heapSort(self):
elements = len(self.a)
for i in range(elements):
print self.a[0]
self.a[0] = self.a[-1]
self.a = self.a[:-1]
self.heapify(0)
def printHeap(self):
print self.a
if __name__ == '__main__':
h = Heap(range(10))
h.buildHeap()
h.printHeap()
h.heapSort()
但是,由于列表切片,这里的函数heapSort
似乎需要时间O(n^2)
。 (对于大小为 'n' 的列表,将其切片为 'n-1' 将花费 O(n-1) 时间)。
谁能确认我的想法在这里是否正确?
如果是,heapSort
函数中的最小变化应该是什么,以使其在 O(nlogn)
中成为 运行?
是的,我相信你是对的。为了让它更快,替换这样的东西:
self.a = self.a[:-1]
与:
self.a.pop()
列表的 pop()
成员函数移除并 returns 列表中的最后一个元素,具有恒定的时间复杂度。
list
存储为连续内存,这意味着 list
的所有元素都一个接一个地存储。这就是为什么在 list
中间插入一个元素如此昂贵:Python 必须将您插入的位置之后的所有元素向下移动一个,以使 space对于新元素。但是,简单地删除 list
末尾的元素所花费的时间可以忽略不计,因为 Python 只需删除该元素即可。