Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查找元素在堆中的位置_Python_Algorithm - Fatal编程技术网

Python 查找元素在堆中的位置

Python 查找元素在堆中的位置,python,algorithm,Python,Algorithm,考虑以下元素列表 h=[38203,1,45,39,10,34,90,10,2100,1] 如果将其放入一个基于数组的堆中,它将按以下方式显示 import heapq heapq.heapify(h) # now we have a heap that looks like this # [1, 2, 1, 10, 39, 10, 34, 90, 45, 203, 100, 38] 找出39在这个堆中的位置的最佳方法是什么 找到答案的一种方法是从堆中弹出项,直到它返回39,这样,如果我们跟

考虑以下元素列表

h=[38203,1,45,39,10,34,90,10,2100,1]

如果将其放入一个基于数组的堆中,它将按以下方式显示

import heapq

heapq.heapify(h)
# now we have a heap that looks like this
# [1, 2, 1, 10, 39, 10, 34, 90, 45, 203, 100, 38]
找出39在这个堆中的位置的最佳方法是什么

找到答案的一种方法是从堆中弹出项,直到它返回39,这样,如果我们跟踪从堆中弹出项的次数,就可以知道它的位置。但是,由于我们修改了堆本身,这不是很有效


有没有更好的办法来解决这个问题

如果您想保留堆,也许这样做可以:

ordered = []
temp = heap[:]
while temp:
    ordered.append(heapq.heappop(temp))

print(ordered.index(39))
如果不是这样,也许使用sort更适合您:

heap.sort()
print(heap.index(39))
说:

这两种方法使我们能够将堆看作一个常规的Python列表 毫无意外:heap[0]是最小的项,heap.sort 保持堆不变


如果您想保持堆,也许可以这样做:

ordered = []
temp = heap[:]
while temp:
    ordered.append(heapq.heappop(temp))

print(ordered.index(39))
如果不是这样,也许使用sort更适合您:

heap.sort()
print(heap.index(39))
说:

这两种方法使我们能够将堆看作一个常规的Python列表 毫无意外:heap[0]是最小的项,heap.sort 保持堆不变


从你给出的数据来看,我认为这是一个简单的算法。 你需要39的索引倒数,对吗

idx = len(h) - h.index(39) - 1

这将为堆右端的基于0的计数生成适当的索引。

根据您提供的数据,我认为这是一个简单的算法。 你需要39的索引倒数,对吗

idx = len(h) - h.index(39) - 1

这将为堆右端基于0的计数生成适当的索引。

从注释中的说明来看,您似乎希望将堆视为完全排序的数据结构,并查找小于或大于特定元素的元素数

堆不是为支持此操作而设计的。如果你想做这类事情,你应该使用为它设计的数据结构。例如:


如果你真的想使用堆,你可以运行堆的一部分,当你点击你正在寻找的项目时停止。对于低优先级项目,这将非常昂贵;在最坏的情况下,它的时间复杂度与完全排序相同,常数因子更差。

从注释中的说明来看,似乎您希望将堆视为完全排序的数据结构,并找到小于或大于特定元素的元素数

堆不是为支持此操作而设计的。如果你想做这类事情,你应该使用为它设计的数据结构。例如:


如果你真的想使用堆,你可以运行堆的一部分,当你点击你正在寻找的项目时停止。对于低优先级项目,这将非常昂贵;在最坏的情况下,它的时间复杂度将达到完全排序,常数因子更差。

是的,这很好地解决了问题,但就大O复杂度而言,这不是一种很好的方法。我想知道是否有更好的方法来解决这个问题。是的,这很好地解决了这个问题,但就大O的复杂性而言,这不是一个很好的方法。我想知道是否有更好的方法来解决这个问题。在什么位置,元素的数量大于它?或者物理列表中表示堆的索引?还是别的什么?你为什么要这么做?您需要减少按键操作吗?或者,您是否试图将堆视为完全排序的数据结构?@user2357112我想知道大于给定数量的元素数。在39的情况下,有6个元素大于39,所以如果你愿意的话,39将处于第7位。我想知道的原因是,如果您在优先级队列中使用堆,那么知道元素的位置会很有用。。。描述一种间接堆,它使用初始数组的索引而不重新排序,并允许按索引在Dijkstra算法中使用“更改键”操作。对于引用类PQi在Java代码中的位置:在什么位置,元素的数量大于它?或者物理列表中表示堆的索引?还是别的什么?你为什么要这么做?您需要减少按键操作吗?或者,您是否试图将堆视为完全排序的数据结构?@user2357112我想知道大于给定数量的元素数。在39的情况下,有6个元素大于39,所以如果你愿意的话,39将处于第7位。我想知道的原因是,如果您在优先级队列中使用堆,那么知道元素的位置会很有用。。。描述一种间接堆,它使用初始数组的索引而不重新排序,并允许“更改密钥”操作
按索引在Dijkstra算法中使用。对于Java代码中的引用类PQi:感谢您澄清堆不支持该操作。感谢您澄清堆不支持该操作。