値0のキーを効率的にランダムに削除するにはどうすればよいですか?
Dictionary<string, int> dict = new Dictionary<Edge, int>();
dict.add("a",0);
dict.add("b",0);
dict.add("c",0);
dict.add("d",1);
辞書のサイズは10000です。
値0のキーを効率的にランダムに削除するにはどうすればよいですか?
Dictionary<string, int> dict = new Dictionary<Edge, int>();
dict.add("a",0);
dict.add("b",0);
dict.add("c",0);
dict.add("d",1);
辞書のサイズは10000です。
このような何かがそれを行う必要があります:
IEnumerable<string, int> pairsToRemove = dictionary.Where(pair => pair.Value == 0);
ランダムインデックスを生成するには、次を使用できます。
int indexToRemove = [RandomNumber] % pairsToRemove.Length() -1;
pairToRemoveからindexToRemove番目の要素を見つけて、ディクショナリから削除します。
効率について:複雑さは、O(n)[値0のすべてのアイテムを取得] + O(.6N)[削除するi番目の値を見つける] + O(log(n))[削除]である必要があります。一定の時間。
問題は、O(n)時間よりも長く辞書で値ルックアップを実行する方法がないことです。それがあなたのボトルネックになります。
これにより、値がゼロの最初のアイテムが削除されます。正確には「ランダム」ではありませんが、決定論的ではありません。
Dictionary<string, int> dict = new Dictionary<string, int>();
string keyToRemove = null;
foreach (var kvp in dict)
{
if (kvp.Value == 0)
{
keyToRemove = kvp.Key;
break;
}
}
if (keyToRemove != null)
{
dict.Remove(keyToRemove);
}