我只是想提供一个不同的角度,以进行比较。
假设您经常进行反向查找,并且希望它比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)像正常字典?请注意,以下所有答案都涉及字典的全面扫描。 –