問題: 設有非負整數a,b 知足條件 a < b, 求一種算法, 根據惟一的 a,b 可計算出一個惟一索引 i. 面試
原始問題是: 在幾何推理系統中, 爲每一個點如 A,B 都有一個從 0 開始的整數索引 a,b, 又有兩點
惟一肯定一個線段L, 求爲L設計一個整數的索引 i, 使得知足根據 a,b 可惟一計算出 i. 算法
當前我使用的算法是 i = b*(b-1)/2 + a. 下面說明這個算法是知足條件的. 設計
咱們將 a作x軸, b 作y 軸, 可將 a,b 的可能組合排列爲: 索引
b\a 0 1 2 3 4 5
1 0 - - - - -
2 1 2 - - - -
3 3 4 5 - - -
4 6 7 8 9 - -
5 10 11 12 13 14 -
6 15 ... (略) 隊列
按照這種方法排列, 可爲每一對(a,b) 惟一對應一個排列的順序, 這個順序就是咱們須要的
索引 i . 公式如上給出的 i= b*(b-1)/2+a. 數學
因爲 b*(b-1)/2 構成的數字隊列被稱爲三角數(彷佛我記得是某數學書上這麼叫的), 因此
我就把這個 i 叫作三角數索引, 也許名存實亡吧... 方法
這個問題的反過來問題是, 若是已知 i, 求對應的 a,b. 下面試着求解. 數字
設sqrt(2*i)=j
設a=0, 則i_min=b*(b-1)/2, 此時有 b^2=2*i+b, 故有b=sqrt(j^2+b) > j
設 a=b-1 (這是a的最大值, 因a<b), 則 i_max=(b+2)(b-1)/2,
故有 b < j+1. 系統
聯合有 j < b < j+1; 故對 j 取整數, 則b要麼是[j], 要麼是 [j]+1.