20172323 2018-2019-1 《程序設計與數據結構》第五週學習總結

20172323 2018-2019-1 《程序設計與數據結構》第五週學習總結

教材學習內容總結

本週學習了第六章排序與查找php


一些概念

  • 靜態方法能夠經過類名來激活,不用特地實例化該類的一個對象調用該靜態類的方法。在方法聲明中,經過使用static修飾符就能夠把它聲明爲靜態的
  • 建立泛型方法,只需在方法頭前的返回類型前插入一個泛型聲明便可。泛型聲明必須在返回類型以前,這樣泛型纔可做爲返回類型的一部分
public static <T extends Comparable<T>> boolean
  linearSearch (T[] data, int min, int max, T target)

查找

  • 在某個項目組中尋找某一指定目標元素,或肯定該指定目標不存在,是爲查找。進行查找的項目組被稱爲查找池
  • 線性查找法:從頭開始依次比較每個值,直到找到目標元素,或者得出不存在該目標值的結論,這種方式稱爲線性查找(linear search)
  • 二分查找(折半查找):當查找池中的項目組是已排序的,那麼利用二分查找將會更有效率。
    • 二分查找的思路: 二分查找從排序列表的中間開始查找,若是中間元素不是目標元素,根據兩個元素的大小關係,再判斷從列表的前一半或是後通常進行查找。每次的查找都是從當前一串數字的中間元素開始的。直到最後找到該元素或是沒有找到拋出一個信息。
    • 二分查找的每次比較都會刪除一半的可行候選項,當查找池中有偶數個待查找值時,選擇的是兩個中間值的第一個。
    • 二分查找的複雜度是對數級的,這使得它對於大型查找池很是有效率。線性查找具備線性時間複雜度O(n),二分查找具備時間複雜度O(log2n)。

排序

  • 基於某一標準,將某一項目組按照某個規定排序排列
  • 選擇排序法
    • 反覆尋找當前列表的最小值,而後將其放在列表的前端。
  • 插入排序法
    • 將數字插入前端已排序的列表的合適位置直至排序完成。
  • 冒泡排序法
    • 反覆比較相鄰元素的大小關係進行移位操做直至排序完成
  • 快速排序法
    • 選擇一個列表元素進行分區元素,而後對兩個分區進行遞歸排序直至排序完成(一個分區只含有一個元素2)。
    • 排序時兩個分區同時進行查找,一旦兩邊都找到一個元素,將二者進行互換
  • 歸併排序法
    • 將列表遞歸式分紅兩半直至每一子列表都含有一個元素,而後再歸併到一個排序順序中完成排序
  • 基數排序法
    • 基數排序基於隊列處理

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

  • 問題1:選擇排序的代碼實現中出現了public static <T extends Comparable<? super T>> void selectionSort (T[] data)之中<? super T>表示的是什麼意思
  • 問題1解決方案:查閱資料在網上找到了一個通俗易懂的回答,大體上把<? super T>三個部分都講得比較清楚了。按照個人理解,在這裏?表明的是通配符,這一整串表明的是一個下界通配符,用在此處表明Comparable接口中的泛型元素都是T或者T的父類,這樣就放鬆了存入數組的類型限制,可是引發的缺點就是往外讀取元素就會變得困難,可能使元素類型信息丟失。

  • 問題2:幾種排序方法時間複雜度的比較
  • 問題2解決方案
排序方法 時間複雜度
選擇排序 O(n^2)
插入排序 O(n^2)
冒泡排序 O(n^2)
快速排序 O(n*log2n)
歸併排序 O(nlog2n)
基數排序 O(n)

三種順序排序方法都使用了內外兩層循環進行排序操做,因此時間複雜度都爲nxn-->O(n^2);
快速排序和歸併排序兩種對數排序在排序中採起了遞歸的方法,所以在元素比較中只用到了大約nlog2n次比較,時間複雜度爲O(log2n);還有一種特殊的基數排序,由於在排序過程當中不涉及到元素之間的比較,只須要將元素在隊列之間進行移動操做,操做時只用遍歷數據便可,所以能夠用c*n來表示(c是常數),因此時間複雜度爲O(n)。html

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

  • 問題1:PP9.2中間隔排序的思路有些混亂,爲何每次迭代完成以後i要減小某個大於1的數量直至i的值小於1.
  • 問題1解決方案:在網上沒能找到關於間隔排序的資料,因此不太懂原理,應該也和冒泡排序差不太多吧,就按照題目的要求拼好了代碼,可運行出來的結果排序彷佛並無完成。前端

    假設如今有一個長度爲6的數組,第一次的i爲3,每一次迭代後i減小的值爲2,那麼在第一次迭代中,第一個元素與第三個元素進行比較,第二個元素與第四個元素進行比較,第三個元素與第五個元素進行比較,第四個元素與第六個元素進行比較,第一次迭代結束,i的值爲1,第一個元素與第二個元素進行比較...相鄰元素分別進行比較,迭代結束,i的值爲-1小於1,此時循環結束,排序完成。
    git

若是每次i的值減小1
web

與題目給的信息偏偏想反,反卻是每次減一時能得出正確的排序,屢次修改代碼中的間隔值,發現i每次減一時排序都能正確完成可是減2、減三時只能是在部分間隔值的狀況下才能排序完成數組


  • 問題2:PP9.3如何用代碼實現總的比較次數和總執行時間的計數
  • 問題2解決方案
    計時
    最開始應用的代碼以下
Date da = new Date();
long s1 = da.getTime();
...//具體運行的代碼
long s2 = System.currentTimeMills();
System.out.println(s2 - s1);

代碼開始運行時記錄當前時間,代碼結束前再記錄一下當前時間,最後s2-s1即爲運行時間,思路是沒有問題,但是運行結果出來就有點小瑕疵,如圖
數據結構

運行時間全爲0且沒帶單位,我以爲系統並無錯,可能真是運行時間過短吧,小於一秒的計算機就自動四捨五入歸爲0了(?),我是這樣認爲的,因此我又尋找到另外一種比較精密計量時間的方法
以毫秒爲單位計算的學習

long startTime = System.currentTimeMillis();//獲取當前時間
doSomeThing();
long endTime = System.currentTimeMillis();
System.out.println("程序運行時間:"+(endTime-startTime)+"ms");

以納秒爲單位計算的this

long startTime = System.nanoTime();//獲取當前時間
doSomeThing();
long endTime = System.nanoTime();
System.out.println("程序運行時間: "+(end-start)+"ns");

好似萬事俱備,運行一下試試,問題仍是出現了,毫秒計時依然爲0額。
此時我又找到了Date.getTime的說明
Returns the number of milliseconds since January 1, 1970, 00:00:00 GMT represented by this Date object
,顯然這個方法一樣是以毫秒爲單位來計量代碼運行的時間的,以前什麼四捨五入的解釋就有問題了,在網上尋找答案也只獲得一些絕不沾邊的東西,有點束手無策,後來我再仔細一瞅,發現納秒計時的方法彷佛沒有出錯啊,因而改爲納秒計時,而後就運行成功???有點莫名其妙。
debug

原覺得計時在稀裏糊塗之中就能夠所有解決了,把五大排序法中分別加上s一、s2,而後運行一下,此次又是歸併排序的計時出現了些問題,如圖

debug一下,錯誤應該出在忽略了遞歸上面,就是計算機每執行一次mergeSort的方法,就得從新開始計時一次,因此最後的結果會輸出不少個歸併排序的計時,參照快速排序的方法,至關於在歸併排序的外面加一層殼專門用來計時,其餘也想不出更好的辦法了,最終結果如圖


比較次數

  • 對於選擇排序、插入排序和冒泡排序,其內層循環都爲比較相鄰兩元素的大小,外層控制存儲的位置,因此只需在內層寫入一個計數的變量count,每執行一次內層循環count+1.
  • 對於快速排序和歸併排序,只要進行了一次compareTo操做count就須要加一,不管是否知足while循環的條件,所以while循環內外都應該有語句count++。

代碼託管

上週考試錯題總結

上週沒有錯題哦

結對及互評

  • 博客中值得學習的或問題:
    • 譚鑫的博客一直保持很高的水準,特別是問題的總結和解決能力都值得學習,能看出來是在用心學習
    • 方藝雯的博客教材學習內容總結認真詳細,並配有圖示和本身的理解,點個贊
  • 基於評分標準,我給譚鑫的博客打分:8分。得分狀況以下:
    正確使用Markdown語法(加1分):
    模板中的要素齊全(加1分)
    教材學習中的問題和解決過程, 三個問題加3分
    代碼調試中的問題和解決過程, 三個問題加3分

  • 基於評分標準,我給方藝雯的博客打分:8分。得分狀況以下:、
    正確使用Markdown語法(加1分):
    模板中的要素齊全(加1分)
    教材學習中的問題和解決過程, 兩個問題加2分
    代碼調試中的問題和解決過程, 三個問題加3分
    排版精美加1分

  • 本週結對學習狀況
    • 20172305
    • 20172314
    • 結對學習內容
      • 排序與查找
      • PP9.4中的比較次數通過反覆討論獲得了比較一致的答案
  • 上週博客互評狀況

其餘

這周在代碼學習上仍是遇到了一些小的問題,在資料缺少的狀況下,本身動手寫代碼的能力、分析問題的能力有了一些增強,但仍是稍顯欠缺,須要繼續努力

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一週 0/0 1/1 8/8
第二週 470/470 1/2 12/20
第三週 685/1155 2/4 10/30
第四周 2499/3654 2/6 12/42
第六週 1218/4872 2/8 10/52

參考資料

相關文章
相關標籤/搜索