Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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
在*(A星)算法中实现openset时,使用min()获取最小值或对数组排序,然后在Python中弹出第一个值?_Python_Algorithm_Min - Fatal编程技术网

在*(A星)算法中实现openset时,使用min()获取最小值或对数组排序,然后在Python中弹出第一个值?

在*(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.

我正在用Python实现一个*(星型)算法

正如您所知,我们有一个“开放集”,它由我们计划探索的节点列表组成

在该算法中,我们从开集得到F(n)值(估计总代价)最低的节点

我们经常使用PriorityQueue,但出于某种原因,我不明白为什么PriorityQueue不能获得具有最低值的节点

#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)
中插入和删除元素