1. 程式人生 > >20162309《程序設計與設計結構》第十一周學習總結

20162309《程序設計與設計結構》第十一周學習總結

嚴重 壓縮 關於 從數據 的人 .cn 統計 class 學習機

學號 20162309《程序設計與數據結構》第11周學習總結

教材學習內容總結

關於哈希函數的基本概念:
Hash,一般翻譯做"散列",也有直接音譯為"哈希"的,就是把任意長度的輸入(又叫做預映射, pre-image),通過散列算法,變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是,散列值的空間通常遠小於輸入的空間,不同的輸入可能會散列成相同的輸出,而不可能從散列值來唯一的確定輸入值。簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數。

哈希算法的主要算法用途:
HASH主要用於信息安全領域中加密算法,它把一些不同長度的信息轉化成雜亂的128位的編碼裏,叫做HASH值. 也可以說,hash就是找到一種數據內容和數據存放地址之間的映射關。
1.文件效驗
2.數字簽名
Hash函數的構造:
直接定址法
例如:有一個從1到100歲的人口數字統計表,其中,年齡作為關鍵字,哈希函數取關鍵字自身。
折疊法
將關鍵字分割成位數相同的幾部分(最後一部分的位數可以不同),然後取這幾部分的疊加和(舍去進位)作為哈希地址,這方法稱為折疊法。
除留余數法
取關鍵字被某個不大於哈希表表長m的數p除後所得余數為哈希地址。
H(key)=key MOD p (p<=m)
隨機數法
選擇一個隨機函數,取關鍵字的隨機函數值為它的哈希地址,即
H(key)=random(key),其中random為隨機函數。通常用於關鍵字長度不等時采用此法。
若已知哈希函數及沖突處理方法,哈希表的建立步驟如下:
Step1. 取出一個數據元素的關鍵字key,計算其在哈希表中的存儲地址D=H(key)。若存儲地址為D的存儲空間還沒有被占用,則將該數據元素存入;否則發生沖突,執行Step2。
Step2. 根據規定的沖突處理方法,計算關鍵字為key的數據元素之下一個存儲地址。若該存儲地址的存儲空間沒有被占用,則存入;否則繼續執行Step2,直到找出一個存儲空間沒有被占用的存儲地址為止。

散列(Hashing)通過散列函數將要檢索的項與索引(散列,散列值)關聯起來,生成一種便於搜索的數據結構(散列表)。

技術分享圖片

簡單的說,hash函數就是把任意長的輸入字符串變化成固定長的輸出字符串的一種函數。輸出字符串的長度稱為hash函數的位數。散列函數把消息或數據壓縮成摘要,使得數據量變小,將數據的格式固定下來,比如我們自定義密碼的存儲。
哈希函數的映射:
技術分享圖片

哈希函數的性質:
同一函數的Hash值不相同,那麽其原始輸入也不相同,上圖中k1,k3和k4。(確定性)
散列函數的輸入和輸出不是唯一對應關系的,如果兩個散列值相同,兩個輸入值很可能是不相同的,這種情況稱為“哈希碰撞”。(不確定性)
構造Hash列表:
利用探測法構造散列表,舉例:
已知一組關鍵字為(26,36,41,38,44,15,68,12,06,51),用除余法構造散列函數,用線性探查法解決沖突構造這組關鍵字的散列表。
這裏關鍵字個數n=10,不妨取m=13,此時α≈0.77,散列表為T[0..12],散列函數為:h(key)=key%13。
由除余法的散列函數計算出的上述關鍵字序列的散列地址為
(0,10,2,12,5,2,3,12,6,12)。
步驟:
1、前5個關鍵字插入時,其相應的地址均為開放地址,故將它們直接插入T[0],T[10),T[2],T[12]和T[5]中。
2、當插入第6個關鍵字15時,其散列地址2(即h(15)=15%13=2)已被關鍵字41(15和41互為同義詞)占用。故探查h1=(2+1)%13=3,此地址開放,所以將15放入T[3]中。當插入第7個關鍵字68時,其散列地址3已被非同義詞15先占用,故將其插入到T[4]中。
3、當插入第8個關鍵字12時,散列地址12已被同義詞38占用,故探查hl=(12+1)%13=0,而T[0]亦被26占用,再探查h2=(12+2)%13=1,此地址開放,可將12插入其中。
4、類似地,第9個關鍵字06直接插入T[6]中;而最後一個關鍵字51插人時,因探查的地址12,0,1,…,6均非空,故51插入T[7]中。

關於Hash表的沖突問題:
幾種常見的處理方法:
(1)開放地址法
(2)拉鏈法
(3)再哈希法
(4)建立公共溢出區

教材學習中的問題和解決過程

  • 問題1:關於開放地址法的實際使用方法
  • 問題1解決方案:
    技術分享圖片

  • 問題2:什麽是拉鏈法?如何通過代碼來實現?
  • 問題2解決方案:拉鏈法又叫鏈地址法,適合處理沖突比較嚴重的情況。基本思想是把所有關鍵字為同義詞的記錄存儲在同一個線性鏈表中。插入操作需要把Key的值轉為整形後Mod P,這樣就知道該元素會放到哪個鏈表裏面,在執行Insert時,逐個比較鏈表中的元素,看看是否已經存在該Key,沒有則將他放到鏈表的最後。
    代碼實現:
    void createEntry(int hash, K key, V value, int bucketIndex) {
    Entry

static class Entry

代碼調試中的問題和解決過程

  • 問題1:Java Collection API中的Hash 實現
  • 問題1解決方案:
    首先是用uml類圖來表示關系:
    技術分享圖片
    Set 接口的重用實現類有HashSet(哈希集)。
    Set 和 HashSet
    Set 表示一個數學的集。和 List 不同, Set 不允許重復的內容。假設兩個元素, e1 和 e2,如果 e1.equals(e2)的話,它們是不能在 Set中同時存在的。如果試圖添加一個重復的元素, Set 的 add 方法會返回 false。例如,如下的代碼會打印出“ addition failed”。
    代碼實現:
    Set set = new HashSet();
    set.add("Hello");
    if (set.add("Hello")) {
    System.out.println("addition successful");
    } else {
    System.out.println("addition failed");
    }

代碼托管

https://gitee.com/xingtianyue/events
(statistics.sh腳本的運行結果截圖)

結對及互評

本周和20162313苑洪銘同學學習了關於圖的總結部分知識,主要包括了幾種構成最小生成樹的方法。

本周結對學習情況

- [結對同學學號1](https://home.cnblogs.com/u/yuanhongming/)
- 結對照片
- 結對學習內容
    - 哈希表達        
    - 圖結構
    - ...

其他(感悟、思考等,可選)

關於哈希方法:
為什麽要學習哈希方法?通過機器學習機制將數據映射成簡潔的二進制串的形式, 同時使得哈希碼盡可能地保持原空間中的近鄰關系, 即保相似性。這是相對比較關鍵的一點。關於哈希方法的分類:1、第一種的代表是局部敏感哈希,這種方法主要是人工設計或者隨機生成哈希函數,是一種數據獨立的方法; 2、第二種是哈希學習的方法,希望從數據中自動學習出哈希函數,是一種數據依賴的方法;也是現在主流的方法; 顯然第二種具有數據依賴性,是一種更有適應性的方法。

xxx
xxx

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一周 200/200 2/2 20/20
第二周 300/500 2/4 18/38
第三周 500/1000 3/7 22/60
第四周 300/1300 2/9 30/90
  • 計劃學習時間:18小時

  • 實際學習時間:18小時

20162309《程序設計與設計結構》第十一周學習總結