我正在使用堆队列来实现算法,当我向队列添加新节点时,它们按启发式函数排序:例如heappush(队列,(得分(节点),节点)),这太棒了,分开事实上,当我将下一个节点弹出队列时,我想要最近添加的节点,而不是第一个添加的节点,这就是heappop返回的节点.如何在不破坏队列的情况下将最新节点添加到队列中?
我想我可以在第一个元素开始迭代,而下一个元素具有相同的分数,继续.然后当我找到带有该分数的最终元素时,我选择它并将其从列表中删除.这显然不是非常有效,并且打破了优先级队列的时间复杂性?
我坚持这个,我无法想办法做到这一点.
谢谢.
编辑; 使用计数器,按照建议不起作用(也许我误解了)
>>> queue = []
>>> heappush(queue, (2, 0, 'a'))
>>> heappush(queue, (3, -1, 'b'))
>>> queue
[(2, 0, 'a'), (3, -1, 'b')]
>>> heappush(queue, (2, -2, 'c'))
>>> queue
[(2, -2, 'c'), (3, -1, 'b'), (2, 0, 'a')]
Run Code Online (Sandbox Code Playgroud)
现在队列排序不正确,并且"b"比"a"更糟糕的选项放在它之前.
编辑2:
我勒个去?
>>> heappop(queue)
(2, -2, 'c')
>>> queue
[(2, 0, 'a'), (3, -1, 'b')]
>>>
Run Code Online (Sandbox Code Playgroud) 如果我想创建一个2D数组,用户输入指定维度,我不能只在主函数中按顺序执行此操作吗?一旦我使用scanf获得尺寸,然后我创建一个具有这些尺寸的数组?根据我的理解,当运行时不知道所需的空间时,应该使用malloc.我不知道运行时所需的空间,但我没有动态分配内存,无论如何它都会工作,对吧?也许我完全误解了一些东西.