Google Go で再利用可能なプライオリティ キューのコードを記述する方法Less
Push
はPop
?
4 に答える
後者の場合は、人がしなければならないことです。Go にジェネリックがない限り、現時点で利用できる唯一のオプションです。
試したことはありませんが、ケースが特定の制限に適合した場合は、リフレクションタグと構造体タグを使用できます。ヒープ可能な型は、順序付けに使用するフィールドに `pq:" Key "`のようなタグが付いた構造体であり、そのフィールド型は<比較可能である必要があります。これはLessメソッドよりもはるかに強力ではありませんが、ニーズを満たす可能性があります。
申し訳ありませんが、サンプルコードはありません。それほど難しいことではないと思いますが、少し時間がかかります。運動のために残しました。
任意の構造体を処理する必要があり、単純なキー制限を使用できる状況がある場合は、この手法を試すことができます。ただし、有限の型のセットの場合、これは行いません。タイプごとに別々にheap.Interfaceを実装して、本でそれを行うだけです。それは実際にはそれほど多くの作業でも、それほど多くのコード行でもありません。
container/vector
サイズ変更可能なスライスに基づいてこれらのメソッドを実装した標準ライブラリのモジュールには、以前はベクター型があり、モジュールで使用されるコンテナーとして完全に機能していましたheap
。残念ながら、彼らは を取り除いてしまいましたがvector
、それはスライス変数に対する優れたメソッドレベルの抽象化を実装していたので、私には理解できませんでした。そのため、Go でヒープ モジュールを使用している人を見るたびに、スライス変数に基づいて 、 、 などを書く-vector
の一部を基本的に再実装する必要があります。Push
Pop
Length
質問を理解しているかどうかわかりません。
ここでは、格納された型として interface{} を使用して、キュー (およびスタックとリング) を実装しました。
https://github.com/iNamik/go_container
interface{} を使用すると、必要な型を格納できます。型をジェネリックとして強制するのには役立ちませんが、仕事は完了します。
手間をかけずにプライオリティ キューを作成することができました。
何か不足していますか?
便利だと思われる場合は、プライオリティ キュー コンテナーを追加させていただきます。