哈希表 是一类容器,也称为“映射”、“联合数组(associative array)” 或者“目录(dictionary)”。
正如语文辞典使用一个定义来关联一个词,哈希表使用一个 键(key) 来唯一标识一个 值(value)。哈希表可以根据键非常快速地执行插入、查找和删除操作;实际上,如果使用得当,这些可以都是常数时间 —— 也就是 O(1) —— 操作。这比从一个有序列表中查找或删除条目快得多,那是 O(n) 操作。
哈希表之所以能快速执行操作,是因为它们使用 散列函数 来定位键。散列函数获得一个键并为其计算一个唯一的值,称为 散列值(hash)。例如,一个散列函数可以接受一个词并将那个词中的字母数作为散列值返回。那是个不好的散列函数,因为 “fiddle”和“faddle”将会散列为相同的值。
当散列函数为不同的键返回相同的散列值时,取决于哈希表的实现会发生各种不同的事情。哈希表可以使用第二个值覆盖第一个值,也可以将值放入一个列表,或者或以简单地抛出一个错误。
注意,哈希表不是必然比列表更快。如果拥有的条目较少 —— 少于一打左右 —— 那么使用有序的集合会获得更好的性能。那是因为,尽管在哈希表中存储和获取数据需要常数时间,那个常数时间值可能会很大,因为计算条目的散列值相对于反引用一两个指针会是一个较慢的过程。对于较小的值,简单地遍历有序列表会比进行散列计算更快。
无论何时,重要的是在选择容器时要考虑自己应用程序的具体数据存储需要。如果应用程序很明显需要某种容器,那么没有理由不去使用它。
相关文章
- 算法刷题-无重复字符的最长子串(哈希表、字符串)、数字 1 的个数(递归、数学)、对称二叉树(树、深度优先搜索)
- 机器学习中的算法(1)-决策树模型组合之随机森林与GBDT
- HTML学习笔记12——HTML 有语义的标签1(h,p标签,img标签,列表,表格_制作课程表)
- 从3个表中获取已删除的值并放入1个表中
- SQL查询 - 从同一个表中的1条记录更新许多记录
- 1.怎样获得所有的ODBC列表?2.怎样在Delphi中运行修改表结构的SQL语句?
- JavaSE中Collection集合框架学习笔记(1)——具有索引的List
- 机器学习中的正则化技术L0,L1与L2范数
- LTE中的HARQ学习(1)——基本概念
- EXCEL导入到Datagridview的内容并实时更新到.mdb中的表1里面