字符串的算法一般大公司都會(huì)考到,我們首先要想到高效的hash。如百度查找一組字符串是否出現(xiàn)在某個(gè)文本中,這個(gè)不是考什么kmp,他們想聽(tīng)到的是hash。趨勢(shì)科技考的是從某個(gè)文本中刪除一組字符串,我想也是要hash吧。
1 概述鏈表查找的時(shí)間效率為O(N),二分法為log2N,B+ Tree為log2N,但Hash鏈表查找的時(shí)間效率為O(1)。設(shè)計(jì)高效算法往往需要使用Hash鏈表,常數(shù)級(jí)的查找速度是任何別的算法無(wú)法比擬的,Hash鏈表的構(gòu)造和沖突的不同實(shí)現(xiàn)方法對(duì)效率當(dāng)然有一定的影響,然 而Hash函數(shù)是Hash鏈表最核心的部分,本文嘗試分析一些經(jīng)典軟件中使用到的字符串Hash函數(shù)在執(zhí)行效率、離散性、空間利用率等方面的性能問(wèn)題。
2 經(jīng)典字符串Hash函數(shù)介紹先提一個(gè)簡(jiǎn)單的問(wèn)題,如果有一個(gè)龐大的字符串?dāng)?shù)組,然后給你一個(gè)單獨(dú)的字符串,讓你從這個(gè)數(shù)組中查找是否有這個(gè)字符串并找到它,你會(huì)怎么做?有一個(gè)方法最簡(jiǎn)單,老老實(shí)實(shí)從頭查到尾,一個(gè)一個(gè)比較,直到找到為止,我想只要學(xué)過(guò)程序設(shè)計(jì)的人都能把這樣一個(gè)程序作出來(lái),但要是有程序員把這樣的程序交給用戶,我只能用無(wú)語(yǔ)來(lái)評(píng)價(jià),或許它真的能工作,但...也只能如此了。最合適的算法自然是使用HashTable(哈希表),先介紹介紹其中的基本知識(shí),所謂Hash,一般是一個(gè)整數(shù),通過(guò)某種算法,可以把一個(gè)字符串"壓縮" 成一個(gè)整數(shù),這個(gè)數(shù)稱為Hash.