Python 3.x 为什么siftdown在heapsort工作,而不是siftup?

Python 3.x 为什么siftdown在heapsort工作,而不是siftup?,python-3.x,data-structures,heapsort,binary-heap,Python 3.x,Data Structures,Heapsort,Binary Heap,我的编程作业如下: 您将需要仅使用O(n)交换将数组转换为堆,如在讲座中所述。注意,在这个问题中,您需要使用最小堆而不是最大堆。输出的第一行应该包含单个整数m—交换的总数。m必须满足条件0≤ M≤ 4n。接下来的m行应该包含用于将数组a转换为堆的交换操作。每个交换由一对整数i,j描述,i,j是要交换的元素的基于0的索引 我使用筛选技术实现了一个解决方案,通过与父值进行比较,该值为小文本案例提供了解决方案,当数组中的整数数小于10时,通过手动检查进行验证,但它无法通过输入100000个整数的测试案

我的编程作业如下: 您将需要仅使用O(n)交换将数组转换为堆,如在讲座中所述。注意,在这个问题中,您需要使用最小堆而不是最大堆。输出的第一行应该包含单个整数m—交换的总数。m必须满足条件0≤ M≤ 4n。接下来的m行应该包含用于将数组a转换为堆的交换操作。每个交换由一对整数i,j描述,i,j是要交换的元素的基于0的索引

我使用筛选技术实现了一个解决方案,通过与父值进行比较,该值为小文本案例提供了解决方案,当数组中的整数数小于10时,通过手动检查进行验证,但它无法通过输入100000个整数的测试案例。 这就是代码


类HeapBuilder:
定义初始化(自):
self._swaps=[]#元组数组或数组
self._data=[]
def读取数据(自身):
n=int(输入())
self._data=[int(s)表示输入中的s().split()]
断言n==len(自身数据)
def WriteResponse(自身):
打印(len(自交换))
对于自交换。\u交换:
打印(交换[0],交换[1])
def swapup(自我,i):
如果我=0:
如果自我数据[int((i-1)/2)]>自我数据[i]:
self._swaps.append((int((i-1)/2)),i))
自我数据[int((i-1)/2],自我数据[i]=自我数据[i],自我数据[int((i-1)/2]
自我交换(内部((i-1)/2))
def生成WAP(自):
对于范围内的i(len(自身数据)-1,0,-1):
赛尔夫·斯瓦普(i)
def解算(自):
self.ReadData()
self.GenerateSwaps()
self.WriteResponse()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
heap\u builder=HeapBuilder()
heap_builder.Solve()
另一方面,我使用筛选技术和类似的比较过程实现了一个堆排序,并且它通过了每个测试用例。 下面是此方法的代码

类HeapBuilder:
定义初始化(自):
self._swaps=[]#元组数组或数组
self._data=[]
def读取数据(自身):
n=int(输入())
self._data=[int(s)表示输入中的s().split()]
断言n==len(自身数据)
def WriteResponse(自身):
打印(len(自交换))
对于自交换。\u交换:
打印(交换[0],交换[1])
def swapdown(自我,i):
n=长度(自身数据)
最小指数=i
L=2×i+1如果(2×i+1<p)试图从底部“交换”来建立堆不会总是有效的。得到的数组不一定是有效堆。例如,考虑这个数组:<代码> [3,6,2,4,5,7,1] < /代码>。
       3
    4     2
   6 5   7 1
您的算法从最后一项开始,向上交换到根。因此,您将1与2交换,然后将1与3交换。这将为您提供:

       1
    4     3
   6 5   7 2
然后继续处理其余的项目,不必移动任何项目

结果是一个无效堆:最后一项2应该是3的父项

这里的关键是,向上交换方法假定,当您处理完
a[i]
后,最终位于该位置的项就位于其最终位置。与此相反,向下交换方法允许重复调整堆中较低的项。

尝试通过“向上交换”来构建堆从底部开始并不总是有效的。结果数组不一定是一个有效的堆。例如,考虑这个数组:<代码> [3,6,2,4,5,7,1] < /代码>。
       3
    4     2
   6 5   7 1
您的算法从最后一项开始,向上交换到根。因此,您将1与2交换,然后将1与3交换。这将为您提供:

       1
    4     3
   6 5   7 2
然后继续处理其余的项目,不必移动任何项目

结果是一个无效堆:最后一项2应该是3的父项


这里的关键是,swapping-up方法假设当您处理
a[i]
,则最终位于该位置的项目位于其最终位置。与此相比,交换向下方法允许重复调整堆中较低的项目。

我不是在问时间复杂性,我很清楚筛选向下在O(n)中工作,而筛选向上在O(nlogn)中工作.我想知道的是筛选给出错误答案的原因(不是时间限制的问题,而是不准确的问题)我不是问时间复杂性,我很清楚筛选在O(n)中起作用,而筛选在O(nlogn)中起作用.我想知道的是筛选给出错误答案的原因(不是时间限制的问题,而是不准确的问题)