中位數公式
我為什麼要莫名其妙地研究什麼「量數和序數」呢?這是因為我搞不懂中位數的公式。統計學課本上都寫着,是 (n+1)/2,n 是數字的總數。公式很簡單,但卻很難理解。為什麼要先加一再除以二?你可能會説,管它那麼多幹嘛,套公式就完了。但是,二分查找法1也要用到中位數,但公式變成了 (n - 1)/2,這似乎和編程語言從零開始編號的做法有關。兩者的差異使我如鯁在喉,這個問題又不需要特殊的數學知識,為了以後寫二分查找法的時候不會出錯,我接下了這個挑戰。
歸根究底是這個問題:為什麼五个蘋果平分是 2.5 個,但五根手指的中間是第三根呢?這就是量數和序數的不同。想象你在一排路燈旁邊散步。路燈從一到五編好了號。從一號路燈走到五號路燈需要四步,用數式表示是這樣的:
一號 + 四步 = 五號
起點編號 + 步數 = 終點編號
移項得到:
四步 = 五號 - 一號
步數 = 終點編號 - 起點編號
如果從 1 開始編號,步數 = 終點編號 - 1。
這裏的編號就是序數,可以看到,序數相減能變成步數。步數是量數,有加減乘除。這就是我原創的「序數運算」。數學家用序數研究什麼是「無限+1 (Youtube)」,我用序數研究小學數學,這下我也當了一回「民間數學家」了。
現在回到中位數的問題。中位數是用來切開數列的一把刀,左右兩邊的數字數量相等。例如數列 56789,排在第三位的7就是中位數。要找到中位數,就要先知道中位數排在第幾位。用路燈的比喻思考,從起點走到中間路燈的距離,等於從中間路燈走到盡頭的距離。這是「中間」的定義,所以:
起點編號 + 總步數 ÷ 2 = 中位數編號
展開「總步數」:
起點編號 + (終點編號 - 起點編號)÷ 2 = 中位數編號
(起點編號 + 終點編號)÷ 2 = 中位數編號
這下公式的意義就很明確了,統計學和編程的差異也一目瞭然。正常人從一開始編號,總數 n 就是終點編號,所以中位數公式是 (1 + n) ÷ 2,而程序員從零開始編號,終點編號變成了 n - 1,所以中位數公式是 (0 + n - 1) ÷ 2。
聽着似乎很彆扭,為什麼偏偏要從零開始數?我來稍微解説一下。編程和統計學不一樣,不太不關心總數,編號反而更有用,所以我們遇到的 n 往往是終點編號。這樣一來,中位數公式就成了簡單的 n / 2。
這裏附上簡單的二分查找的説明。我們要從一串數字裏找到 10,這些數字已經按大小編好了號,當然是從零開始編。
數字:0 2 4 10 15
編號:0 1 2 3 4
頭 尾
第一個中點是 0 + (4-0)/2 = 2。
數字:0 2 4 10 15
編號:0 1 2 3 4
頭 中 尾
編號 2 的數字是 4,比 10 小,所以接着把中點設成起點。
數字:0 2 4 10 15
編號:0 1 2 3 4
頭 尾
第二個中點是 2 + (4 - 2) /2 = 3
數字:0 2 4 10 15
編號:0 1 2 3 4
頭 中 尾
編號 3 的數字是 10,找到收工。
-
編程術語,一種從數列中搜尋數字的流程 ↩︎