求大資料量陣列中不重複元素的個數

2021-04-13 13:49:19 字數 1529 閱讀 8098

有2.5億個整數(這2.5億個整數儲存在乙個陣列裡面,至於陣列是放在外存還是記憶體,沒有進一步具體說明);

要求找出這2.5億個數字裡面,不重複的數字的個數(那些只出現一次的數字的數目)

另外,可用的記憶體限定為600m;

要求演算法盡量高效,最優;

1. caoxic的演算法

byte    marks[2^29

];//

512m   // byte marks[2^32/8]; //用這個就更清楚了,標誌所有整數(2^32)出現的可能

byte    repmarks[2^

25];

//32m 32m*8>2.5億  //標誌2.5億個數字陣列裡面的數字是否重複過

const

byte bitmarks[8]

=;dword    calcdifnum(dword

*pbuf,dword bufcount)

else

}memset(marks,0,

sizeof

(marks));

for(dw=0

;dw<

bufcount;dw++)

else}}

return

count

-count2;}

2. 改一下,應該也可以:

byte    marks[2^29

];//

512m   // byte marks[2^32/8]; //用這個就更清楚了,標誌所有整數(2^32)出現的可能

byte    repmarks[2^

25];

//32m 32m*8>2.5億  //標誌2.5億個數字陣列裡面的數字是否重複過

const

byte bitmarks[8]

=;dword    calcdifnum(dword

*pbuf,dword bufcount)

else

}for

(dw=

0;dw

<

bufcount;dw++)

}return

count2;

}3. 把陣列裡面的數字分兩類,正數負數,marks陣列分成兩部分標誌,1.該數已經標誌[0 -->  2^28-1] 2.標識該數已經重複[2^28 -->2^29-1]。

byte    marks[2^29];//512m   // byte marks[2^32/8]; //用這個就更清楚了,標誌所有整數(2^32)出現的可能

const byte bitmarks[8]=;

dword    calcdifnum(dword *pbuf,dword bufcount)

else

}else}}

memset(marks,0,sizeof(marks));

for(dw=0;dw>3]&bitmarks[pbuf[dw]&7])

else

}else}}

return count-count2;

}

不重複大資料量的批量生成

在工作中,同事遇到乙個需要批量生成不重複碼的功能,之前我處理的都是用php 直接用陣列 in array解決的,那時候生成的數量倒還不多,大概也就幾萬個,所以直接將php的執行記憶體提高一點,然後就解決問題了。但是這次要處理的資料量比較大,是五千萬個,就容易出現問題。首先,執行記憶體是肯定不夠的,然...

不重複大資料量的批量生成

在工作中,同事遇到乙個需要批量生成不重複碼的功能,之前我處理的都是用php 直接用陣列 in array解決的,那時候生成的數量倒還不多,大概也就幾萬個,所以直接將php的執行記憶體提高一點,然後就解決問題了。但是這次要處理的資料量比較大,是五千萬個,就容易出現問題。首先,執行記憶體是肯定不夠的,然...

返回陣列中不重複元素

本文內容為學習了司徒正美的部落格 後整理總結部分內容而得 總結兩種思路的解決方式。解決思路一 如下 var ret span span strong span b var norepeat function array else return set.replace g,split alert no...