20182330《程序設計與設計結構》 第九周學習總結
教材學習內容總結
週一:查找
1、線性查找
- ASL平均查找長度:用平均比較次數估計算法優劣
ASL=累加:查到某個的機率查到所用的次數(次數之和1/n)查到1:n
查到n:1 查到i:n-i+1
- 查找失敗:n+1
- 總數等於(i+n)n/2
- ASL=(1+n)/2 時間複雜度爲O(n)
- 優化算法:放一個哨兵,不用比較,從後往前找
data[0]=target;
for(index = data.length-1;data[index].equals(target);
--index))
{ return index == 0 ? false:true;}
- 也就是說,必定會找到。若返回的index=0,則找到的是哨兵,故未查找到。
2、二分查找(折半,必須有序)
3、分塊查找 :索引+順序表(能夠先折半再線性,ASL在折半線性之間)
- 分塊有序
1-5 6-10分塊
分別找最大值
20 (最大值)1(1-5)|40 6 |78 11
4、哈希表
- 不依賴於比較,用關鍵字查找
- %
- 衝突解決
1.開放定址法 除留餘數法衝突就加: 線性探測再散列+1+2+3 。 H(k)=k%11.。。
二次探測再散列1^2 -1^2,2^2……(左右找)
僞隨機探測再散列:生成僞隨機數
2.鏈地址法
週五:排序
內部排序:插入 選擇 交換 歸併 基數
- 基本操做:比較、移動
衡量好壞:時間效率、空間效率、穩定性(兩個相同數AB順序保持不變)算法
插入排序
- 直接插入:大於等於前面的,因此是穩定的
- 最好狀況:每一個關鍵字比較一次,n-1次
最壞狀況:徹底是逆排序,(n+2)(n-1)/2---------就至關於n+1的前n項和-1數組
注意!多了一個哨兵,並且第一次不用比
折半,減小比較次數數據結構
- 折半插入排序
2-路插入函數
選兩個數一個放頭一個放尾,大於49的從左開始,小於38的從右開始學習
希爾排序:分組交換排序,最後一組可能三個數排序
d增量每次都/2優化
交換排序
選擇排序
- 簡單選擇
最好,正序排列 0次
最壞,(n-1)次
歸併排序
多關鍵字排序
3.2堆排序spa
教材學習中的問題和解決過程
- 問題1:設置哨兵的算法應該如何實現?
- 問題1解決方案:在線性查找時咱們用到了哨兵,,將a[0]設置成監視哨則能夠避免每次比較元素後都須要判斷下標。
/*帶哨兵的直接順序查找*/
int sequential_search(int a[],int n,int key) //n爲數組元素個數,key爲待查找元素
{
int i=n;
a[0]=key; //a[0]是監視哨
while(a[i]!=key) //若數組中無key,則必定會獲得a[0]=key
i--;
return i; //查找失敗返回0
}
- 問題2:插入排序的最壞狀況爲何是(n+2)(n-1)/2?
- 問題2解決方案:按常規思路應該是n(1+n)/2,爲何到了這裏變成(n+2)(n-1)/2。反覆推敲發現這種計算方法把哨兵也算爲一個元素,按照這樣即爲算的時候只須要元素個數僞裝加一便可。
![](http://static.javashuo.com/static/loading.gif)
- 問題3:根節點到子節點的路徑以及根節點到葉子節點的全部路徑梳理
- 問題3解決方案:
- 當用前序遍歷的方式訪問到某一個節點的時候,咱們把該節點添加到路徑中。
- 若是該節點的值和咱們要找的值相等,則打印路徑,若是不相等,則繼續訪問它的子節點。
- 當前節點訪問結束以後,遞歸函數將自動回到它的父節點。所以咱們在函數退出以前要在路徑上刪除當前節點,以確保返回父節點時路徑恰好是從根節點到父節點的路徑。
- 若是咱們須要保存每條路徑,那就須要一個額外的vector< vector < int > >用於保存每一條路徑
代碼調試中的問題和解決過程
- 問題1:在網上看到代碼@SuppressWarnings("unchecked")是什麼意思
- 問題1解決方案:
做用:告訴編譯器忽略指定的警告,不用在編譯完成後出現警告信息。
使用:
@SuppressWarnings(「」)
@SuppressWarnings({})
@SuppressWarnings(value={})
示例:
@SuppressWarnings("unchecked")
告訴編譯器忽略 unchecked 警告信息,如使用List,ArrayList等未進行參數化產生的警告信息。
@SuppressWarnings("serial")
若是編譯器出現這樣的警告信息:The serializable class WmailCalendar does notdeclare a static final serialVersionUID field of type long 使用這個註釋將警告信息去掉。
- pp16.6
- pp17.1
前幾周忘了截圖,這是截止第十週以前的代碼,之後會記得按時截圖,如下統計代碼量按照總增量/3計算。
![](http://static.javashuo.com/static/loading.gif)
上週考試錯題總結
- 錯題1
![](http://static.javashuo.com/static/loading.gif)
- 分析:二叉搜索樹是一種具備附加屬性的二叉樹,即左邊的子樹小於右邊的子樹。看錯了。
錯題2
![](http://static.javashuo.com/static/loading.gif)
- 分析:樹的一個用途是提供其餘集合的更簡單的實現。我的的理解是並非更簡單,而是精簡算法
錯題3
![](http://static.javashuo.com/static/loading.gif)
- 分析:由於咱們須要在插入以後遍歷樹,因此堆中的節點必須存儲指向它們的子樹。
錯題4
![](http://static.javashuo.com/static/loading.gif)
- 分析:同上題,一錯錯兩道。
錯題5
![](http://static.javashuo.com/static/loading.gif)
- 分析:當一種類型的對象包含到另外一種類型的對象的連接時,有時會調用該對象。即自引用。
錯題6
![](http://static.javashuo.com/static/loading.gif)
- 分析:堆棧可使用連接結構或基於數組的結構來實現
錯題7
![](http://static.javashuo.com/static/loading.gif)
分析:可使用連接結構或基於數組的結構來實現隊列。
結對及互評
點評過的同窗博客和代碼
- 本週結對學習狀況
- 20182314
- 點評:知識點總結的較爲詳細,錯題總結深刻。可是代碼的問題理解不深。
基於評分標準,我給本博客打分:14分。得分狀況以下:
感想,體會不假大空的加1分
排版精美的加一分
結對學習狀況真實可信的加1分
正確使用Markdown語法
模板中的要素齊全(加1分)
錯題學習深刻的加1分
點評認真,能指出博客和代碼中的問題的加1分
教材學習中的問題和解決過程, 加5分
代碼調試中的問題和解決過程,加2分
- 上週博客互評狀況
其餘(感悟、思考等,可選)
第九周主要學習了查找和排序的相關知識,信息量很大,值得認真思考。
學習進度條
目標 |
5000行 |
30篇 |
400小時 |
|
第一週 |
42/42 |
2/2 |
20/20 |
|
第三週 |
394/471 |
2/4 |
25/45 |
|
第四周 |
394/471 |
2/4 |
25/45 |
|
第五週 |
1668/2139 |
2/6 |
35/80 |
|
第六週 |
2388/4527 |
1/7 |
30/110 |
|
第七週 |
1660 /6187 |
2/9 |
25/135 |
|
第八週 |
1660/7847 |
2/11 |
20/130 |
|
第九周 |
1660/9507 |
2/13 |
25/155 |
|
計劃學習時間:25小時
實際學習時間:25小時
改進狀況:但願提升效率
參考資料