- HashMap和Hashtable的区别
Map interface.
Allow NULL(key);
unsynchronized.
not ordered。 eg: 2%16=2. 1%16=1,先存进去的数不一定排在前面。
底层都是array
- Hashfunction
选择质数,不然可能有公约数导致hash confliction。
有hash confilct的话:
Separete chaining.可以用链表(linklist)连接起来所有同hash value的node。(主要记忆即可)。优化方向还可以是BST(访问时间logn)
或者Linear probing:当前confict,找到下一个,直到找到空位。 但是可能效率比较低。
Double Hashing: 发现conflict, 用secondary hash、
- rehash,根据load effector。
常见题型
- sliding window
- 利用hash思想去重,赵duplicate,0(1)时间查找
- 有关cache的设计题
解题思路,一开始没想法先找brute force的复杂度,然后想办法优化。
例题: contain Duplicates. 利用hashmap(num[i],i),然后用一个pointer代表尾部, find有无相同,然后判断index是不是前面k长度以内的。 也可以put value的时候判断之前最近的index是哪个,然后更新掉value,index的pair
也可以排序好,然后用list《node》存储index和value,然后for去判断相邻的==value的index在不在范围内
例题48min:longest substring without repeating characters.
可以用two pointer做法,然后hashmap存Slow和fast中间的字母判重复,然后重复了之后slow直接移动到fast的位置。不用慢慢移动。
例题:1h2min。 shortest substring contains the all given characters.
brute force。
而且这里hashpmap不能存index,因为"abbbc",s就不能直接跳了,要一点点移动。f是未满足sunstring的时候移动,s是满足的时候移动。
检查hash是否符合的可以用for loop。 也可以用一个global variable match=n; hashmap里面存需要出现的count,出现一次hash里面对应元素-1. 然后match+1.也可以表示是否符合标准,这样就不用for遍历hash了
例题1h38min: repeated DNA sequences()可以直接把所有10位长度substing存到hash,然后后面判断有没有出现过
还可以用bitmap,A:00,C:01,G:10:,D:11. hashvalue作为key也可以,substring作为value
例题:LRU cache:hashmap
linkedlist只能表示加进cache的顺序,但是get(1)不能反映到linklist里面,
queue不行因为移动的不一定是开头和末尾,中间的无法改变。
思路2h17min处:hash存key,node,node是新class