從海量資料查詢有或者沒有出現的資料

2021-06-07 05:19:55 字數 1321 閱讀 6731

現在有1千萬個隨機數,隨機數的範圍在1到1億之間。現在要求寫出一種演算法,將1到1億之間沒有在隨機數中的數求出來。  

解決辦法:

一)用乙個32位的整數32位表示32個數,1億/32 = 3125000,使用3.125 * 4m byte空間即可儲存1億個數,即index[3125000].

二)對於數n,(n-1) / 32 為其在陣列中的下標,table[(n - 1) % 32]與陣列中下標(n-1)/32的值使用或操作。

三)表table中值為   table[ 0 ]=0x00000001,

table[ 1 ]=0x00000002,

... ...

table[29]=0x20000000,

table[31]=0x80000000,   等這樣的表示方式,具體的數值使用查表法加快速度。

四)最後算某值是否存在,使用與操作即可計算出。

資料儲存比如:

第乙個n=30是乙個隨機數,則儲存可以表示為:index[(30-1)/32] = index[0] = index[0] || table[(30-1)%32] /*剛開始時候初始化index[32]=*/

=  0 || 0x20000000 = 0x20000000;

第二個n=31是乙個隨機數,則儲存可以表示為:index[(31-1)/32] = index[0] = index[0] || table[(31-1)%32] /*第30位1,其他位為0*/

=  0x20000000 || 0x40000000 = 0x60000000;

... ...

依次類推,即可。

資料驗證比如:

1. 當要查詢30是否存在的時候,由於:(30-1)/32 = 0;(30-1)%32=29;我們只需要計算:index[0] & table[29] 是真還是假,就可以得出30是否存在。

2. 當要查詢31是否存在的時候,由於:(31-1)/32 = 0;(31-1)%32=30;我們只需要計算:index[0] & table[30] 是真還是假,就可以得出31是否存在。

... ...

依次類推,即可。

小結:

通過分析此題目,首先這種思路和方法,在一定程度上用相對小的空間儲存了大量的資料,節省了比較大的記憶體空間;在運算方面,位運算的速度相當來說效率是比較高的,因而也再一定程度上節省了時間複雜。

總之,這種儲存方式和思維方式,在一定方面能夠有效的解決海量資料儲存與運算。基於此題目,凡是大量資料篩選,判斷是否存在等問題,我們都可以借鑑此題目的思維和方法。

多執行緒生成海量資料和多執行緒海量資料查詢

using system using system.collections.generic using system.linq using system.text using system.threading using system.diagnostics namespace multithrea...

海量資料查詢唯一資料問題

常見的問題有以下幾類 問題一 有101個數,為 1,100 之間的數,其中乙個數是重複的,如何尋找這個重複的數,其時間複雜度和空間複雜度是多少?方法 利用和 sum1 1 2 3 99 sum2 a 0 a 1 a 99 sum2 sum1 重複的那個值 int onlyonerepeate int...

從系統登入到資料查詢

第一遍做完五個例項的時候有茫然的感覺,可能剛開始接觸資料庫,很多陌生的概念,違背了 吃飯理論 於是差點喪失了學習的動力.反反覆覆看了好幾天,研究了好幾遍,終於有些理解了,今天開會總結完,我重新學習了一些概念,比如ado等.又把五個例項的主要知識點和關係整理如下 例項一 系統登入 通過查詢儲存系統使用...