哈希表最大的优点就是高效,在哈希表中插入,删除或查找一个元素都只需要O(1)时间,常被用来优化时间效率。
1 哈希表的设计
1)如何快速一个元素在哈希表中位置
答:可以使用一个数组
2) 如何解决哈希冲突
答:可以把存入数组同一位置的多个元素用链表存储。
3)如何保证存入和读取删除一个元素时间是O(1)
答:哈希表中元素数目与数组长度的比值超过一定阈值就对数组进行扩容。
剑指offer II 30 插入,删除和随机访问都是O(1)的容器
思路:用一数组存放插入得值;用一个hash ,key为数组的值,value为数组的位置;数组可以保证随机等概率O(1)访问,hash表保证插入删除是O(1);
剑指offer II 31最近最少使用缓存
思路:hash+双链表,hash 键值为输入的key,value为链表节点,链表存放value值。
get(key):检查hash有无这key,有的话返回对应的值。
put(key, vaule): 如果key已经存在,改变value值并把对应的节点移到链表头,否则先检查链表是否已经满了,满了的话将链表尾去掉,在链表头添加节点。
step 1:定义双链表结构,实现双链表插入,删除等操作。
2 哈希表的应用
剑指offer II 32 有效的变位词
思路:双指针+哈希
剑指offer II 33 变位词组
思路:哈希+变位词排序。哈希表键值存放排序后得变位词,值存放同一组变位词。