散列表(hash table)是一种仅支持 增,删,查 操作的集合,理想情况下, 查找一个元素的期望时间是\(O(1)\),因为我们在散列表中通过关键字key查找value, 就好像在数组中通过下标查找对应的值一样。算法导论上说:"散列表是普通数组概念的推广"。
此链表为双向链表(Doubly-Linked List),LinkedList的声明稍微奇葩了些, 主要是为那些频繁的反复的插入节点和删除节点的应用而优化。对于其他的情况,性能应该会低一些。
设计思路是:如果删除了一个节点, 并不会立即free掉此节点,而是扔到节点池(nodes pool)里,等到创建新的节点时, 直接拿出来用而不用开辟新的空间,从而避免频繁的malloc操作,节点池其实就是个单向链表 (尽管里面的节点都有next和prev指针,我们只使用next)。一个明显的副作用就是空间开销可能会大些, 因此节点池的大小需要设置的合理些。
记得某本书上好像写过:C语言设计的理念是: 小即是美。不管他美不美吧, 反正他确实是个很小巧的语言。 也许就是因为"小"吧,在使用C的时候很多东西都是需要自己去代码实现,比如一些常用的数据结构, 真是烦透了。但是自己写的往往都是针对特定数据类型的,不够通用。可惜C没有泛型, 如果为每一个类型单独实现一套数据结构的库,估计是要疯掉了。看过一些库函数的声明之后, 得到了一点启发——把所有类型的数据都看作字节块,从而模拟泛型。 不过这样数据的类型在存取的过程中也就"丢失"了,因此我们需要自己去处理类型转换问题。 当然,为了实现通用性,我想"泛型"的性能可能会低一些。