什么正式区分哈希表和字典?

时间:2015-03-13 20:29:19

标签: powershell dictionary

他们一般有什么区别?

根据Wikipedia字典与关联数组同义。

  • 抽象数据类型,
  • 收集,
  • 包含键值对
  • 其中每个密钥都允许出现一次。

根据维基百科,哈希表是实现字典的常用方法。另一种实现是二叉搜索树。

从那以后,似乎字典是人类,因为哈希表是女性,二元搜索树是男性,或者字典是面食,哈希表是散射器,二元搜索树是意大利面。

dictionary     :: hash table     :: binary search tree
human          :: male           :: female
pasta          :: radiatori      :: spaghetti

令人困惑的是,文档有时会将字典作为参数。 PowerShell documentation(作为众多例子之一)说,

  

输入哈希表或字典。

这只是意味着“输入一个哈希表或任何其他字典实现”,还是他们实际上要求一个称为字典的具体类型?如果是后者,那么具体类型哈希表与具体类型字典的区别是什么?

2 个答案:

答案 0 :(得分:2)

我想说不要过于依赖术语的字典定义。

如果我们专注于课程,[System.Collections.Generic.Dictionary][System.Collections.Hashtable]它应该有所帮助。

你可以看到这两个类都实现了IDictionary接口,这可能只会让你的问题更加混乱,但这可能是使参数更容易采取任何一个的关键(它可能是获取实现该接口的任何对象)。

当他们说它需要一个词典时,他们可能意味着它接受[IDictionary]

您还可以看到these classes are implemented a bit differently[Dictionary]是关键字和值的模板,而这在PowerShell中并不常见,这可能是您经常看不到它的原因。

答案 1 :(得分:1)

人们可以说 dictionary abstract 数据类型(ADT),而 hash表就像您自己所暗示的那样通过引用源代码,是字典的具体实现,与二进制搜索树相同。字典只是让您将键与值相关联,它是一个接口。接口未定义实现。许多类可以实现相同的接口,但原理不同。与执行给定哈希函数的成本相比,在内存访问和数据比较的成本可以忽略的机器上,通过键上的简单线性迭代实现的字典可能比哈希表更好。尤其是对于较小的字典大小。

字典接口或ADT是一组函数签名-使用给定键获取值,枚举键和/或值,获取键/值的数量。然后设计类,通过提供与这些签名匹配的实际功能来实现该接口。

Powershell似乎(在大多数情况下)与这种推理方式一致-自然地,哈希表是实际对象,它们属于(非抽象)类。具体来说,是System.Collections.HashTable类。此类声明实现System.Collections.IDictionary 接口

有趣的是,Powershell 确实有一个具体“通用”字典 class -System.Collections.Generic.Dictionary<TKey,TValue>。该字典类似乎没有暗示任何机制。还有其他类似的“泛型”类可以根据各种因素(例如是否允许对字典进行更改(在运行时),是否对字典进行“排序”等)进行区分,但是它们也不暗示如何进行分类。值查找实际上已经完成,仅此而已。

这些“通用”字典实现中的任何一种是否都可以满足某种纯粹主义者的说法,仍有待商,,但又有人可能会认为System.Collections.Generic.Dictionary<TKey, TValue>是为应用程序设计人员不想或不需要为如何打扰而设计的。它们的字典已实现。该类实际上是该字典类或其他类型的字典类的“类型别名”,例如哈希表,二叉树或完全不包含其他内容的其他任何东西。我不确定为什么.NET设计人员不会只使用using Dictionary = System.Collections.HashTable来代替别名。