20162320劉先潤大二第11周做業

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

教材學習內容總結

1、哈希方法

 在哈希方法中,元素保存在哈希表中,元素在表中的位置的位置有哈希函數(hashing function)決定,表中的每一個位置成爲單元(cell)或桶
 注意:使用哈希方法使對某個元素的·訪問時間不依賴於表中的元素個數。這意味着對哈希表中一個元素的全部操做都是O(1)。即沒必要非要經過比較才能找到一個具體的元素,或定位所給元素的相應位置。使用哈希方法,只須要計算一個具體的元素應該放在哪裏便可。若是兩個元素或關鍵字映射到表中同一位置的情形稱爲衝突(collision),將每一個元素映射到表中惟一位置的哈希函數稱爲理想哈希函數html

若是知道數據集的大小,則經驗法推知哈希表的大小是數據集的150%。若是不知道數據集的大小,須要動態調整大小時,即建立一個比原表更大的新哈希表,多是原來的兩倍大,將原表中全部元素插入到新表中,而後放棄原表。防止表變滿性能降低,可使用裝載因子(load factor)java

2、哈希函數

 抽取(extraction)是一種哈希函數,僅使用元素值或關鍵字中的一部分來計算保存元素的位置。git

  • 1)除法方法
    使用關鍵字除以某個正整數p後的餘數,做爲給定元素的下標。
Hashcode(key)=Math.abs(key)%p
  • 2)摺疊方法
    將關鍵字的各部分加在一塊兒計算下標。移位摺疊法是將這些各部分相加得下標,邊界摺疊是讓關鍵字的若干子段反轉再相加。算法

  • 3)平方取中方法
      關鍵字自乘,而後使用抽取方法從平方結果的中部抽取相應的位獲得下標數據庫

  • 4)基數轉化方法
    關鍵字轉換爲另外一種數值基數api

  • 5)數字分析方法
    抽取關鍵字中的指定位並進行處理從而獲得下標數據結構

  • 6)長度依賴方法
    關鍵字和關鍵字的長度以某些方式組合起來,或直接當作下標使用,或再進一步使用其餘方法進行處理而獲得下標。app

  • 7)Java語言中的哈希函數
    java.lang.Object定義了方法hashcode,它根據對象在內存中的位置返回一個整數,可是最好仍是爲特定的類定義一個具體的哈希函數。數據庫設計

3、解決衝突

  • 1)鏈式方法
    將哈希表當作幾何的表而不是各獨立單元的表,因此每一個單元保存一個指針,指向於表中該位置相關的元素的集合。利用額外的空間做爲溢出區來保存每一個表位置相對應的鏈表,映射到表中某個位置的首個元素保存到那個位置,映射到該位置的下一個元素也一塊兒保存,以下圖所示。
    函數

  • 2)開放地址方法
    在表中尋找不一樣於該元素原先哈希到另外一個開放的位置。
    總共有三種方法:一是線性探測法,即線性探測空白單元,若是數據放在10這個位置,但10已經滿,就放在11,依次類推下去。二是二次探測方法,二次探測的步數是原始位置相隔的步數的平方。三是雙哈希方法,當基本哈希函數致使衝突時,將使用提供的第2個哈希函數解決問題
    此方法博主並非特別理解,附上學習參考博客哈希表之開放地址的三種方法

4、從哈希表中刪除元素

  • 1)從鏈式實現中刪除
    刪除元素有5種狀況:
       1.刪除的元素是某個位置的惟一元素。將表中該位置設置爲null即刪除
       2.刪除的元素保存在表中(非溢出區),但在該位置有指向下一個元素的溢出區下標。使用被刪元素所指向的元素及next下標值,替換該元素及表中的next下標值,而後溢出區的該位置設置爲null,將它從新放回空閒位置表中
       3.刪除的元素保存在哈希表中那個位置存儲的元素組成的表的表位。設置溢出區的這個位置爲null,同時設置表中前一元素的next下標值也爲null,將它從新放回空閒位置表中
       4.刪除的元素保存在哈希表中那個位置存儲的元素成的表的中間。設置溢出區的這個位置爲null,設置表中前一元素的next下標值爲被刪元素的next下標值,將它從新放回空閒位置表中
       5.刪除的元素不在表中,拋出ElementNotFoundException

-2)從開放地址實現刪除元素

5、Java Collection API中的哈希表

7種實現方法:Hashtable、HashMap、HashSet、IdentityHashMap、LinkedHashSet、LinkedHashMap、WeakHashMap

6、圖的遍歷

兩種遍歷方式:

  • 1)廣度優先(相似於程序遍歷)
    實現方法:經過一個隊列保存遍歷過的頂點順序,以便按出隊順序去訪問這些頂點的鄰接頂點

  • 2)深度遍歷(相似於先序遍歷)

兩種算法

  • 1):Prim算法:從點入手,適合稠密圖

  • 2): Kruskal算法:從邊入手,適合稀密圖(直接找最小權值邊)。注:兩個節點若同屬於一棵樹,則它們應該有共同的根結點

7、powerdesigner的使用

 在數據庫建模的過程當中,須要運用PowerDesigner進行數據庫設計,這個不但可讓人直觀的理解模型,並且能夠充分的利用數據庫技術,優化數據庫的設計。
 其次就是E-R圖,在數據庫系統概論中有涉及到,這個實體關係圖中,一個實體對於一個表,實體、屬性與聯繫是進行系統設計時要考慮的三個要素,也是一個好的數據庫設計的核心。

設計參考資料:使用powerDesigner畫ER圖

 右圖是根據小組app所畫的初步ER圖


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

  • 問題1:在Java Collection API中集合(set)和映射(map)的區別
    解答:Map沒有繼承Collection接口,Map提供key到value的映射。一個Map中不能包含相同的key,每一個key只能映射一個value。Map的內容能夠被看成一組key集合,一組value集合,或者一組key-value映射。Java SDK提供的類都是繼承自Collection的「子接口」如Set
  • 問題2:哈希表處理產生彙集現象是什麼?
    解答:個人理解是哈希表中位置衝突引發的位置後移使大量元素堆積在一端的現象。
  • 問題3:當哈希表愈來愈滿時彙集愈來愈嚴重時會發生什麼?
    解答:這致使產生很是長的探測長度,後續的數據插入將會很是費時。一般數據超過三分之二滿時性能降低嚴重,所以設計哈希表關鍵確保不會超過這個數據容量的一半,最多不超過三分之二。

代碼託管

(statistics.sh腳本的運行結果截圖)


上週考試錯題總結

錯題暫未給出答案


結對及互評

點評過的同窗博客和代碼


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

Few things are impossible in themselves; and it is often for want of will, rather than of means, that man fails to succeed.事情不多有根本作不成的;其因此作不成,與其說是條件不夠,不如說是因爲決心不夠。我就不信了,個人java必定會好的。


學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一週 188 1/1 25 算法分析
第二週 70/258 1/2 15/40 《構建之法》7-9章
第三週 474/732 1/3 20/60 查找和排序
第四五六週 1313/2045 4/7 12/72 棧和隊列
第七週 890/2935 1/8 14/86
第八週 913/3848 1/9 20/106 二叉查找樹
第九周 890/3738 1/10 13/119
第十週 637/4374 2/12 18/137
第十一週 170/4544 1/13 15/152 哈希方法
第十二週
  • 計劃學習時間: 20+小時
  • 實際學習時間: 25小時

(有空多看看現代軟件工程 課件 軟件工程師能力自我評價表)

參考資料

相關文章
相關標籤/搜索