Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是HashSet<;T>;要查找的最快容器?_C#_.net_Contains_Hashset - Fatal编程技术网

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有效吗?当然但这不是你问的问题。您要求尽可能快地查找

这是最快的吗?不,当然不是,无论如何也不是

首先,为了谈论“最快”,我们需要准确描述“最快”的含义。你是说:

  • 最小最坏情况时间
  • 在多个计时中平均的最小平均计时
  • 给定特定使用模式的最小平均定时
  • 别的
??请明确说明“尽可能快”的含义。我们可以为你设计一个理论上最快的算法,只要我们准确地知道最快的算法对你意味着什么

例如,假设您正在编写编译器。在编译器中,我们一直必须做的事情是检查一个特定的字符串是否在字符串列表中。也许我们正在检查字符串是否是关键字,因此我们必须查找给定字符串是否在集合{“int”、“double”、“for”、“foreach”、“class”…}内

我们可以把它们放在一个散列集合中,获得良好的性能。但是如果我们想要最好的表现,我们可以做得更好。例如,我们可以对几十亿行现有的源代码进行分析,找出哪些关键字最常见,哪些最不常见,然后编写一个自定义哈希表,该哈希表针对(1)快速拒绝根本不是关键字的内容,以及(2)进行优化快速识别最常见的关键字,而忽略识别其他关键字

注意,这需要静态分析;虽然它在典型情况下表现良好,但在使用了大量稀有关键字的罕见情况下表现不佳。我们可以采取的另一种方法是编写一个自调优哈希表,在频繁搜索特定字符串时动态标识该哈希表

例如,如果您正在编写JScript运行时的实现,请考虑。我们经常必须在一组字符串中查找一个字符串:

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服务漏洞。