在我的上一个项目中,我发现自己遍历了许多数组或字符串列表,以便在其中找到特定的字符串。
我必须问一下,为了在数组中找到特定成员,有什么方法可以少于O(n)
吗?
C#中的O(n)
解决方案(考虑没有重复项):
foreach(string st in Arr)
{
if (st=="Hello")
{
Console.WriteLine("Hey!");
break;
}
}
编辑:我没有问我的问题。我也希望改变我希望找到的成员,不仅要看他。 所以我的代码段改为:
foreach(string st in Arr)
{
if (st=="Hello")
{
st="Changed";
break;
}
}
你能以某种方式到达O(logn)
吗?如果是这样,你能否进一步解释它是如何完成的,它比我的解决方案更有效率。
谢谢你对此事的任何启发!
答案 0 :(得分:8)
是否有任何方式小于O(n)才能找到特定成员 在一个数组里面?
如果您有一系列不重复的字符串,并且排序不是问题,那么您应该使用HashSet<T>
,在正态分布的情况下,您应该在O(1)
处<强>查找强>:
var hashSet = new HashSet<string> { "A", "B", "C" };
if (hashSet.Contains("A"))
{
Console.WriteLine("hey");
}
如果您需要的不仅仅是查找,例如访问特定索引的成员,那么HashSet<T>
不应该是您的选择。如果你想要更详细的答案,你需要准确指定你将要对集合做什么。
答案 1 :(得分:1)
哥本哈根大学有一个名为"C5 Generic Collection Library"的项目。他们已经实现了一组扩展的集合类,可以帮助你,比如HashSet允许重复名为hashbag,并且他们有一个哈希索引的数组列表可能证明是有用的......