2016-11-29 4 views
-1

私は大学のプロジェクト用にスレッドセーフなバージョンのA *を作成しています。この2つの優先度キューの実装が異なる結果を生み出しているこの奇妙な問題に遭遇しました。私はしばらくこのことを見つめていたので、実際のプロジェクト作業を無視し始めました。誰もこの2つの実装の違いを見分けることができますか?私はそれが私は関数によって生成される出力の変化に関連している場合を除き、これらの2つの実装の舞台裏で何に興味を持っていないです これらの2つの優先度キューラッパーの違いは何ですか?

template<typename T, typename priority_t> 
struct PriorityQueue 
{ 
    typedef pair<priority_t, T> PQElement; 

    class Compare 
    { 
    public: 
     bool operator() (PQElement e1, PQElement e2) 
     { 
      return e2.first < e1.first; 
     } 
    }; 

    priority_queue<PQElement, vector<PQElement>, 
     Compare> elements; 

    inline bool empty() const { return elements.empty(); } 

    inline void put(T item, priority_t priority) { 
     elements.emplace(priority, item); 
    } 

    inline T get() { 
     T best_item = elements.top().second; 
     elements.pop(); 
     return best_item; 
    } 
}; 

そして、第2の実施

template<typename T, typename priorityT> 
    struct PriorityQueue { 
    typedef pair<priorityT, T> PQElement; 
    vector<PQElement> elements; 

    inline bool empty() const { return elements.empty(); } 

    inline void put(T item, priorityT priority) 
    { 
     elements.push_back(PQElement(priority, item)); 
     std::sort(elements.begin(), elements.end(), [&](PQElement e1, PQElement e2) { return e2.first < e1.first; }); 
    } 

    inline T get() { 
     PQElement bestItem = elements.back(); 
     elements.pop_back(); 
     return bestItem.second; 
    } 
}; 

注意それらとのインターフェースに使用します。

+0

1つは 'std :: vector'を使用し、もう1つは' std :: priority_queue'を使用します...あなたは問題が何であるかを言及していないので、あなたの質問は「なぜこのコードではないのですか?ワーキング?"これは間違いなくstackoverflowのためのものではありません – smac89

+0

あなたのキューは、逆の順序で項目を返すと思います。 'priority_queue'は前の項目を返し、2番目の実装は前の項目を返します。どのような「異なる結果」が表示されていますか? – 1201ProgramAlarm

+0

私は注文の方向が同じであることを確認することができます、私はこれらの問題があった理由のために私の答えを参照してください。 – gdxn96

答えて

0

その理由は、std::priority_queueは同じ優先度の要素を異なる順序で返します。つまり、std::vectorです。私はこれが答えを発見した後に愚かな質問かもしれないが、同じ優先順位の要素が受け取られた順序が私のアルゴリズムの効率に影響を与えることを理解しています。申し訳ありませんが、私は誰かがこの問題を面白く感じるかもしれないと考えました。

関連する問題