繁体   English   中英

如果条件扑朔迷离-检查并分配

[英]If condition bash alike - check and assignment

我正在实现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

我想优化开放集检查,这样就不会在一次算法传递中检查节点是否两次开放集。

我知道在bash中有一些类似的东西:

if(( false == openedList_.ContainsNodeXY(n.X, n.Y)) && 
     InOpenSet = false ){ .... }

这样,我将获得有关节点是否在开放集中的信息。

如何在C#中做到这一点?

编辑 openList_是一个列表(我必须对它进行排序),因此它不能是HashSet

您可以为此使用C#中的HashSet<T>对象。 HashSet可以迅速告诉您对象是否是Set的成员。

HashSet具有AddContains方法。


根据您的评论,您可能需要SortedList。 它不会更快,大多数情况下HashSet为O(1)。 插入时SortedList将为O(n)。 SortedList还具有Contains (因为它们都实现IDictionary)。

看到这个有用的答案。

我认为A *需要的是一个优先级队列,该队列也支持快速Contains SortedSet<T>是此类。 据我了解,它是一棵红黑树。

警告:请勿使用BCL中的SortedList<T>类。 它是基于可怕的O(n^2)算法的遗留物。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM