1. 程式人生 > >20172302 《Java軟件結構與數據結構》第五周學習總結

20172302 《Java軟件結構與數據結構》第五周學習總結

比較 char 依次 2018年 泛型類 check 感悟 print 測試


2018年學習總結博客總目錄:第一周 第二周 第三周 第四周 第五周


教材學習內容總結

查找

查找即在某項目組中尋找某一指定目標元素,或確定該組中並不存在此元素。對其進行查找的項目組稱為查找池。

1.線性查找法,即從列表頭開始依次比較每一個值,直至找到該目標元素或到列表尾未找到,這是一種最簡單的查找方式,但它的效率並不是高效的。
2.二分查找法一種在有序數組中查找某一特定元素的搜索算法。搜素過程從數組的中間元素開始,如果中間元素正好是要查找的元素,則搜索過程結束;如果某一特定元素大於或者小於中間元素,則在數組大於或小於中間元素的那一半中查找,而且跟開始一樣從中間元素開始比較。如果在某一步驟數組為空,則代表找不到。這種搜索算法每一次比較都使搜索範圍縮小一半。折半搜索每次把搜索區域減少一半,時間復雜度為Ο(logn)。

3.兩種查找方法對比:線性查找要比二分查找簡單,易於調試;同時,線性查找無需花費額外成本排序該列表。對於小型問題,這兩種算法幾乎不存在實用差別,但n變大後,二分查找就會變得很有效率。

排序

排序:基於某一標準,按照某個規定順序對某一項目組進行順序排列。基於效率排序算法可分為兩類:順序排序(需要進行n2次比較);對數排序(需要進行nlog(2)n次比較)。

1.選擇排序法:在長度為N的無序數組中,第一次遍歷n-1個數,找到最小的數值與第一個元素交換;
第二次遍歷n-2個數,找到最小的數值與第二個元素交換;
......
第n-1次遍歷,找到最小的數值與第n-1個元素交換,排序完成。

技術分享圖片

2.插入排序法:在要排序的一組數中,假定前n-1個數已經排好序,現在將第n個數插到前面的有序數列中,使得這n個數也是排好順序的。如此反復循環,直到全部排好順序。

技術分享圖片

技術分享圖片

3.冒泡排序法:比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
針對所有的元素重復以上的步驟,除了最後一個。
持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較。
實現代碼:

public static <T extends Comparable<T>> void bubbleSort(T[] data)
    {
        int position, scan;
        T temp;
        for (position =  data.length - 1; position >= 0; position--)
        {
            for (scan = 0; scan <= position - 1; scan++)
            {
                if (data[scan].compareTo(data[scan+1]) > 0)
                    swap(data, scan, scan + 1);
            }
        }
    }

4.快速排序法:先從數列中取出一個數作為key值;
將比這個數小的數全部放在它的左邊,大於或等於它的數全部放在它的右邊;
對左右兩個小數列重復第二步,直至各區間只有1個數。
技術分享圖片

5.歸並排序法:申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合並後的序列
設定兩個指針,最初位置分別為兩個已經排序序列的起始位置
比較兩個指針所指向的元素,選擇相對小的元素放入到合並空間,並移動指針到下一位置
重復步驟3直到某一指針達到序列尾
將另一序列剩下的所有元素直接復制到合並序列尾
技術分享圖片

6.基數排序法:將所有待比較數值(正整數)統一為同樣的數位長度,數位較短的數前面補零. 然後, 從最低位開始, 依次進行一次排序.這樣從最低位排序一直到最高位排序完成以後, 數列就變成一個有序序列.
技術分享圖片

  • 各種排序算法效率比較:
    技術分享圖片
    基數排序中:r代表關鍵字的基數,d代表長度,n代表關鍵字個數

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

  • 問題1:“@SuppressWarnings("unchecked")”是有什麽作用?

  • 問題1解決方案:java.lang.SuppressWarnings是J2SE5.0中標準的Annotation之一。可以標註在類、字段、方法、參數、構造方法,以及局部變量上。
    作用:告訴編譯器忽略指定的警告,不用在編譯完成後出現警告信息。
    使用:
    @SuppressWarnings(“”)
    @SuppressWarnings({})
    @SuppressWarnings(value={})
    書上的這處使用是 @SuppressWarnings("unchecked"),告訴編譯器忽略 unchecked 警告信息,如使用List,ArrayList等未進行參數化產生的警告信息。

  • 問題2:關於泛型方法使用及其形式。

  • 問題2解決方案:來看一個泛型方法,
public static <T extends CharSequence> T defaultIfBlank(T str, T defaultStr)
    {
      return isBlank(str) ? defaultStr : str;
    }

如上圖的泛型方法在方法名稱前面有一個聲明,它的作用是告訴編譯器編譯的時候就識別它的類型,如果傳入的T是A類型,那麽你就不可以將B類型傳入方法中去;

  • 說明:
  • 1)public 與 返回值中間<T>非常重要,可以理解為聲明此方法為泛型方法。
  • 2)只有聲明了<T>的方法才是泛型方法,泛型類中的使用了泛型的成員方法並不是泛型方法。
  • 3)<T>表明該方法將使用泛型類型T,此時才可以在方法中使用泛型類型T。
  • 4)與泛型類的定義一樣,此處T可以隨便寫為任意標識,常見的如T、E、K、V等形式的參數常用於表示泛型。
  • 關於“public static <T extends Comparable<? super T>>”我一開始也不懂,看了郭愷同學博客,非常受益,尤其是關於Java中的通配符的使用講解很全面。這裏就不再自己總結了。

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

  • 問題1:關於PP9.2,讀了兩次題目,第一遍沒讀明白,第二遍讀不懂“將i減少某個大於1的數量i並繼續該過程直至i小於1”,並且在第一次做完後結果正確,但我感覺做的不對。

  • 問題1解決方案:第一次做的時候是在原冒泡排序算法上進行了修改,就是在其外層又加了一個循環,while(i>=1){......i-=1},這樣做是可以出結果,但是這其中有錯誤,當循環運行到i=1時,這不就是把冒泡排序又做了一遍,那這和間隔排序有什麽聯系,後放棄了這種思路。
    接下來就讀題,然後按照題目要求,一點一點寫,兩次循環就足夠了,修改後代碼見下:
public static <T extends Comparable<T>>void gapSort(T[] data,int i)
    {
        int scan;
        while (i>=1)
        {
            for (scan = 0;scan<=data.length-1-i;scan++)
            {
                if (data[scan].compareTo(data[scan + i]) > 0)
                    swap(data, scan, scan + i);
            }
            i -=2;
        }
    }

隨後,用之前的SortPhoneList類做了測試,結果如下:
技術分享圖片

  • 問題2:PP9.4,如何來查看代碼的運行時間?

  • 問題2解決方案:查找資料,參見: java測試代碼段執行時間
    按照所給的方法,進行添加,
long a=System.currentTimeMillis();
        Sorting.quickSort2(list);
        System.out.println("舊版本執行耗時 : "+(System.currentTimeMillis()-a)/1000f+" 秒 ");

        long b=System.currentTimeMillis();
        Sorting.quickSort2(list);
        System.out.println("新版本執行耗時 : "+(System.currentTimeMillis()-b)/1000f+" 秒 ");

運行結果見圖:
技術分享圖片

代碼托管

技術分享圖片

上周代碼行數為10335行,現在為11412行,本周共1077行。

上周考試錯題總結

  • The Java Collections API contains _________ implementations of an indexed list.
    A .Two
    B .Three
    C .Four
    D .Five

  • 解析:Java集合API中含有索引列表的三種實現。

結對及互評

  • 本周結對學習情況
    • 20172308
    • 博客中值得學習的或問題: 博客中代碼問題解決過程記錄較詳細,可適當添加教材內容總結。

    • 結對學習內容:第九章——查找與排序。

其他(感悟、思考等)

感悟

  • 這周的排序算法的代碼有些復雜,排序這裏能做的問題也有很多,現在能夠基本明白各個算法的意思,代碼有些地方理解的還差點。

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一周 0/0 1/1 15/15
第二周 572/572 1/2 16/31
第三周 612/1184 1/3 13/44
第四周 1468/2652 2/5 13/57
第五周 1077/3729 1/6 14/71 初步理解各個排序算法

參考資料

  • 十大編程算法助程序員走上高手之路
  • 排序算法總結
  • java基數排序
  • java測試代碼段執行時間
  • 常見排序算法及對應的時間復雜度和空間復雜度
  • @SuppressWarnings註解
  • java 泛型詳解-絕對是對泛型方法講解最詳細的,沒有之一

20172302 《Java軟件結構與數據結構》第五周學習總結