C# 是HashSet<;T>;要查找的最快容器?
我需要检查特定字符串是否包含在其他字符串集中:C# 是HashSet<;T>;要查找的最快容器?,c#,.net,contains,hashset,C#,.net,Contains,Hashset,我需要检查特定字符串是否包含在其他字符串集中: private bool Contains(string field) { return this.Fields.Contains(field); // HashSet<string> local property } private bool Contains(字符串字段) { 返回this.Fields.Contains(field);//HashSet本地属性 } 如果容器只有一个任务,那么最好使用哪种类型的容器?保存多
private bool Contains(string field)
{
return this.Fields.Contains(field); // HashSet<string> local property
}
private bool Contains(字符串字段)
{
返回this.Fields.Contains(field);//HashSet本地属性
}
如果容器只有一个任务,那么最好使用哪种类型的容器?保存多个字符串并检查另一个是否进入?是的,HashSet非常适合这样做,因为它包含一个要查找的值,而字典需要一个键和一个值。HashSet有效吗?当然但这不是你问的问题。您要求尽可能快地查找 这是最快的吗?不,当然不是,无论如何也不是 首先,为了谈论“最快”,我们需要准确描述“最快”的含义。你是说:
- 最小最坏情况时间
- 在多个计时中平均的最小平均计时
- 给定特定使用模式的最小平均定时
- 别的
for(i = 0; i < 10; ++i) { foo.bar(i); }
(i=0;i<10;++i){foo.bar(i);}
在这里,我们必须在由“foo”标识的对象中查找字符串“bar”十次。“foo”中实现该查找的哈希表在第一次通过循环时会注意到使用了“bar”,因此它会动态调整哈希表结构,以便第二次通过循环时,查找速度更快。这是我们在实现JScript时采用的策略
现在,这优化了循环的情况,但它可能会使这种情况比实际情况慢:
for(i = 0; i < 10; ++i) { foo.bar(i); foo.blah(i); foo.abc(i); }
(i=0;i<10;++i){foo.bar(i);foo.blah(i);foo.abc(i);}
因为我们没有做更多的分析,而是意识到“嘿,我们只是对这个哈希表重新优化了三次,现在我们要再做一次,也许我们应该保持原样。”
幸运的是,我们没有像您一样寻找尽可能快的查找。我们只是在寻找一个相当快速的查找
您能否仔细完整地描述您的用例,以便尽可能快地查找?有很多算法可以用来加快查找速度,但它们非常复杂。Eric,非常感谢您提供了如此高级的答案!我认为我的用例非常简单。我的asp.net应用程序中的页面具有一些asp.net 2.0控件(如DetailsView或GridView)。此页面的超类创建一个字典,其中控件的数据字段是键,相应的本地化字符串是值。HashSet的Superclass calls Overrided属性包含特定页面所需的字段集,并动态创建单选按钮列表。这是一个搜索面板。因此,在迭代字典时,我必须询问页面是否包含选定字段,以将其插入表中。@abatishchev:您有证据表明应用程序是否被此查找选通?也就是说,这是应用程序中最慢的查找吗?如果这不是门控因素,那么为什么您会关心它是否尽可能快?找到最慢的组件并提高其性能。是的,我当然同意你的开发策略建议!我要说的是,我的发展首先是教育,所以这只是一个例子,我试图了解更多。。例如,通用容器。关于平均和最坏情况性能的一个有趣的点是,当您将恶意数据放入哈希表时,攻击者通常会引发最坏情况性能,导致前例n次插入花费O(n^2)时间,而不是通常的O(n)。因此,web应用程序中存在许多DoS服务漏洞。