有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...