1. 程式人生 > 實用技巧 >ARTS-WEEK-009

ARTS-WEEK-009

Algorithm:

08.03: Magic Index LCCI (Easy)

基於有序陣列的演算法,一般可以利用二分法,對基本二分法中三種情況分別考察,首先 nums[mid] == mid 時,mid 符合條件,但題目要求返回第一個符合條件的索引,因此還需要先在左半邊找,沒找到才選擇這個;其次 nums[mid] < mid 和 nums[mid] > mid 時,都無法說明說明結果在左半部分或右半部分。因此整體邏輯是先找左半部分、再選擇 mid,最後去右半部分找,都找不到返回 -1,這個過程中每進入區間可以用 nums[low] > high || nums[high] < low 返回 -1 進行剪枝,但是總體時間複雜度仍然是 O(n)。

還有一種更簡單辦法,就是通過陣列跳躍定位,當遇到 nums[i] > i 時,直接 i = nums[i] 跳躍到下一個可能滿足條件的位置,也能起到很好的加速作用。

    private int jumpFind(int[] nums) {
        for (int i = 0; i < nums.length;) {
            if (nums[i] == i) {
                return i;
            }
            if (nums[i] < i) {
                i++;
            } else {
                i = nums[i];
            }
        }
        return -1;
    }

Review:

論文:Apache Calcite: A Foundational Framework for Optimized Query Processing Over Heterogeneous Data Sources

Calcite 是一個基礎查詢層框架, 它面向各類大資料處理系統,提供了可擴充套件的查詢語言定義、解析、驗證、優化、執行的統一框架。核心模組包括:1 內建大量優化規則的可擴充套件的查詢優化器(query optimizer)、2 可以自定義語言的查詢處理器(query processor)、3 支援大量異構模型和大資料系統的介面卡(adapter),整體上看 Calcite 像是一個故意缺失了儲存層(包括資料讀寫處理)的DBMS。此外還靈活地支援大資料框架選擇它實現SQL語法定義、解析、校驗、優化、轉換等步驟中一項或全部功能。比如 hive 僅使用 calcite 作為優化器,而 flink 選擇了以上全部功能。最後即使未使用calcite的大資料系統,也可以通過針對該系統的介面卡元件,實現SQL查詢,甚至實現跨異構系統的join和優化。

Tip:

高併發場景的多級快取和實時反饋設計

反饋(Feedback)是控制論中的一個基本概念,是指系統輸出的全部或部分資訊通過一定的通道返送到輸入端,從而對系統的輸入和再輸出施加影響的過程。

在每秒百萬級的高併發場景中,資料庫不能直接扛量,因為一般SSD的單庫最高不到1萬的TPS,而Redis也不是銀彈,單分片最多也是10萬TPS量級。這種情況下需要在服務例項中使用本地快取,如 Guava、Caffeine 作為L1一級快取,因為存放在 JVM 堆內,速度最快但容量有限,過多會影響GC。之後是堆外快取作為 L2 快取,如 OHC,可以存放更多資料,但是由於需要序列化步驟比前者稍慢。最後才是訪問 Redis 叢集,作為 L3 Cache,而 Redis 中的資料通過 DB 主動寫入。

舉一個具體例項,如秒殺場景中,L1中存放商品庫存狀態(包括分片庫存Key狀態),L2中儲存使用者黑名單等,L3中儲存分片後的庫存資訊和使用者訂單資訊等。當用戶請求到來時通過三級快取後完成 Redis 中下單,之後通過非同步訊息完成最終下單,同時也通過流處理系統進行反饋控制,比如根據庫存資訊更新L1中狀態、根據使用者實時行為更新L2黑名單等。

Share:

《少有人走的路》簡單總結

  1. 心智成熟是一條少有人走的路,人生充滿苦難,而人們趨向於的規避問題和逃避痛苦,這是人類心理疾病的根源(退行、疑病症、強迫症),不僅會使心靈停止成長,甚至導致退化和萎縮,使心智永遠難以成熟。
  2. 自律是解決人生問題和消除痛苦的最重要的手段,它不是意志和能力,而是積極主動去承受痛苦和解決問題的態度,包含四個原則:推遲滿足感(先面對痛苦和解決問題,再享受快樂)、承擔責任(解決問題的前提、承擔自身行為的結果)、擁抱事實(避免移情、接收挑戰和質疑、保持誠實、修正人生地圖)、保持平衡(彈性、釋放情緒、放棄)。
  3. 愛是自律和前行的原動力,而真愛不是為了自己的需要,真愛的目的是為了促進心智的成熟。
  4. 心智成熟的最終目的是與自己內心達成一致,主要是意識與潛意識認同和融合。