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 - 你所拥有的每天的碎片化时间

比如我自己,一天之中就有许多的空闲时间,比如餐前,餐后的时间,在社交网络上瞎聊的时间。

你不能指望在碎片化时间里去学习完一个统一复杂的问题,可以利用这些时间来回顾,记录一些“流水线”的想法,或者加强一些无争议的知识。

我自己也还在培养这种意识,现在的我在碎片化时间里总是想着好好犒劳一下自己,毕竟都那么累了。

现在想想看,其实可以把学习这件事看成一件非付出的事情,去营造正反馈。

根本原因在于,把学习这件事看成了一种“负担”。

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