以常數平均時間執行增刪改操作的技術(注意是平均時間),但不適用於排序。通俗講就是hashmap,hashset。
理想的雜湊是具有一些項的固定大小的陣列(這些項可以當作key)。和linkedlist一樣,這個陣列是可以改變的,每次變化都是原陣列*2,然後找比這個數大的最小素數,以這個素數為新的陣列大小。
雜湊函式簡單來說就是用來得出雜湊中項的函式。最基本的乙個就是key%arr.length;
注意:這裡的key並不是指我們在程式設計中用到的key,而是雜湊中的項在儲存之前的值,這些值雖然唯一,但並不是直接使用。
舉個例子,我們有10,11,12,13,14這五個數作為雜湊的key,而arr陣列大小為10,通過key%arr.length可以得到0,1,2,3,4,這些也就是儲存在雜湊陣列中的值。
前面提過了,就是hashmap和hashset。以hashmap為例,總所周知,map中以key為關鍵字儲存value,這裡的key就是通過雜湊函式計算儲存起來的,具體操作是:先將得到key的hashcode值,然後通過雜湊函式得到乙個int資料(雜湊函式中mod的值不一定是10,可以很大,以此來控制返回的int大小),這個int資料會被作為乙個資料的下標,而陣列中中放的就是value(所以hashmap的本質和linkedlist一樣是個陣列)。
通過上面的描述會發現僅僅是通過雜湊函式還不足以解決生成唯一的陣列下標值,假如 map.put(「key1」, 「value1」);map.put(「key2」, 「value2」);的時候,key1和key2的雜湊值恰好為10和20,那麼這是key1%10和key2%10都是0,這明顯不能作為唯一識別符號中,更不能作為hashmap的唯一識別符號(實際上在hashmap中確實都放入了陣列同乙個位置,即value1和value2都放入了陣列下標為0的位置)。
hashmap為解決衝突使用了分離鏈結法,說白了就是先將雜湊函式得到的值不存入雜湊中,而是先存入乙個列表中,然後再將列表存入陣列中。
用上面的例子就是:key1=arr.get[0].get(10);key2=arr.get[0].get(20);這裡只是展示各偽**,arr是hashmap底層真正儲存資料的陣列,下標0就是key1和key2變成雜湊值10和20後再通過雜湊函式得到的0。
定義 hash(key)=(key+f(i))%arr.length; f(i)=i; f(i)是線性函式
同樣先通過雜湊函式得到10和20,此時我們先放的是key1的10,這樣10就會存在arr[0],接下來放key2的20的時候就會發現arr[0]被占用了,他就會去找arr[1],此時發現arr[1]為空,他就會放在arr[1]中,如在這時再放乙個30的key3的話他就會按順序放在arr[3],即執行定義hash(key)。
定義 hash(key)=(key+f(i))%arr.length; f(i)=i^2; 設i=2
線性探測的公升級版,接著上面的key3說,可以看出線性探測法的缺點,如果之後依次放40,50,60的話都會從arr[0],arr[1],arr[2]來依次查詢,很浪費時間,平方探測法就是當準備放30的時候發現arr[0]已經被占用了,且之前放20的時候發生過一次衝突(此時arr[0])=10,arr[1]=20)。那麼此時不再直接去探測arr[1]而是去(0+4)%10的位置arr[4]後面的依次執行hash(key)。
第5周周記 Milking Time
這周學了線性dp 感覺難度又上了乙個檔次。但不要緊努力就會有結果的,milking time 這個題算簡單的吧,但做的少花了我很長時間 我的思路很簡單,就是把他們按照結束時間從小排列,開始時先讓他們加上r 與其他的比較 dp i max j是他的時間小於i的時間加r的最後乙個位置的數 如下 incl...
BW專案周記 第5周
本週由於要完成政治任務,所以,基本上沒辦法進行培訓.另外,行業比較特別的業務型別基本上討論得差不多了,下一步可以開始做需求了.本週由於沒有關鍵使用者的參與,基本上是我乙個人自己在系統中做獲利能力分析的模型和資料來源,基本上把測試系統的資料都抽取上來了,可以認為獲利能力分析如果只要收入和成本2項的話,...
學習周記(五)
了解sql注入 使用phpstudy,sqllabs搭建注入環境 學會sqlmap基本用法,熟練掌握聯合查詢的注入方法。2.完成情況 1 對於sql注入 注入攻擊是web中一種最為常見的攻擊方式,無論是sql,還是xss,或者是其他的注入攻擊,對web安全造成的威脅還是很大的。而sql作為長期佔據 ...