在*(A星)算法中实现openset时,使用min()获取最小值或对数组排序,然后在Python中弹出第一个值?
我正在用Python实现一个*(星型)算法 正如您所知,我们有一个“开放集”,它由我们计划探索的节点列表组成 在该算法中,我们从开集得到F(n)值(估计总代价)最低的节点 我们经常使用PriorityQueue,但出于某种原因,我不明白为什么PriorityQueue不能获得具有最低值的节点在*(A星)算法中实现openset时,使用min()获取最小值或对数组排序,然后在Python中弹出第一个值?,python,algorithm,min,Python,Algorithm,Min,我正在用Python实现一个*(星型)算法 正如您所知,我们有一个“开放集”,它由我们计划探索的节点列表组成 在该算法中,我们从开集得到F(n)值(估计总代价)最低的节点 我们经常使用PriorityQueue,但出于某种原因,我不明白为什么PriorityQueue不能获得具有最低值的节点 #adding a node frontier.append(someNode) sorted(frontier) #taking out the node currentNode = frontier.
#adding a node
frontier.append(someNode)
sorted(frontier)
#taking out the node
currentNode = frontier.pop(0)
因此,我创建了一个名为“frontier”的数组列表(Python中的常规列表),并将“openset”保留在那里
有两种方法可以使用它,比如PriorityQueue
currentNode = min(frontier)
从开放集获取最小值
或者,我们可以在每次向数组中添加新节点时对数组进行排序,只需使用“pop”即可获得最低值
#adding a node
frontier.append(someNode)
sorted(frontier)
#taking out the node
currentNode = frontier.pop(0)
哪一个更快?
使用min()或先排序,然后使用pop()
Python中的“min()”使用什么算法从数组中获取最小值?此数据结构
s
需要执行三个操作,分别是
- 获取具有最低
F(n)
- 添加一个元素
- 删除元素
min(s)
获取min值,或min(range(len(values)),key=s.\uu getitem\uuuuuu)
获取索引
这在O(n)
中运行,因为它只查看每个元素一次。将元素添加到列表末尾将在O(1)
中运行,从任意索引中删除将在O(n)
中运行,因为所有后续元素都需要移位
每次对数组进行排序的想法稍差一些,因为排序在O(n log n)
中运行。通过将min元素排序到列表的末尾可以节省一些时间,在O(1)
中可以将其删除,但总的来说速度会较慢
最好的解决方案是使用堆或优先级队列。它将min元素保留在顶部,可在O(1)
中检索,并允许在O(log n)
中插入和删除元素