2016-03-27 11 views
0

私はソート済みv: Vec<EventHandler<T>>を持っていて、ソートしたまま要素を挿入したいと思います。そうする最も効率的な方法は何ですか?錆はそれを行うための組み込みの方法を持っていないようです。ソートされたベクトルに要素を挿入する最も効率的な方法は何ですか?

ので、ソート作品は、挿入およびソートすることは非効率的になるかの
struct EventHandler<T: Event + ?Sized> { 
    priority: i32, 
    f: fn(&mut T), 
} 

O(n log n) time complexity and 2*n allocation costで次のように

EventHandler<T>です。

+0

Vecに実装されている 'binary_search'と' insert'メソッドがあります。だから、適切なインデックスを見つけてそこに新しい要素を挿入してください。 –

+0

この質問は何が悪いのですか? – SoniEx2

+0

@ SoniEx2なぜ人々がそれを落としたのか分かりませんが、いくつかのコードを追加してください。これは特定の変数に名前をつけます - 答えはそれらの名前を簡単に参照することができます。あなたはまた、 "何が**最高の** [または**最短の**]方法です"と尋ねることができます。 –

答えて

8

タスクは2つのステップで構成されています。あなたは、ベクター内の重複する要素を許可するため、既存の要素を挿入したいしたい場合は、

match v.binary_search(&new_elem) { 
    Ok(pos) => {} // element already in vector @ `pos` 
    Err(pos) => v.insert(pos, new_elem), 
} 

binary_searchで挿入位置を見つけ、Vec::insert()を挿入しますそれがさらに短く書くことができます。

let pos = v.binary_search(&new_elem).unwrap_or_else(|e| e); 
v.insert(pos, new_elem); 

しかしを:可能これは実行時の複雑さがO(n)であることを示しています。中央に挿入するには、挿入位置の右にあるすべての要素を右に移動する必要があります。

だから、でサイズが小さくないベクトルにいくつかの要素を挿入する必要がありません。特に、は、この挿入ソートアルゴリズムがO(n²)で実行されるため、このメソッドを使用してベクトルをソートするべきではありません。

BinaryHeapは、このような状況では、より良い選択かもしれません。各インサート(push)は、O(n)ではなくO(log n)というランタイムの複雑さを持ちます。あなたが望むならば、それをとinto_sorted_vec()とソートしたものに変換することもできます。ヒープを変換せずに引き続き使用することもできます。

関連する問題