如果条件bash相似 - 检查和分配

时间:2012-12-30 15:41:30

标签: c# if-statement conditional-statements

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

2 个答案:

答案 0 :(得分:0)

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

HashSetAddContains方法。


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

请参阅this有用的答案。

答案 1 :(得分:0)

我认为A *需要的是一个也支持快速Contains的优先级队列。 SortedSet<T>就是这门课。据我所知,这是一棵红黑树。

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