关于算法一些事
1. HashMap
- 题目:HashMap的get迭代了一个链表,那怎么保证HashMap的时间复杂度O(1)?链表的查找的时间复杂度又是多少?
public V get(Object key) {
if (key == null)
return getForNullKey();
int hash = hash(key.hashCode());
for (Entry<K,V> e = table[indexFor(hash, table.length)]; e != null; e = e.next)
{
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
return e.value;
}
return null;
}
- 判断key,根据key算出索引。
- 根据索引获得索引位置所对应的键值对链表。
- 遍历键值对链表,根据key找到对应的Entry键值对。
- 拿到value。
- 当数据量特别大时,难免遇到 Hash collision (哈希冲突),这时候就需要在Key对应的地址后面,添加链表,而链表的遍历时间复杂度是O(n)。
PS:Hash collision (哈希冲突) 的一般解决方法是,用新 Hash 函数,直至不重复为止。(其他方法,暂时看不懂)