私はC#を使用していますが、それを知らなくても、この質問を理解するのは非常に簡単です。
これが私の問題です。IDに基づいて検索できるように、ハッシュセットのようなデータ構造に保持したいオブジェクトがいくつかありint
ます。これらのオブジェクトには変更可能なプロパティがあるため、ハッシュすることはできません(ハッシュするには、オブジェクトについて一定の定数が必要ですよね?)。
私がやったことは、次のインターフェースを開発することです。
public interface IUniqueIDCollection
{
// Can return any int that hasn't been requested yet.
public int RequestUniqueID();
// Undos the requesting of an int
public int ReleaseUniqueID(int uniqueID);
}
IUniqueIDCollection
私の最初の考えは、IDが要求されると増分する内部カウンターを格納することです。ただし、IDがリリースされたら、削除された範囲または個々のIDを追跡する必要があります。後者の方がいいと思います。しかし、カウンター(または任意の循環関数)を使用してIDを生成すると、カウンターがラップアラウンドすると解放されないことによって連続して要求されたIDのシーケンスをチェックする必要があるという問題が発生します。
ヒューリスティックは次のとおりです。一度に最大5,000個のIDが要求されるとします。ただし、多くの場合、IDが要求されてからリリースされます。リリースは範囲内で発生する傾向があります。つまり、100個すべてが一度に要求され、その後100個すべてが短い時間間隔でリリースされる可能性があります。
intの代わりにGUIDなどを使用できることはわかっていますが、IDのスペース/帯域幅/処理時間を節約したいと思います。
だから私の質問は:ヒューリスティックを考えると、疑似コードの観点から、上記のインターフェースでリクエストとリリースのメソッドはどのように見えるべきですか?