ARTS 第 8 周

" 每週寫一個 ARTS:Algorithm 是一道算法題,Review 是讀一篇英文文章,
Technique/Tips 是分享一個小技術,Share 是分享一個觀點 "

ARTS 系列各部分內容導航可以看這裏:ARTS 系列 目錄導航

Algorithm - x 的平方根

題目鏈接:https://leetcode-cn.com/problems/sqrtx/

代碼倉庫:https://github.com/fhx1998/LeetCode/blob/master/src/MySqrt69.java

“利用二分法的思想進行求解”

Review - The Key to Accelerating Your Coding Skills

  • Paying close attention to detail is important when going through materials like documentation or tutorials.
  • Debugging error messages is incredibly important.
  • Over time, you will learn how to read error messages
  • You should learn from each error message that you resolve.

總結一下文章的主要內容

第一個階段,認真對待 debug ,並覆盤代碼的錯誤原因。想到自己平時 debug 就是 debug 完成,沒有覆盤。很多問題就只是在當下解決了,沒有反饋到下一次可能出現的錯誤中。

第二個階段,心理問題。在到達拐點,或者說瓶頸的時候,提升沒有以前那麼明顯。這時候的心理活動開始豐富起來了,想着自己是不是不太行,就可能失去前進的動力。

收穫

多多覆盤,多多總結,多多實踐。

Technology - 再談 Java 比較器

之前的 ARTS 系列 第 2 周 裏的分析 Java 比較器部分,現在看來完全是錯的。。。。

從源碼分析 Java 比較器的排序原理:

Collections 類帶有比較器的 sort 方法會進入到 List 接口的一個默認方法:

Collections.sort(dogs, new DogAgeComparator());
default void sort(Comparator<? super E> c) {
    Object[] a = this.toArray();
    Arrays.sort(a, (Comparator) c);
    ...
}

再進入到 Arrays 類的 sort 方法:

public static <T> void sort(T[] a, Comparator<? super T> c) {
    if (c == null) {
        sort(a);
    } else {
        if (LegacyMergeSort.userRequested)
            legacyMergeSort(a, c);
        else
            TimSort.sort(a, 0, a.length, c, null, 0, 0);
    }
}

如果有自定義的外部排序(Comparator),就會進入第 4 行的 else 語句塊中,其中的 LegacyMergeSort 排序已經被廢棄(如果你指定使用該方法也可以),現在用的是 TimSort 的排序方法,相比起舊版本直接使用 歸併排序算法,新版本在此基礎上還引入了 “二分插入排序” 的優化。

如果沒有自定義的外部排序(那麼類必須實現 Comparable 接口),就會進入第 3 行的 sort 方法中,處理邏輯和上面展示的代碼的差不多,就不展開了。

接下來,因爲我們討論的主題是 Comparator 和 Comparable 中方法的返回值對排序結果的影響,新版本雖然優化了排序性能,但原本的思想沒有改變。

所以我們採用舊版本的代碼來分析:

LegacyMergeSort 的 mergeSort 算法中的:

圖片
或者:
圖片

最爲關鍵的部分,第 4 行使用到的 compare 方法中的 dest[j-1]dest[j],調用結果** > 0** 的條件下,會進行 swap,交換他們的位置。

圖片

看上面的圖片, o1 代表的是暫時排在前面的元素,o2 代表排在後面的元素。

只要記住,return 值 > 0 的時候會交換 o1 和 o2 的位置,以此來實現你想要的排序規則。

最後,給兩個具體代碼:

圖片

圖片

Share - 你所擁有的每天的碎片化時間

比如我自己,一天之中就有許多的空閒時間,比如餐前,餐後的時間,在社交網絡上瞎聊的時間。

你不能指望在碎片化時間裏去學習完一個統一複雜的問題,可以利用這些時間來回顧,記錄一些“流水線”的想法,或者加強一些無爭議的知識。

我自己也還在培養這種意識,現在的我在碎片化時間裏總是想着好好犒勞一下自己,畢竟都那麼累了。

現在想想看,其實可以把學習這件事看成一件非付出的事情,去營造正反饋。

根本原因在於,把學習這件事看成了一種“負擔”。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章