我正在实现A *算法,我坚持使用以下伪代码:
if neighbor not in openset or tentative_g_score <= g_score[neighbor]
came_from[neighbor] := current
g_score[neighbor] := tentative_g_score
f_score[neighbor] := g_score[neighbor] + heuristic_cost_estimate(neighbor, goal)
if neighbor not in openset
add neighbor to openset
我想优化openset检查,这样我就不会在一次算法传递中检查节点是否打开两次。
我知道在bash中有类似的东西:
if(( false == openedList_.ContainsNodeXY(n.X, n.Y)) &&
InOpenSet = false ){ .... }
有了这个,我会得到关于节点是否在openset中的信息。
我怎样才能在C#中做到这一点?
修改
openList_
是一个列表(我必须对其进行排序),因此它不能是HashSet
。
答案 0 :(得分:0)
您可以在C#中使用HashSet<T>
对象。 HashSet可以快速告诉您对象是否是Set的成员。
HashSet有Add
和Contains
方法。
根据您的评论,您可能需要SortedList。它不会更快,在大多数情况下HashSet是O(1)。 SortedList将在插入时为O(n)。 SortedList也有Contains
(因为它们都实现了IDictionary)。
请参阅this有用的答案。
答案 1 :(得分:0)
我认为A *需要的是一个也支持快速Contains
的优先级队列。 SortedSet<T>
就是这门课。据我所知,这是一棵红黑树。
警告:不要使用BCL中的SortedList<T>
类。它是基于可怕的O(n^2)
算法的遗留内容。