用單個數值取代二維坐標描平面位置有哪些優劣?

我發現這樣的一個方案標記平面上的一點,簡單地說:
首先類比直線上長度為10的線段10倍細分,以及十倍擴充然後繼續細分直到覆蓋全部長度,我在平面取一個九宮格,也採取細分和擴充,最後覆蓋整個平面,當我給每個格子賦值,可以得到一個新的計算平面位置的思路,略去外衣看完全就是複數的計演算法則。
比較花哨的解釋可以看這裡:http://jiyinyiyong.blog.163.com/blog/static/64699876201101381941493/
(此處除法計算不正確,已將後來的結果補充到此)
然後相關的資料我在一篇文章裡邊用鏈接做了索引:http://hi.baidu.com/jiyinyiyong/blog/item/4221f83d7b3ccde73b87ce2c.html
然後就有了這個問題:
通常都說一個變數表示的是一維的,兩個是二維的,但是這個進位當中一個值表示的是一個平面,那麼既然一直可以用一個數值表示平面的,為什麼人們習慣要兩個數值呢?


首先我要讚賞你的想法。你設想的結果基本都是正確的,除了非常不好用。你現在思考的已經涉及非常高等的數學,並且是你並沒有什麼數學訓練的情況下,非常佩服。下面詳細解答。

你這樣表示一個平面是可行的。我不妨也提一個方案來表達平面的第一象限:將兩個座標的各位數字交錯寫出來。比如位置(36.1, 18.27)表示成31 68.12 07。我用一個正實數唯一地表示了第一象限的一個點,而且第一象限的所有點都可以這樣表示。這個方法有兩個缺點,其中之一是我沒有辦法表達其他象限,另一個一會說。

如果你覺得我這個表示實在是多此一舉,那其實你也在用這個表示。你用平衡三進位,比上面的想法高明,你用整個數軸表示了整個平面。不過你的想法和上面的方法本質上是一樣的,把平衡三進位的各位數字交錯寫出來。這樣理解的話,你的1至9分別就是0+,--,+0,+-,00,-+,-0,++,0-。這樣比如計算11+1的話,11+1=0+0++0+=(00+0,++++)=(0,+--)=0+0-0-=199。

我建議你使用類似的符號解釋你的想法,至少這樣更符合你給起的名字。另一個換符號的重要原因是數學上的。你參考複數的運算,給出了這個表示下的「個位數」加法和乘法表。但是到多位數乘法你不確定,想當然地按照十進位的思維來進位,雖然結果都是正確的。如果要嚴格的話,你必須要像在平衡三進位中一樣,把2寫成+3^1-3^0,這裡3是這一進位的基。在你現行的符號下,你不能給出一個基。而如果按上面我說的交錯寫的理解,你就知道你的進位其實是跳著來的,是兩個基,都是3。寫成這樣雖然麻煩,但是你可以由此證明你的乘法加法是可行的。

我開頭處提出的表示方法的缺點是,每次進位都要跳一位來進,還不如轉成兩個十進位好算呢,對於你的方法在我的符號下也是這樣,不如轉成兩個平衡三進位。你如果說跳一位來進有什麼不好,那麼三維要麻煩到什麼程度,而無窮維空間更是沒有定義了(這可以是第三個缺點)。作為一個數學遊戲非常好,並且值得研究,但是你沒有找到簡單的演算法。在你的符號下,你每加一維都需要重新定義加法乘法表。

第三個換符號的原因,你必須定義數乘運算,必須有方法表示4個2相加,一般用2X4,而2X4已經被你用2乘4佔用了。必須用與數軸上位置不同的符號,將平面點與數軸點區分開來。

不過你定義的運算仍然是存在並且很好地定義了的。你所謂的整數就是虛部實部都為整數的複數,數學上叫高斯整數。高斯整數構成一個叫「整域」的代數結構,其中的是定義了素元素的,就是你說的素數,數學上叫高斯素數。維基百科上有這個圖片,就是你編程畫出來的那個:
http://en.wikipedia.org/wiki/File:Gauss-primes-768x768.png
因此你的一些思考事實上是高等代數和數論里的內容,你可以查閱相關資料並開始學習。由於你複製了複數的結構,引入除法什麼的也是肯定可以的,你也可以定義實數,並且我保證是有域結構的(請自行查閱高等代數近世代數的書籍學習)。

只是我懷疑按照你提出的表示方法,沒有一個比寫成兩個數更簡單的演算法了。如果你問人們為什麼不用,這就是原因了。另外定位也不方便,你打仗時候告訴繪圖員一個你的表示,人家要多久才能標出個點啊。我也懷疑是否存在完美的用一個數來表示平面的方法(方法是很多的)。各種方法不是定義得不好,就是運算非常不方便。像你我提出的這兩個,真的是多此一舉。

最後提點建議。你提的這個表示方法絕對不是大部分領域中實用的表示方法,但是一定有可用之處。加油。而關於素數的思考,你現在知道這已經被研究了很久了,就開始有方向地學習吧。


因為|U| == |U×U|,所以一個U&<--&>U×U的雙射是肯定可以構造出來的。只要你選擇一個合適的雙射函數,那你就成功的用單個值取代一個二維坐標,而沒有任何的問題。


討論有關一維到二維滿射的問題。為簡便起見,只討論單位線段到單位正方形上的映射。

一、映射存在性
來看看一維區間A=[0, 1]和二維單位正方形B=[0, 1]*[0, 1]。二者的勢(包含的元素個數)都是不可數的,並且都等於c。可以認為二者包含的點數相等,因此一定存在一個從A到B的雙射,也就是說不僅是一一對應,並且B中全部點在A中都有元素對應,沒有漏掉的。當然,也存在滿射。

二、有哪些滿射

  1. 小數點穿插:對單位正方形B中兩個點a=0.a_1a_2a_3...b=b_1b_2b_3...,取單位線段A中一點x=a_1b_1a_2b_2a_3b_3...與其對應,則這樣的對應是雙射。有限解析度下的圖示為:

  2. 題主提出的九宮格映射:把單位正方形分成九個小正方形,分別編碼為0到8,每個小正方形又可以編碼為0到8,最終用一個9進位小數表示單位正方形。有限解析度下的圖示為:

    小數點穿插映射中的長線隨著解析度增高變短,而九宮格中橫跨不同宮格的長線一直存在,說明前者可能是連續的、後者一定不連續,在下一小節我們將更詳細地分析這一點。

  3. 皮亞諾曲線:如圖,將一條曲線不斷迭代變長,在第k步,這條曲線分為2	imes 4^k段,每一段長為frac{sqrt2}{2^{k+1}},當k趨向於無窮得到的極限曲線就是皮亞諾曲線。有限解析度下的圖示為:

三、這些映射有什麼特點
拋開在其他領域可能會有特殊用途不談,在數學上,這些映射的主要用途就是舉例供瞻仰,沒有太大分析作用,因為它們的性質都不太好。

3.1 九宮格映射不連續
大家經常能看到的二維曲線,比如直線、圓,最基本的性質是連續,只有連續了,才能討論其他更加實用的性質,比如導數、光滑等等。然而,九宮格映射法不連續:連續函數要求自變數很小時,函數值也很小,0.3888888....和0.4000000...兩個(九進位)小數雖然離得很近,然而由於二者的像處在不同九宮格里,它們的函數值離得很遠。就這一條,九宮格映射法的實用價值就大打折扣。類似地,處在平面上相鄰九宮格邊界兩邊很近的二維點,其一維九進位表示卻離得很遠,所以從二維到一維的逆映射也不連續

3.2 小數點穿插連續但不可導
因為在單位正方形中靠的很近的點,其x、y分量靠的也很近,等價於對應的一維穿插小數很接近,因此小數點穿插是一維到二維的連續映射。下面來看看在0處的導數,因為f(0)=(0,0)f(Delta)=f(0.a_1a_2a_3...)=(0.a_1a_3...,0.a_2a_4...),因此:

frac{f(Delta)-f(0)}{Delta}=frac{(0.a_1a_3...,0.a_2a_4...)}{0.a_1a_2a_3...}
請注意,當Delta 
ightarrow 0時,這個極限是無窮大,因為假如分母前2N個小數是0,則分子前N個小數是0,因此分數值是10^N數量級,因此不可導。

3.3 皮亞諾曲線連續但不可導
皮亞諾曲線是一系列曲線的極限曲線,也就是一系列連續函數f_n的極限函數。可以證明它是連續的,並且的確佔滿了單位正方形。相關證明相當精彩但是比較複雜,詳見Munkres著拓撲學第44節。

3.4 面積1=0?
皮亞諾曲線引出的另一個有趣的問題時,二維正方形面積是1,一維曲線面積應該是0(錯誤),用一維曲線佔滿二維區域十分不合理,因為這樣貌似就出現了1=0的結果。

首先我們注意到,皮亞諾曲線的長度是無窮大,用一條長度是無窮大的一維曲線,的確可以佔滿面積是1的二維區域。一般來說,如果低維物體想佔滿高維區域,低維物體的用量必須是無窮。比如Koch曲線的維數是1.26,它的一維長度是無窮,二維面積是0,一維占的滿滿的,二維根本不夠用。

關鍵就在於面積的定義,一個二維區域的面積定義為用最少的小圓盤(或者小正方形)覆蓋這個區域所使用的小圓盤的用料。而一維曲線長度的定義為用最少的小繩子覆蓋曲線所使用的小繩用料。皮亞諾曲線的長度雖然是無窮,它嵌入二維正方形後的面積,是1,不是0,因為既然來到了二維,就要用圓盤來覆蓋而不能再用小繩子,而圓盤的用料不能少於1。

另一方面,一條長度為1的直線段,可以用frac{1}{2r}個半徑為r的小圓盤來覆蓋,圓盤總面積為frac{pi r}{2},當r趨向於0時,圓盤總面積趨向於0,因此長度為1的直線段面積為0。平面上x軸面積為多少呢?因為x軸可以劃分為可數個長度為1的線段,因此它的面積等於可數個0相加,還是0。

皮亞諾曲線無限長、面積是1,x軸也無限長、面積是0,那麼皮亞諾曲線是如何做到讓自己面積非0、以至於佔滿單位正方形的呢?這是因為皮亞諾曲線在微觀上是極度捲曲、處處不可導的,而x軸是處處可導的光滑直線。如果你嘗試計算分形維數,會發現皮亞諾曲線的分型維數恰好是2

四、這些映射的缺點
函數是建立定義域空間和值域空間的橋樑。數學上有價值的函數,往往需要保持拓撲、代數性質。處處不連續的函數幾乎沒有分析價值,因為幾何結構在映射前後完全不同,這樣的函數除了能說明二者的確能夠一一對應外就沒有其他數學價值了。

除了連續性,可導性也十分重要,我們熟悉的加減乘除等基本代數運算都是連續並且可導的。處處不可導的函數在局部震蕩劇烈,缺乏代數結構。

PS:題主提到的複數的計演算法則和本問題毫無關係,因為複數有兩個基,1和i,複數到複平面從本質上就是二維到二維映射。


牛人,獨立做出了類似皮亞諾曲線(http://en.wikipedia.org/wiki/Space-filling_curve)的東西,當然你和他的區別在於皮亞諾的格子是順序填寫的,而你用了洛書。這是一個非常了不起的思想,推薦你去學學集合論,你會看到這個想法皮亞諾是怎麼實現的。

好,現在我來告訴你差在哪裡,最主要的問題在於,你這種方法實際上是一種映射,即從R^2到R的一個雙射。這個映射的關鍵問題是:映射不能保持函數的連續性、可導性、可微性。

你應該在高等數學中學過這些概念,如果你不知道這些概念在生活中是什麼意思,我就略微解釋一下:就是原先在二維平面上連續的運動,在你這裡變成了跳躍式的了。
舉個例子,假如一個人在二維平面上兜了個小圈子(0,0)-&>(0,1)-&>(1,1)-&>(1,0)-&>(0,0),在你的「單數值系統」里看來,這個人並不是在走路,而是在跳躍:5-&>7-&>6-&>1-&>5。設想一下這種場景,一個人在平面上走的人離開(0,0)點,並沒有經過(0,0)點臨近的八個點就跑到了(10,8),你會什麼感覺?一定覺得這個人是外星人或是鬼之類的,這是違反人的思維方式的;類似情況,如果一個人在一條直線上走,離開6點之後沒有經過5,4,3,2,幾個點就直接到達了1,這是也是一種違反人的思維方式的「見鬼了」的狀況。

如果僅僅是「見鬼了」還不要緊,最主要的是我們沒有數學工具來研究5-&>7-&>6-&>1-&>5這種變化,微積分的基礎是連續可微,如果碰到不可微甚至不連續的的函數,我們目前是沒有太好的工具的。所以你光把兩個數寫成一個數的是沒有用的,你還需要有一套支持你的這種寫數方式的數學工具才行。而這一套數學工具的建立,比你這種寫數方式,要複雜很多很多倍的……


平面的拓撲性質很重要,如果用你的編碼,這個性質就難以實現了。

用簡單的話說,如果用二維坐標,在你九宮格的某個位置我們都很容易找到它前後左右的同桌。但是你的一維編碼並不能保證在所有的點都有一個統一簡單方法能查詢到其相鄰的點


為了運算啊,單純標記一個點或者向量意義不大,我們通常需要的是關於它的運算,最常見的是線性運算,而向量形式能適應這個運算的維度,所以是最合適的選擇(另一個選擇是複數,但複數我們通常也是表示成實部和虛部)
表示成一個數,維度信息就丟掉了,還得重新解出來才能運算。而且要以相同精度表示這個坐標,使用的存儲空間也不會變少。


已經有幾位給出了很詳盡的答案,我只想補充一下,能用R來一一對應的表示R^2並不是偶然情況,原因是他們的cardinality是一樣的。關於無限集合的cardinality可以參照wiki上的頁面或者隨便搜索,應該能得到很多很好的結果的。


雖然很問題沒有很直接的關係,我覺得還是可以介紹一下無限集合的cardinality。有限集合的cardinality有一個很顯然的定義,就是裡面元素的數量,而且一個重要的性質是當兩個集合A和B滿足A嚴格包含B的條件是,我們可以得到結論A的cardinality大於B的cardinality。這是一個很好的性質,但是可惜的是,這個性質並不能如我們所願的延續到無限集合上。對於無限集合,我們有很自然的大小的定義,infty,但是我們也知道,很多無限集合是有自然的嚴格包含關係的,例如整數集Z和偶數集合2Z,整數集Z,有理數集Q,實數集R和複數集C,等等。他們的大小存在嚴格大小關係么?很遺憾,答案是no。一個很好的例子就是Hilbert Grand Hotel。Hilbert有一家旅館,旅館中有無數多個房間,房間號是1,2,3,……假設現在是假期,全都住滿了。那麼
1. 來了一個客人,我們能安排他住下么?yes!我們把所有客人往後面的一間房移動,例如,1號房的客人移到2號房,以此類推。於是,1號房空出來了,所以我們的新客人就能入住了;
2. 那如果來了無數多個客人呢?答案也是能入住的,怎麼安排,大家好好想想吧,我就不spoil這個樂趣了。

那麼無限集合的大小應該怎麼比較呢?事實上,我們所謂的有限集合的『大小』相同,是因為他們之間存在一一對應,也就是一個雙射,例如我們可以發現,自然數集N和整數集Z是存在雙射的,Z和2Z是存在雙射的,甚至Z和Q之間也是存在雙射的。所有的無限集合都滿足這個性質么?很遺憾,答案又是no,我們很遺憾的發現,無論怎麼努力,都無法找到一個N和R之間的雙射。

於是集合論大家Cantor作出了他可以稱為最重要的工作,對無限集合的cardinality的分類。如上所述,無限集合也是有大小之分的。Cantor給出了可數(countable)和不可數(uncoutable)的定義,可數集合,即為所有和N之間存在雙射的集合,例如上面提到的Z,2Z,Q;而不可數集合則是其他的所有無限集合。

其他的如果感興趣的觀眾可以自己去查了,我相信google和度娘應該都能給出不少好結果的。

ps 抱怨一下那手機打好辛苦,剛才打了一大串竟然沒有保存……


這樣的做法是叫降維,是有廣泛的實際應用的,比方說,微信看附近的人這樣的地理位置搜索。一般上都是使用一個叫 geohash的演算法實現。


關於geohash,請參考:

圖解 MongoDB 地理位置索引的實現原理

GeoHash核心原理解析


這演算法的核心便是把二維的經緯度轉換為一個一維的數字或者說字元串,每個字元串代表了二維地圖中的一格,精度越高(數字位數越高/字元串越長),則這一格所覆蓋的面積越小,一般用26位的精度已經可以覆蓋整個地球,準確到一平米之類的(具體忘了)。


那麼,要查詢某一個點附近都有什麼,只要把這個點的經緯度轉換為一個geohash值,在精度範圍內,其它的經緯度經過hash,也是會得到同樣的一個值,那麼,只要查找其它的擁有同樣geohash值的點的索引便可以了。把精度控制在一公里,那麼查找的便是附近一公里的東西。


精度控制在10公里,則是查找10公里的東西。


對於精度的便利控制,是geohash演算法的精華。


對於相互臨近的兩格,他們的geohash不一樣,但是距離卻可以非常近。要處理這種邊界情況,需要的則是獲得當前坐標格臨近的其它8格的值,形成一個「九宮格」。


(獲得臨近其它8格的演算法是可以直接套公式的,一般實現geohash的庫均有提供。)


利用geohash,或者說降維,可以大大的加快查找附近點的演算法複雜度。


否則獲得一個坐標,你需要計算當前坐標與系統內其它所有東西的坐標距離,然後再根據距離排序才能獲得附近XX公里的東西。

在做推薦系統的時候也經常使用類似的方式進行降維,以提高計算速度。


比方說,所有商品有三種屬性:如價格、重量、顏色。那麼,兩個物品之間的價格、重量、顏色這三個維度都可以很相近。那麼,我要找出來與當前物品最相近的N個物品,便可以考慮使用降維演算法了,三維 =&> 二維 =&> 一維。


當然,降維只是方法之一,這裡做的實際上是所謂的clustering聚類,聚類演算法裡面更加常見的是k-mean: K-Means 演算法


用高維數的原因,是因為在實際世界裡,物質的各個維度運動是相互獨立的,只有將每一個維度獨立出來,才能得到對運動方程的最簡單描述。


這種映射不難發明。問題是,用戶體驗不好,古人也不喜歡複雜的,越直觀越好。


推薦閱讀:

用 e^x 的泰勒展開證明歐拉公式是否正確?

TAG:數學 | 雙平衡三進位 | 複數數學 | 集合論 |