Data structures 数据结构与#x27;s成员通过哈希值和索引存储

Data structures 数据结构与#x27;s成员通过哈希值和索引存储,data-structures,hash,computer-science,Data Structures,Hash,Computer Science,发件人: 正如我们在“Swift中集合的威力”中所看到的那样,集合相对于数组的一大优势是插入和删除总是可以在恒定(O(1))的时间内执行,因为成员是通过哈希值而不是索引存储的 如果数据结构的成员是通过哈希值而不是索引存储的,这意味着什么?您实际上是在问数组和哈希映射/表/集之间有什么区别。这是计算机科学“数据结构”课程的一部分,我相信你可以用谷歌搜索每个课程的一些高级概述。强烈建议:) 简言之: 您可以将数组想象为一个带有单元格的长架子,其中每个单元格都有序列号(也称为索引): 数组:[狗][猫

发件人:

正如我们在“Swift中集合的威力”中所看到的那样,集合相对于数组的一大优势是插入和删除总是可以在恒定(O(1))的时间内执行,因为成员是通过哈希值而不是索引存储的


如果数据结构的成员是通过哈希值而不是索引存储的,这意味着什么?

您实际上是在问数组和哈希映射/表/集之间有什么区别。这是计算机科学“数据结构”课程的一部分,我相信你可以用谷歌搜索每个课程的一些高级概述。强烈建议:)

简言之: 您可以将数组想象为一个带有单元格的长架子,其中每个单元格都有序列号(也称为索引):

数组:[狗][猫][老鼠][狐狸]…
狗在0号牢房,猫在1号牢房,以此类推

现在,在数组中,您可以使用cell
索引来检索对象,比如“给我cell#1的内容”。但为了确定数组中是否有“鼠标”,您必须遍历所有单元格。(效率低下)


集合(又称散列映射)使用另一个索引(“散列码”)存储对象,这是一种计算每个给定对象的伪唯一数的函数(无需详细说明)。所以cat和mouse将具有唯一的哈希代码,现在对于Set来说,确定集合中是否有“鼠标”是非常有效的。

数组被分配为单个大内存块,条目通过其索引访问。条目的顺序是固定的,除了它们在数组中的位置之外,它们不需要有特定的标识

其他更复杂的数据结构允许存储使用某种键识别和访问的对象。(哈希表、集合、字典等)让我们称这些为“键控集合”。有些对象具有自然密钥,例如“SocialSecurityNumber”,但如果需要密钥,并且数据对象中没有明显的候选字段,该怎么办

散列是一种技术,旨在派生一个与对象关联的“相当独特的标识”。可以将其视为将数字映射到(任意)数据

  • 虽然有一些“标准哈希技术”,但这仍然是一个不断发展的领域——涉及一些有趣的数学
  • 散列的用途包括安全散列(检测并防止故意篡改数据)、错误检测以及(在本例中)键控(或散列)数据访问
  • 非安全散列算法应尽可能快,但优化速度可能需要权衡映射要求的“相当独特”部分(而安全散列不可避免地(有时是故意地)更慢、更昂贵)
  • 散列不能(永远)保证给定的散列值对对象是唯一的,因此必须注意尽量减少“冲突”的发生,并优化在发生冲突时如何处理它们。这是一个很难的主题,当你认为数据必须被视为“任意的”,或者看起来是随机的,包含序列/模式和/或重复。
话虽如此,假设我们有一个“好”的散列函数,我们至少原则上可以在键控集合中存储任意对象

重要注意事项

  • 阵列提供极快的顺序和随机访问(按索引),而插入、删除和增长操作则很慢
  • 键控集合的优点是可以提供极快的插入和删除,但它们本质上是细粒度的,并且会引入诸如内存碎片之类的复杂性(内存管理是一种开销,增加的复杂性意味着增加的成本)
  • 当碰撞开始发生时,性能会迅速下降
  • 没有免费的午餐,计算哈希值相对昂贵(与简单使用索引值或存储键相比)
  • “自然键”和索引所没有的散列有一个特定的缺点,即它们不提供自然的排序/序列。(根据散列值顺序处理对象等同于随机处理对象。)

  • 选择适合其预期用途的数据结构总是很重要的(但这就是您引用的链接的全部内容;-)

    您对数组和哈希映射之间的差异有任何背景知识吗?