问题 File "D:\Anaconda\lib\site-packages\IPython\core\interactiveshell.py", line 3369, in run_code exec(code_obj, self.user_global_ns, self.user_ns) File "<ipython-input-12-f7e7b17df27c>", line 4, in <cell line: 4> pq.buildHeap([(v.getDistance(), v) for v in G]) # 优先队列列表存顶点和权重[(权重,顶点)] File "D:\aclass\data structure\p\graph.py", line 124, in buildHeap self.percDown(i) File "D:\aclass\data structure\p\graph.py", line 130, in percDown if self.heapArray[i][0] > self.heapArray[mc][0]: IndexError: list index out of range
时间: 2023-12-03 20:05:08 浏览: 120
根据您提供的错误信息,问题出现在 `self.heapArray[i][0] > self.heapArray[mc][0]` 这一行代码,说明 `mc` 可能越界。
在 `buildHeap` 方法中,我们将图 `G` 中的所有顶点转换为 `(距离, 顶点)` 元组,并将它们添加到堆数组 `self.heapArray` 中。然后,我们调用 `percDown` 方法对堆进行下沉操作。
在 `percDown` 方法中,我们使用 `minChild` 方法找到当前节点 `i` 的权重最小的子节点 `mc`。如果 `i` 没有左子节点,则 `minChild` 方法会返回 `-1`,导致后续的访问越界。
因此,我们需要在 `percDown` 方法中对 `mc` 的取值进行检查,如果 `mc` 小于等于 `0`,则说明当前节点没有子节点,无需进行调整。修改后的代码如下:
```
def percDown(self, i):
while (i * 2) <= self.currentSize:
mc = self.minChild(i)
if mc <= 0:
break
if self.heapArray[i][0] > self.heapArray[mc][0]:
tmp = self.heapArray[i]
self.heapArray[i] = self.heapArray[mc]
self.heapArray[mc] = tmp
i = mc
```
这样修改后,如果 `mc` 小于等于 `0`,则跳出循环,不再进行调整。这样可以避免访问列表越界,同时能够正确处理没有子节点的情况。
阅读全文