解決多維空間點索引須要解決2個問題,第一,如何把多維降爲低維或者一維?第二,一維的曲線如何分形?html
填充曲線(Space-filling curve)數據庫
在數學分析中,有這樣一個難題:可否用一條無限長的線,穿過任意維度空間裏面的全部點? 常見的有: Z階曲線(Z-order curve)、皮亞諾曲線(Peano curve)、希爾伯特曲線(Hilbert curve),以後還有不少變種的空間填充曲線,龍曲線(Dragon curve)、 高斯帕曲線(Gosper curve)、Koch曲線(Koch curve)、摩爾定律曲線(Moore curve)、謝爾賓斯基曲線(Sierpiński curve)、奧斯古德曲線(Osgood curve)等數據結構
在1890年,Giuseppe Peano 發現了一條連續曲線,如今稱爲 皮亞諾曲線(Peano curve),它能夠穿過單位正方形上的每一個點。他的目的是構建一個能夠從單位區間到單位正方形的連續映射。 Peano 受到 Georg Cantor 早期違反直覺的研究結果的啓發,即單位區間中無限數量的點與任何有限維度集合中無限數量的點基數相同。 Peano 解決的問題實質就是,是否存在這樣一個連續的映射,一條能填充滿平面的曲線。以下圖就是他找到的一條曲線。通常來講,一維的東西是不可能填滿2維的方格的。可是皮亞諾曲線偏偏給出了反例。皮亞諾曲線是一條連續的但到處不可導的曲線。app
皮亞諾曲線的構造方法以下:取一個正方形而且把它分出九個相等的小正方形,而後從左下角的正方形開始至右上角的正方形結束,依次把小正方形的中心用線段鏈接起來;下一步把每一個小正方形分紅九個相等的正方形,而後上述方式把其中中心鏈接起來……將這種操做手續無限進行下去,最終獲得的極限狀況的曲線就被稱做皮亞諾曲線。函數
一年後,即1891年,希爾伯特就做出了這條曲線,叫希爾伯特曲線(Hilbert curve)。以下圖就是1-6階的希爾伯特曲線。post
在數學分析中,空間填充曲線是一個參數化的注入函數,它將單位區間映射到單位正方形,立方體,更廣義的,n維超立方體等中的連續曲線,隨着參數的增長,它能夠任意接近單位立方體中的給定點。除了數學重要性以外,空間填充曲線也可用於降維,數學規劃,稀疏多維數據庫索引,電子學和生物學。空間填充曲線的如今被用在互聯網地圖中。編碼
分形spa
皮亞諾曲線的出現,說明了人們對維數的認識是有缺陷的,有必要從新考察維數的定義。這就是分形幾何考慮的問題。在分形幾何中,維數能夠是分數叫作分維。多維空間降維之後,如何分形,也是一個問題。分形的方式有不少種,這裏有一個列表,能夠查看如何分形,以及每一個分形的分形維數,即豪斯多夫分形維(Hausdorff fractals dimension)和拓撲維數。3d
Z階曲線(Z-order curve)htm
前幾單介紹的 Genhash 是一種地理編碼,由 Gustavo Niemeyer 發明的。它是一種分級的數據結構,把空間劃分爲網格。Genhash 屬於空間填充曲線中的 Z 階曲線(Z-order curve)的實際應用。
何爲 Z 階曲線? 以下圖,這個曲線比較簡單,生成它也比較容易,只須要把每一個 Z 首尾相連便可。
Z 階曲線一樣能夠擴展到三維空間。只要 Z 形狀足夠小而且足夠密,也能填滿整個三維空間。
Geohash 可以提供任意精度的分段級別。通常分級從 1-12 級。利用 Geohash 的字符串長短來決定要劃分區域的大小,一旦選定 cell 的寬和高,那麼 Geohash 字符串的長度就肯定下來了。
地圖上雖然把區域劃分好了,可是還有一個問題沒有解決,那就是如何快速的查找一個點附近鄰近的點和區域呢?
Geohash 有一個和 Z 階曲線相關的性質,那就是一個點附近的地方(但不絕對) hash 字符串老是有公共前綴,而且公共前綴的長度越長,這兩個點距離越近。因爲這個特性,Geohash 就經常被用來做爲惟一標識符。用在數據庫裏面可用 Geohash 來表示一個點。Geohash 這個公共前綴的特性就能夠用來快速的進行鄰近點的搜索。越接近的點一般和目標點的 Geohash 字符串公共前綴越長(特殊狀況除外)
在前一章講 Geohash 編碼的時候,提到Geohash碼生成規劃: 「偶數位放經度,奇數位放緯度」。這個規則就是 Z 階曲線。看下圖:
x 軸就是緯度,y軸就是經度。經度放偶數位,緯度放奇數位就是這樣而來的。
Hilbert Curve 希爾伯特曲線
希爾伯特曲線一種能填充滿一個平面正方形的分形曲線(空間填充曲線),由大衛·希爾伯特在1891年提出。因爲它能填滿平面,它的豪斯多夫維是2。取它填充的正方形的邊長爲1,第n步的希爾伯特曲線的長度是2^n - 2^(-n)。
爲什麼要選希爾伯特曲線
這麼多空間填充曲線,爲什麼要選希爾伯特曲線?由於希爾伯特曲線有很是好的特性,以下:
(1) 降維: 首先,做爲空間填充曲線,希爾伯特曲線能夠對多維空間有效的降維。以下圖就是希爾伯特曲線在填滿一個平面之後,把平面上的點都展開成一維的線了。
(2) 穩定: 當n階希爾伯特曲線,n趨於無窮大的時候,曲線上的點的位置基本上趨於穩定。舉個例子,以下圖:
(3) 連續
希爾伯特曲線是連續的,因此能保證必定能夠填滿空間。
參考資料