【问题标题】:How does look up for a hash table work in .NET?如何在 .NET 中查找哈希表?
【发布时间】:2011-10-26 05:39:21
【问题描述】:

我尝试比较哈希表查找和线性搜索的性能。我创建了一个包含 1000 个项目的哈希表,发现在哈希表中查找所需的时间为 0.0002(我使用DateTime.Now 找出查找前后的系统时间并减去它们)。我在一个数组中有相同的 1000 行,并使用线性搜索查找相同的值。结果证明它比哈希表查找所花费的时间要少。

我认为哈希表比线性搜索更快。它是如何工作的?

【问题讨论】:

  • 1000 实在是太小了,hash table 的优势在项数多的时候就体现出来了。
  • @kd7:不,这根本不是问题。问题是他只进行了一次查找,并且可能该项目恰好位于数组的前面。
  • 从 DateTime.Now 中得到的最小增量在绝大多数机器上是 0.0156 秒。如果你杀死 3 只山羊并牺牲你最大的山羊,那么你可能会得到 0.0010。鉴于您测量了 0.0002 并且 得到了违反直觉的结果,更大的可能性是您的测试完全无效。简单的假设,因为您没有给任何人验证它的机会。
  • How does a hash table work? 的可能重复项
  • @Joe,我不认为这是重复的,因为这个问题是理论;这个问题涉及实际实现 - .Net System.Collections.Hashtable

标签: .net search hashtable linear-search


【解决方案1】:

首先,你的计时机制不好。如果你想测试性能,你应该使用像System.Diagnostics.Stopwatch这样的高分辨率计时器。

其次,您需要找到随机且均匀分布在您的查找空间中的许多查找的平均查找时间,而不仅仅是某个特定项目的查找时间。

【讨论】:

  • 这不能回答问题,HashTable 是如何工作的(在.Net 中)
【解决方案2】:

答案可以在这篇文章中找到:

An Extensive Examination of Data Structures Using C# 2.0,

在名为“System.Collections.Hashtable 类”的部分中

这是(非常)简短的概要:

添加到集合中 (Add(object key, object value)):

  1. 接收keyvalue参数
  2. 将哈希算法应用于key 参数。这是一个复杂的公式,它使用Object.GetHashCode() 方法并在索引中产生一个介于 0 和 hashsize 之间的位置(哈希表中的槽数System.Collections.HashTable 使用的内部查找结构) .
  3. 在该位置插入 DictionaryEntry 对象。

访问集合中的项目(object this[object key] { set; get; }):

  1. 接收key参数
  2. 使用key 参数上的哈希算法计算哈希表中的位置。
  3. 返回存储在该位置的项目的value

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-24
    • 2015-07-09
    • 2016-04-03
    • 1970-01-01
    • 2019-01-03
    • 2012-07-02
    • 2011-11-11
    • 1970-01-01
    相关资源
    最近更新 更多