雜湊表是一種空間換時間的資料結構,在演算法中提公升效率的一種常用的方法。但是,正如其特點,有時候所消耗的空間,真讓人頭疼,用的時候在二者之間權衡。
雜湊表,又叫雜湊表(hashtable),是能夠通過給定的關鍵字的值直接訪問到具體對應值的資料結構。也就是說,把關鍵字映到乙個表中的位置來直接訪問記錄,以加快訪問速度。
通常,我們通過key來找value,也就是說,通過key訪問乙個對映表來得到value的位址。而這個對映表,也叫作雜湊函式或者雜湊函式,存放記錄的陣列叫做雜湊表。
如果可以通過不同的key訪問到同乙個value,那麼就發生了碰撞,我們需要的是通過乙個key可以訪問到唯一的value。
常用的處理衝突的方法有:
開放位址法(開放定址法)
就是當這個key通過雜湊函式找到存放value位址的位置,當這個位置已經存放資料,就存在其緊跟著後面沒有占用的位置,如果超過了最大長度,對最大長度取餘,這裡移動的位址是產生衝突的偏移量。
再雜湊法
產生衝突後,用關鍵字其他部分繼續計算位址,直到不產生衝突,當這種方法增加了時間。
鏈位址法
當產生衝突,把處於同一位址的資料做成乙個鍊錶,這種方法最常見。
建立公共溢位區
建立乙個公共溢位區,把產生衝突的新位址放在這個公共溢位區里。
訪問速度快
由於雜湊表有雜湊函式,把key對映到乙個位址上,訪問key對映的value時候,不需要查詢,直接跳到那個位址,因此,雜湊表的增刪改查等任何操作,速度都比較快。
需要額外的空間
當發生衝突,需要額外的空間去儲存,空間換時間,有捨才有得。
無序為了快速找到訪問的元素,根據雜湊函式直接找到儲存位址,訪問速度就快起來,但是有序訪問沒有辦法實現。
可能產生碰撞
沒有完美的雜湊函式,無論如何總會產生衝突,採用衝突的處理辦法,就會使雜湊表變得更加複雜。
下面展示如何實現乙個雜湊表,這裡用陣列代替雜湊表元素(在在真實情況下,大多數語言的實現中,大多數元素都是乙個特別的陣列,每個元素對應乙個位址),每個陣列元素作為乙個位址。
public
class entry
}
public
class
hashtable
entry e = table[index];
if (e.next == null)
}else
}//不存在相同的值,直接向鍊錶中新增元素
entry temp = table[index].next;
entry newentry = new entry(key, value, temp);
table[index].next = newentry;
size ++;}}
/*** 刪除
*@param key
*/public
void
remove( int key) }}
}/**
* 獲取
*/public
intget(int key) }}
}return -1;
}/**
* 獲取雜湊表中元素的個數
*/public
intsize()
/*** 本身雜湊表是不該有這個方法的,在這裡只是為了清楚地看到確實擴容了。
*@return
*/public
intgetlength()
/*** 根據key,通過雜湊函式獲取位於雜湊表陣列中的哪個位置
*@param key
*@return
*/public
inthash(int key)
/*** 擴容
*/public
void
resize()
table[index].next = new entry(next.key, next.value, table[index].next);
//可以用下面三行代替
// entry temp = table[index].next;
// entry newentry = new entry(next.key, next.value, temp);
// table[index].next = newentry;
entry = next;}}
}
}
}
public
class hashtabletest
}
筆記 演算法複習筆記 陣列 集合 雜湊表(上)
陣列是資料結構中最基礎的儲存方式之一,集合是陣列的延伸,雜湊表,又稱雜湊表 hash table 許多高階語言中都是在陣列的基礎上實現的,當然還有其他實現形式。1 定長 陣列的的長度是固定的,陣列的長度在宣告時候已經確定,在使用的時候發現不夠用,只能重新宣告乙個陣列 2 按照順序訪問 在訪問陣列中某...
演算法筆記陣列
資料型別 陣列名 陣列大小 int a 5 初始化時第乙個元素賦值為0全為0 1 include2 intmain 5for int i 1 i 4 i 12 13 14for int i 0 i 5 i 1718 return 0 19 int a 5 6 中間的括號不能缺。陣列大小較大 大概10...
C複習筆記(陣列的使用)
c語言不允許對陣列大小做動態定義 c語言規定只能逐個引用陣列元素,不能一次引用整個陣列 即將陣列作為乙個整體來使用 c語言中,陣列的概念有點類似數學中的集合,陣列的初始化可以使用集合形式進行初始化 在陣列上實現迴圈佇列可以很好地解決斐波那契數列問題 c編譯器對陣列訪問越界沒有警報,這樣會增加程式設計...