Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.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_Data Structures_Heap - Fatal编程技术网

在python中,堆使用什么数据结构

在python中,堆使用什么数据结构,python,data-structures,heap,Python,Data Structures,Heap,我正在为Udacity课程编写一个自定义堆实现,需要一个通过堆索引和元素键返回元素度量值的堆 我得到了一个包含元组(Metric,Key)的堆列表 但是为了通过key获得正确的元素,我必须创建一个单独的映射,并为堆中的每个更改维护它的有效性 因此,最终,我不得不将map传递给所有函数,而不是具有两个参数的函数,如heapup(heap,i) 我想知道是否有更简单的方法通过程序、列表和字典来实现这一点。或者需要堆对象来隐藏其中的映射 def heapup(L, i, map): if

我正在为
Udacity
课程编写一个自定义堆实现,需要一个通过堆索引和元素键返回元素度量值的堆

我得到了一个包含
元组(Metric,Key)
的堆列表

但是为了通过key获得正确的元素,我必须创建一个单独的映射,并为堆中的每个更改维护它的有效性

因此,最终,我不得不将map传递给所有函数,而不是具有两个参数的函数,如
heapup(heap,i)

我想知道是否有更简单的方法通过程序、列表和字典来实现这一点。或者需要堆对象来隐藏其中的映射

 def heapup(L, i, map):

    if i == 0: return i # we reached the top!
    if i >= len(L): return i
    if L[parent(i)] > L[i]:
       # print "going up"
        (L[i], L[parent(i)]) = (L[parent(i)], L[i])
        map[L[i][1]] = i
        map[L[parent(i)][1]] = parent(i)
        return up_heapify(L, parent(i), map)
    else:
     #   print "going down"
        if leaf(L,i): return i
        if one_child(L,i): return i # we could only come this way
        if L[i] > L[left(i)]: # compare with left child
            (L[i], L[left(i)]) = (L[left(i)], L[i])
            map[L[i][1]] = i
            map[L[left(i)][1]] = left(i)
            return left(i)
        if L[i] > L[right(i)]: # compare with right child
            (L[i], L[right(i)]) = (L[right(i)], L[i])
            map[L[i][1]] = i
            map[L[right(i)][1]] = right(i)
            return right(i)
我希望在该函数中去掉map,但仍然能够通过其键从堆中获取项值,现在可以这样做:

item = heap[map[key]]
例如:

如果

然后

所以我可以得到如下元素的值:

L[map['G']] 
这将为我提供4个使用heapq的说明:


“此模块提供堆队列算法的实现,也称为优先级队列算法。”

恐怕我真的不明白您在做什么。什么是地图?在这种情况下,“度量”是什么意思?你能展示一下到目前为止你已经创建的代码吗?我不确定你想要什么,但是请看详细的问题。基本上,L由元组(x,y)组成,其中x-是一个度量,y是元素的键。正如您所看到的,每次更改堆中元素的位置时,我都必须更新映射。这将允许我按如下键从堆中获取元素:heap[map[Key]@Blckknght metric是用于对堆中的元素进行排序的数值
map = {'A':0, 'D':1, 'G': 2, ...} 
L[map['G']]