20182330《程序設計與設計結構》 第九周學習總結

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;}
哨兵 21 32 32 34 56 78 98
0 1 2 3 4 5 6 7
  • 也就是說,必定會找到。若返回的index=0,則找到的是哨兵,故未查找到。

2、二分查找(折半,必須有序)

  • 從1開始
    15/2=7
    時間複雜度:O(log2 n)java

    特色:
    1.效率高
    2.有序
    3.只適用順序存儲git

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。反覆推敲發現這種計算方法把哨兵也算爲一個元素,按照這樣即爲算的時候只須要元素個數僞裝加一便可。

  • 問題3:根節點到子節點的路徑以及根節點到葉子節點的全部路徑梳理
  • 問題3解決方案:
  1. 當用前序遍歷的方式訪問到某一個節點的時候,咱們把該節點添加到路徑中。
  2. 若是該節點的值和咱們要找的值相等,則打印路徑,若是不相等,則繼續訪問它的子節點。
  3. 當前節點訪問結束以後,遞歸函數將自動回到它的父節點。所以咱們在函數退出以前要在路徑上刪除當前節點,以確保返回父節點時路徑恰好是從根節點到父節點的路徑。
  4. 若是咱們須要保存每條路徑,那就須要一個額外的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計算。

上週考試錯題總結

  • 錯題1
  • 分析:二叉搜索樹是一種具備附加屬性的二叉樹,即左邊的子樹小於右邊的子樹。看錯了。
  • 錯題2

  • 分析:樹的一個用途是提供其餘集合的更簡單的實現。我的的理解是並非更簡單,而是精簡算法
  • 錯題3

  • 分析:由於咱們須要在插入以後遍歷樹,因此堆中的節點必須存儲指向它們的子樹。
  • 錯題4

  • 分析:同上題,一錯錯兩道。
  • 錯題5

  • 分析:當一種類型的對象包含到另外一種類型的對象的連接時,有時會調用該對象。即自引用。
  • 錯題6

  • 分析:堆棧可使用連接結構或基於數組的結構來實現
  • 錯題7

  • 分析:可使用連接結構或基於數組的結構來實現隊列。

    結對及互評

點評過的同窗博客和代碼

  • 本週結對學習狀況
    • 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小時

  • 改進狀況:但願提升效率

參考資料

相關文章
相關標籤/搜索