我只是想提供一個不同的角度,以進行比較。
假設您經常進行反向查找,並且希望它比O(N)操作更好。
你可以使用兩個字典而不是一個來實現。爲了簡化示例,我將使用微軟的預發佈版MultiValueDictionary
(您可以通過NuGet獲取)。
這種方法產生的O(1)查找:
using System;
using System.Collections.Generic;
using System.Linq;
namespace Demo
{
internal class Program
{
public static void Main()
{
var names = new Names();
names.Add(1, "Robin");
names.Add(1, "Rahul");
names.Add(1, "Adam");
names.Add(1, "Akhtar");
names.Add(2, "Sun");
names.Add(2, "Mon");
names.Add(2, "Adam");
names.Add(3, "a");
names.Add(3, "a");
names.Add(3, "c");
Console.WriteLine("IDs for Adam:");
foreach (int id in names.IdsOf("Adam"))
Console.WriteLine(id);
}
public sealed class Names
{
readonly MultiValueDictionary<int, string> names = new MultiValueDictionary<int, string>();
readonly MultiValueDictionary<string, int> lookup = new MultiValueDictionary<string, int>();
public void Add(int id, string name)
{
names.Add(id, name);
lookup.Add(name, id);
}
public IEnumerable<int> IdsOf(string name)
{
IReadOnlyCollection<int> result;
if (lookup.TryGetValue(name, out result))
return result;
else
return Enumerable.Empty<int>();
}
public IEnumerable<string> NamesOf(int id)
{
IReadOnlyCollection<string> result;
if (names.TryGetValue(id, out result))
return result;
else
return Enumerable.Empty<string>();
}
}
}
}
是否需要將反向查找會是〜O(1)像正常字典?請注意,以下所有答案都涉及字典的全面掃描。 –