原创 使用 Kotlin DSL 編寫網絡爬蟲

本博文將會通過一個網絡爬蟲的例子,向你介紹 Kotlin 的基本用法和其簡潔有力的 DSL。 關於DSL 按照維基百科的說法,DSL(domain-specific language) 是一種專注於某一特定應用領域的計算機語言。和我們常用的

原创 貪心算法(2)——算法導論(22)

1. 寫在前面 在上一篇博客中,我們通過選擇問題瞭解了貪心算法。這一篇博客將繼續介紹貪心算法,主要談談貪心算法的原理,並簡單分析一下揹包問題。 2. 貪心算法原理 通過上一篇博客中的選擇問題,我們看到,貪心算法可以由如下幾個步驟來實現:

原创 貪心算法(1)——算法導論(21)

1. 寫在前面 在之前的5篇博客中,我們學習了動態規劃算法。我們可以看到,在求解最優化問題的算法中,通常需要經過一系列的步驟,在每個步驟中都面臨多種選擇。對於許多最優化問題,使用動態規劃算法來求解最優解有些殺雞用牛了,可以使用更加簡單的算法

原创 NiceMark——我的Markdown編輯器

閒來無事,寫了一個Markdown編輯器。基於electron,完全採用Web前段技術(Html,css,JavaScript)實現。代碼已託管在Github上,歡迎下載使用。 下面上幾張截圖:

原创 動態規劃(5)——算法導論(20)

1. 提出問題 假設我們要設計一個將英語翻譯成法語的程序,即對英文文本中出現的每個單詞,我們需要查找其對應的法語單詞。爲了實現這一查找操作,我們可以構建一棵二叉搜索樹,將n個英文單詞作爲關鍵字,對應的法語單詞作爲關聯數據。 通過使用紅黑樹或

原创 攤還分析(2)——算法導論(24)

1. 動態表 先來介紹動態表的概念。 我們在使用數組時,通常都是先創建一個大小固定的數組,然後再將數據填充進去。這時難免會遇到創建的數組過小或過大的情況。過小則滿足不了存儲需求;過大則浪費存儲空間。於是我們對普通數組進行包裝,創造出一種叫做

原创 攤還分析(1)——算法導論(23)

攤還分析(amortized analysis)是一種分析一個操作序列中所執行的所有操作的平均時間分析方法。與一般的平均分析方法不同的是,它不涉及概率的分析,可以保證最壞情況下每個操作的平均性能。 下面介紹癱瘓分析中的最常用的三種技術。 1

原创 Redis源碼學習(1)──字符串

redis 版本:5.0 本文代碼在Redis源碼中的位置:redis/src/sds.c、redis/src/sds.h 源碼整體結構 src:核心實現代碼,用 C 語言編寫 tests:單元測試代碼,用 Tcl 實現 deps:所有依賴

原创 自己動手寫表達式解釋器

寫在前面 最近需要實現自定義報表的功能,其中有一個需求是要計算用戶輸入的公式。比如用戶輸入公式:A1 + A2 * 2.4,我們需要將A1和A2替換成對應的值,然後算出結果;公式中還可能包含括號,比如:A1 * (A2 - 3);再進一步,

原创 自己動手實現MQTT協議

寫在前面 前段時間弄IoT相關的東西,系統學習了一下 MQTT 協議,在此分享出來。 本文先是對 MQTT 協議做了簡單的介紹;接着是對 MQTT協議的內容做了較爲全面的解讀;最後使用 Python 語言去實現一個簡單的 MQTT 客戶端和

原创 GoodNotes 模板分享

畫了一個A4紙模板,分享出來: 模板下載 原始PSD下載

原创 編譯原理——表達式計算

寫在前面 最近需要實現自定義報表的功能,其中有一個需求是要計算用戶輸入的公式。比如用戶輸入公式:A1 + A2 * 2.4,我們需要將A1和A2替換成對應的值,然後算出結果;公式中還可能包含括號,比如:A1 * (A2 - 3);再進一步,

原创 斐波那契堆——算法導論(26)

1. 寫在前面 在很久之前學習過堆這種數據結構。這次再來學習一種比較特別的“堆”——斐波那契堆。下文首先會介紹斐波那契堆的結構,然後會介紹在其上的操作,最後再分析這些操作的效率,以及一些理論的證明。 2. 結構 斐波那契堆是一系列具有最小堆

原创 計算機網絡——DNS協議的學習與實現

1. 主要內容 不說廢話,直接進入正題。先說說本文本文的主要內容,好讓你決定是否看下去: 介紹DNS是幹什麼的; 介紹DNS是如何工作的; 介紹DNS請求與響應的消息格式; 編程實現一個簡單的DNS服務器; 2. DNS是啥 關於DNS

原创 100行代碼實現“跳一跳”輔助程序

100行代碼實現跳一跳輔助程序 寫在前面 好久沒寫博客了,今天來一發吧。分享一下今天下午用python寫的“跳一跳”小遊戲的輔助程序。之前是準備用樹莓派操控一個“機械手指”來代替人的觸摸操作,但該方案還在醞釀中,實現了再分享。接下來要分享的