日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

利剑无意之如何判断一个数在40亿个整数中

發布時間:2024/2/28 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 利剑无意之如何判断一个数在40亿个整数中 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

如何判斷一個數在40億個整數中

首先思路:用一個set存儲就好了,整數32位,一個整數4個字節,40億個整數,應該是160億個字節,大概16GB。

此刻問題又來了,我的機器只有2GB內存,但是需要盡可能快的得出答案,怎么辦?【注:可以增加機器】

1)如果說我們沒有增加機器,分8次進行加載數據,從磁盤加載數據是磁盤io操作,是非常慢的,每次都要加載這么大的數據,還要8次,估計你找一個數的時間可以達到分鐘甚至小時級了。

【磁盤IO操作非常慢,比內存中的操作要慢百倍】

2)優化方案【秒級】:使用8臺機器分別計算,最后匯總結果,一次性讀入數據,查找很快。

3)再次優化【毫秒級】:判斷一個數存在不存在,其實只有兩個狀態,可以用一個位來表示。

32位int的范圍,總共就是2的32次方,大概42億多點。所以可以申請2的32次方個位。把整個整數范圍都覆蓋了,。這樣一來,就可以做了,1代表第一個位,2代表第二個位,2的32次方代表最后一個位。40億個數中,存在的數就在相應的位置1,其他位就是0。這樣2的32次方個位,相當于2的29次方個字節,只占500MB內存。

【因為原來的32位整數,轉化為了1位的布爾,所以數據空間就是原來的32/1。】

這是一種非常有名的大數據算法,叫位圖法,英文名叫bitmap。顧名思義,就是用位來表示狀態,從而節省空間。

3)首先,32位int的范圍是42億,40億整數中肯定有一些是連續的,我們可以先對數據進行一個外部排序,然后用一個初始的數和一個長度構成一個數據結構,來表示一段連續的數,舉個例子。如果數據是1 2 3 4 6 7……這種的,那么可以用(1,4)和(6,2)來表示,這樣一來,連續的數都變成了2個數表示。來了一個新數之后,就用二分法進行查找了。

這樣一來,最差情況就是2億多的斷點,也就是2億多的結構體,每個結構體8個字節,大概16億字節,1.6GB,在內存中可以放下。

?

總結

以上是生活随笔為你收集整理的利剑无意之如何判断一个数在40亿个整数中的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。