算法筆記:散列表的實現(xiàn)一

散列表 就是哈希表衫哥。
思想是:用數(shù)組支持按照下標隨機訪問數(shù)據(jù)的特性實現(xiàn)的一種數(shù)據(jù)結(jié)構(gòu)茎刚,時間復(fù)雜度是O(1)。是數(shù)組的一種擴展撤逢。
散列表中使用散列函數(shù)把元素的鍵值映射為下標膛锭,將數(shù)據(jù)存儲在數(shù)組中對應(yīng)的下標中粮坞。
查詢元素的時候用同樣的散列函數(shù),將鍵值轉(zhuǎn)化為數(shù)組下標初狰,從而讀取到位置莫杈。

散列函數(shù)

散列函數(shù) 是用來把Key進行散列的一個方法。
設(shè)計基本要求:

  • 計算的散列值是一個非負整數(shù)
  • key值相等奢入,散列后的值也相等筝闹。
  • key值不相等,散列后的值不相等腥光。
    著名的哈希函數(shù)算法 MD5,SHA,CRC算法也無法避免哈希沖突关顷。所以第三點要求無法達到完美的匹配。

散列沖突

哈希沖突是 計算hash值武福,兩個不同的key 得到兩個一樣的hash值议双。
常用的哈希沖突解決方案有兩類:開放尋址法與鏈表法

開放尋址法

核心思想:出現(xiàn)散列沖突,重新探測一個空閑位置將其插入艘儒。

線性探測
  1. 插入數(shù)據(jù)
    往鏈表中插入數(shù)據(jù)聋伦,某個數(shù)據(jù)經(jīng)過散列后存儲位置被占用,從當前位置開始往后進行查找界睁,查找到空閑位置就將數(shù)據(jù)插入到空閑位置。


    摘自極客時間
  2. 查找數(shù)據(jù)
    通過散列函數(shù)求出要查找元素的鍵值對對應(yīng)的散列值兵拢,比較數(shù)組下標中的散列值是否相等于要查找的元素翻斟。相等,則是我們要查找的數(shù)據(jù)说铃,不相等則按照順訊往后依次查找访惜。遍歷到數(shù)組空閑的位置還沒有查找到需要的元素,就說明要尋找的元素沒有在散列表中


    摘自極客時間
  3. 刪除數(shù)據(jù)
    刪除數(shù)據(jù)腻扇,并不是真的把數(shù)據(jù)刪除债热,而是在數(shù)據(jù)上標記為deleted,線性探查的時候遇到標記為deleted空間不停止,繼續(xù)往下探測幼苛。
  4. 存在的問題
    線性探測窒篱,插入的數(shù)據(jù)越多,散列沖突的可能性越大舶沿,并且空閑位置越來越少墙杯,極端情況下可能需要將整個散列表進行遍歷尋找空間。
二次探測和雙重散列

二次探測在一次探測的基礎(chǔ)上進行步長的平方括荡。
雙重散列使用的是一組散列函數(shù)高镐,先用第一個散列函數(shù)計算哈希值,如果被占用畸冲,在用第二個散列函數(shù)嫉髓,如果還被占用观腊,以此類推進行第三個第四個散列函數(shù),直到找到空閑的存儲位置算行。

采取哪種方式的探測梧油,隨著數(shù)據(jù)量的增大,空閑位置不多的情況纱意,哈希沖突的概率就會增大婶溯。因此就需要保證散列表中存儲一定比例的空閑槽位。
解決方案:裝載因子
裝載因子 = 填入表中的元素個數(shù)/散列表的長度
裝載因子越大偷霉,空閑位置越少迄委,沖突越多,性能就會下降类少。

鏈表法

在散列表中 增加桶或者槽的概念叙身,Java中就是類似的概念。并且每個槽對應(yīng)一條鏈表硫狞,所有散列表值相同的元素信轿,我們都放到相同槽位對應(yīng)的鏈表中。


摘自極客時間

插入時間復(fù)雜度是O(1);
查找與刪除残吩,計算出hash值之后财忽,去鏈表中進行遍歷。
時間復(fù)雜度與鏈表的長度k有關(guān),也是就是O(K)泣侮。
散列均勻的散列函數(shù) k = n/m 即彪。 n代表的是散列中數(shù)據(jù)的個數(shù),m代表散列表中槽的個數(shù)活尊。

問題

10萬條URL訪問日志隶校,按照訪問次數(shù)給URL排序?
兩個字符串數(shù)據(jù)蛹锰,每個數(shù)組大約有10萬條字符串深胳,快速查找數(shù)組中相同的字符串。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末铜犬,一起剝皮案震驚了整個濱河市舞终,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌翎苫,老刑警劉巖权埠,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異煎谍,居然都是意外死亡攘蔽,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門呐粘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來满俗,“玉大人转捕,你說我怎么就攤上這事∷衾” “怎么了五芝?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長辕万。 經(jīng)常有香客問我枢步,道長,這世上最難降的妖魔是什么渐尿? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任醉途,我火速辦了婚禮,結(jié)果婚禮上砖茸,老公的妹妹穿的比我還像新娘隘擎。我一直安慰自己,他們只是感情好凉夯,可當我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布货葬。 她就那樣靜靜地躺著,像睡著了一般劲够。 火紅的嫁衣襯著肌膚如雪震桶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天征绎,我揣著相機與錄音尼夺,去河邊找鬼。 笑死炒瘸,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的寝衫。 我是一名探鬼主播顷扩,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼慰毅!你這毒婦竟也來了隘截?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤汹胃,失蹤者是張志新(化名)和其女友劉穎婶芭,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體着饥,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡犀农,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了宰掉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片呵哨。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡赁濒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出孟害,到底是詐尸還是另有隱情拒炎,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布挨务,位于F島的核電站击你,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏谎柄。R本人自食惡果不足惜丁侄,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谷誓。 院中可真熱鬧绒障,春花似錦、人聲如沸捍歪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽糙臼。三九已至庐镐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間变逃,已是汗流浹背必逆。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留揽乱,地道東北人名眉。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像凰棉,于是被迫代替她去往敵國和親损拢。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容