符号表的实现有很多方式,下面介绍其中的几种。
乱序(未排序)数组实现
这种情况,不需要改变数组,操作就在这个数组上执行。在最坏的情况下插入,搜索,删除时间复杂度为O(n)。
有序(已排序)数组实现
这种情况我们就有了排序好的关键字和相应的值。
通过关键字在数组中存储
keys[i]为第i位大的key(关键字)
values[i]就是第i位大key对应的值
由于元素是按顺序存储在数组中的,找某个元素就可以用简单的二分搜索。最差的情况,搜索时间复杂度为O(log n),插入和删除时间复杂度为O(n)。
乱序的链表实现
只需要有两个元素的链表就行了。搜索,插入,删除的时间复杂度都是O(n)。
有序链表实现
这种方式下,当我们插入元素时,要保持原素的关键字为有序的(比如大小顺序)。即使链表已经排序好了,最坏情况下的插入,删除,搜索操作时间都要O(n)。
其它一些实现方法:
二叉树实现
平衡二叉树实现
三元搜索实现
散列表实现
各种符号表实现方式的比较
Implementation | Search | Insert | Delete |
Unordered array | n | n | n |
Ordered Array | log n | n | n |
Unordered List | n | n | n |
Ordered List | n | n | n |
Binary Search Trees (O(log n) on average) | log n | log n | log n |
Balanced Binary Search Tree | log n | log n | log n |
Ternary Search | log n | log n | log n |
Hashing (O(1) on average | 1 | 1 | 1 |