私は周りを見回してきましたが、これまでのところこれを行う良い方法を見つけることができませんでした. よくある問題ですね、きっと。
次のものがあるとします。
class SomeClass : IComparable
{
private int myVal;
public int MyVal
{
get { return myVal; }
set { myVal = value; }
}
public int CompareTo(object other) { /* implementation here */ }
}
class SortedCollection<T>
{
private T[] data;
public T Top { get { return data[0]; } }
/* rest of implementation here */
}
バイナリ ヒープを実装し、Insert() および DeleteMin() 操作のみをサポートするのではなく、最高 (場合によっては最低) の優先度値での「ピーク」をサポートしたいという考えです。スタック上。ハイゼンベルクが好きだったことは一度もありませんでした。「物事を変えることなく物事を見ることはできません」という不確定性原理. ごみ!
明らかに問題は、呼び出しコードが Top プロパティを介して MyVal (SortedCollection を想定) を変更するのを防ぐ手段が提供されていないことです。この操作では、ヒープが間違った順序で配置される可能性が明確にあります。Top プロパティを介してヒープの内部要素に変更が適用されないようにする方法はありますか? それとも、「インスタンスが挿入されてからキューから取り出されるまでの間にインスタンスを変更しない場合にのみ安定します。YMMV」という警告付きのコードを使用するだけですか。