glib中的哈希表学习(1)

时间:2022-02-14 23:55:19
哈希表 是一类容器,也称为“映射”、“联合数组(associative array)” 或者“目录(dictionary)”。

正如语文辞典使用一个定义来关联一个词,哈希表使用一个 键(key) 来唯一标识一个 值(value)。哈希表可以根据键非常快速地执行插入、查找和删除操作;实际上,如果使用得当,这些可以都是常数时间 —— 也就是 O(1) —— 操作。这比从一个有序列表中查找或删除条目快得多,那是 O(n) 操作。

哈希表之所以能快速执行操作,是因为它们使用 散列函数 来定位键。散列函数获得一个键并为其计算一个唯一的值,称为 散列值(hash)。例如,一个散列函数可以接受一个词并将那个词中的字母数作为散列值返回。那是个不好的散列函数,因为 “fiddle”和“faddle”将会散列为相同的值。

当散列函数为不同的键返回相同的散列值时,取决于哈希表的实现会发生各种不同的事情。哈希表可以使用第二个值覆盖第一个值,也可以将值放入一个列表,或者或以简单地抛出一个错误。

注意,哈希表不是必然比列表更快。如果拥有的条目较少 —— 少于一打左右 —— 那么使用有序的集合会获得更好的性能。那是因为,尽管在哈希表中存储和获取数据需要常数时间,那个常数时间值可能会很大,因为计算条目的散列值相对于反引用一两个指针会是一个较慢的过程。对于较小的值,简单地遍历有序列表会比进行散列计算更快。

无论何时,重要的是在选择容器时要考虑自己应用程序的具体数据存储需要。如果应用程序很明显需要某种容器,那么没有理由不去使用它。