專爲手機號碼設計的特殊的排序

打個比方說吧,某移動公司的數據庫裏存了移動用戶的數據,有一項屬性是用戶的手機號碼。現在要對這些號碼進行排序,條件是,內存比較小,速度希望不要太慢。

我們來分析一下吧,中國的手機號碼是11位的。其實在這裏各位看官也可以自己先想想具體怎麼實現,注意,不要用冒泡、快速等等,要-----非主流。

 書中用到的辦法涉及到指針,因爲我現在用c#更加順手一點,所以我用數組的方式加以試驗,意會即可:

1>取一數組,含有10^11(10的十一次冪)個元素的bool型 a[n](0<n<10^11)

2>初始值爲false

3>遍歷手機號碼。手機號碼=n時,將a[n]=true。

4>結束,重新遍歷a[n],如果a[n]=true,輸出n即可。

 

總結一下,使用上述排序的方式,肯定比冒泡排序要快的多,具體的特殊條件爲

1<所排序數組爲整數

2<所排序數組範圍一定

3<數組沒有重複值出現

 

現在來優化上述算法:

首先,中國移動的號碼是大於等於13,400,000,000小於19,000,000,000的,我們首先縮小了數組的排序範圍,這一步大約可以省下95%左右的數組空間。

緊接着,書上說是用位圖或者位向量來解決(其實我不懂什麼事位圖什麼是位向量),我們用字符串0111 0100 1000 0100 0000來表述數組{1,2,3,5,8,13},(個人感覺是不是用指針的話是不是好一點),字符串從左向右,一次代表0、1、2、3、……,這樣做的好處是,省空間,Int32 值類型表示值介於 -2,147,483,648 到 +2,147,483,647 之間,所以用常規方法的話用整型表示一個手機號碼,還得用int64型,佔用64位,8個字節,很是奢侈,10^11*8b=800G,的內存佔有率。。。汗,而用字符串表示,佔用10^11個字節=100G,好像也不小。話說回來,我們使用10^11個元素的bool型數組,只要10^11/8=12.5G,就算是去掉不用的號碼,也還有12.5*(1-95%)=625M的內存佔用,好像還是不能排序,我暫時也沒想到別的辦法,就先寫到這裏,還請大家指教。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章