原创 有了紅黑樹,爲啥還要跳錶?

書接前文。 前文書《紅黑樹是怎麼來的》我們講了通過紅黑樹(本質上是 2-3 樹或者 2-3-4 樹思想)來維護二叉搜索樹的平衡性。從紅黑樹的實現來看,雖然相對於 2-3 樹來說是簡化了不少,但仍然是相當複雜的。 有沒有更加簡單的實現方案呢?

原创 紅黑樹是怎麼來的

平衡的關鍵 書接前文。 在前文《二叉搜索樹的本質》中我們提到,二叉搜索樹在實踐中有個很大的問題:樹傾斜。按如下順序插入數據會讓二叉搜索樹退化成普通鏈表,進而相關操作的時間複雜度退化到 O(n): 怎樣讓這棵樹在寫操作後仍然保持平衡呢? R

原创 二叉搜索樹的本質

引言 打算寫寫樹形數據結構:二叉查找樹、紅黑樹、跳錶和 B 樹。這些數據結構都是爲了解決同一個基本問題:如何快速地對一個大集合執行增刪改查。 本篇是第一篇,講講搜索樹的基礎:二叉搜索樹。 基本問題 如何在一千萬個手機號中快速找到 1301

原创 我已經受夠了“系統異常”!

作爲用戶,你有沒有這樣的經驗:用個軟件,隔三岔五彈個框:系統異常! 作爲程序員,你有沒有這樣的經驗: 運營同學又屁顛屁顛跑來求助:“用戶不能下單了!” “報什麼錯?” “系統異常!” 無論作爲用戶還是程序員,一見到“系統異常”四個大字,我整

原创 雜談——程序員的悲哀

大學期間看了幾本比爾蓋茨的書,覺得技術可以改變世界,抱着救世主的心入行了。 幹了幾年活,讀了幾本書,見了幾個人,覺得這世間那些非技術人(項目經理、產品經理、銷售)整天只知道瞎逼逼,唯有技術實在,除了技術書籍都是廢土,不值得賞閱,除了技術人

原创 技術管理雜談

主動管理 人非機器。 我們可以編寫一段程序,讓機器嚴格按照我們的預期運行,程序寫得好的機器夠牛逼的話,能保它跑個幾十年無需干預。 但是人不行。 人有別於機器在於他的感性以及模糊的理性。 人會懶惰,會自私;也會追求,會奉獻——但這不是無條件的

原创 程序員的數學思維:如何推導矩形面積

矩形面積 小學課上我們就學過矩形的面積等於長乘以寬。 但活了幾十年,你有沒有想過:矩形面積爲啥等於長乘以寬? 或者說先人們爲何將矩形的面積定義爲長乘以寬? (繼續之前,請先忘掉矩形面積等於長乘以寬這個“簡單”的知識)。 時光倒退幾千年,小林

原创 Quick Pow: 如何快速求冪

今天講個有趣的算法:如何快速求 \(n^m\),其中 n 和 m 都是整數。 爲方便起見,此處假設 m >= 0,對於 m < 0 的情況,求出 \(n^{|m|}\) 後再取倒數即可。 另外此處暫不考慮結果越界的情況(超過 int64

原创 循序漸進 Redis 分佈式鎖(以及何時不用它)

場景 假設我們有個批處理服務,實現邏輯大致是這樣的: 用戶在管理後臺向批處理服務投遞任務; 批處理服務將該任務寫入數據庫,立即返回; 批處理服務有啓動單獨線程定時從數據庫獲取一批未處理(或處理失敗)的任務,投遞到消息隊列中; 批處理服務啓

原创 編程爲什麼那麼難:從儲值卡扣款說起

面向失敗編程是編程中最難的事情。 話說程序員小林的某一天:起牀->喫飯->坐地鐵->到公司->敲代碼->回家->玩遊戲->睡覺。 這一天的另一個版本:起牀->喫飯->坐地鐵->到公司->突然要 24 小時健康碼->進不了公司->坐地鐵回去-

原创 萬維網:蒂姆·伯納斯·李的信息帝國

信息大爆炸 人類文明史就是一部信息史——人類如何獲取、存儲和傳遞信息的歷史。 遠古時代,人類主要通過觀察自然現象來獲取信息和知識,通過口口相傳的方式傳遞信息。 而後,人類發明了結繩、符號,可以將個人大腦中的信息加以符號化——這可以說是人類最

原创 程序員打怪升級六件事

多做項目 我是半路出家的,頭髮沒剃光的那種(實際上我現在頭髮還茂盛得很)。我在培訓機構呆了半年就出去找工作。 第一份工作失敗了——底子太薄,工作擼不動,很快主動辭職了(怕被請辭就太沒面子了)。 然後我花了點時間惡補了下——用今天的眼光看,那

原创 接口設計的那些事

接口的一般性問題 缺乏經驗的程序員開發接口的時候,往往僅關注功能實現,但決定接口質量的恰恰是非功能性方面——遺憾的是,這一點在大部分公司,從項目到產品到研發,甚至到測試,都未得到應有的重視。 接口的非功能性要素主要體現在如下幾個方面: 冪

原创 也說工廠模式

問 100 個面試者會哪些設計模式,至少 99 個都會提工廠模式。這說明工廠模式確實是一般開發人員最常遇到的設計模式之一,另外也說明它是最直觀最容易理解的設計模式之一(無論是從概念上還是實現上)。 不過,如果繼續往下追問,比如工廠模式用來解

原创 字符集編碼(四):UTF

在前面文章《字符集編碼(中):Unicode》中我們聊了 Unicode 標準並提到其有三種實現形式:UTF-16、UTF-8 和 UTF-32,本篇我們就具體聊聊這三種 UTF 是怎麼實現的。 UTF 是 Unicode Translat