2017-10-27 16 views
0

私は検索アルゴリズムを試していますが、問題を解決するためにA *アルゴリズムを使用しようとしています。Python - 辞書のリストを並べ替える

私は、内部ノード構造を維持するために辞書のリストを使用しています。 各ノードは、特定の状態と関連コストによって特徴付けられます。 選択関数は、最もコストの低いノードを返さなければなりません。 これを行うには、毎回リストをフィルタリングしています。 問題が非常に小さい場合、これは非常に高速ですが、 ですが、リストが非常に大きい場合、この関数はアルゴリズムの合計時間の84%を使用します。

私の質問は、これを行うより効率的な方法があるかどうかです。

def select(self, frontier): 
    frontier.sort(key = lambda x: x['f_cost']) 
    #select the node with the lowest f_cost 
    return frontier.pop(0) 
+0

代わりにプライオリティキューを使用することもできます。たとえば、['heapq'](https://docs.python.org/3/library/heapq.html)。 –

答えて

2

ええ、最初から.popを入力しないでください。それは線形時間です。端から.popは一定であり、これだけの操作を行います。

def select(self, frontier): 
    frontier.sort(key = lambda x: x['f_cost'], reverse=True) 
    #select the node with the lowest f_cost 
    return frontier.pop() 

あなたはソート順序を維持しようとしている場合、代替データ構造を検討する必要があります。あなたは標準ライブラリの一部であるheapqを見ることができますが、それはかなり素朴です。また、sortedcontainersライブラリは、おそらくと非常によく似ています。です。

+0

"最初からポップする"(O(n))はおそらくソート(O(n log n))ほど悪くないので、答えの2番目の部分(別のデータ構造を使う)はもっと有望です。 – Sebastian

+0

@Sebastian真実ですが、timsortは*最悪の場合* O(n log n)ですが、ほぼソートされたリストを並べ替えるのはすごく高速です。それは言われている、あなたのポイントはまだ立っている。 –

+0

@ juanpa.arrivillaga正面から飛び出すことに比べて驚くほど速くはありません。それはそれに比べて非常に遅いです。それを試してみてください。 –

関連する問題