With only 1 integer missing:
// using sum(0..n) = n*(n+1)/2, and overflow optimization
(a):
n = a.length()
for x in a:
sum += x
missing = 0
// to avoid overflow
if n &1 == 0:
// n even
missing = (n/2)*(n+1) - sum
else:
// n+1 even
missing = (n)*((n+1)/2) - sum
return missing
32k integers = 2^(10+5) integers
bool[] size = 2^(10+5) x 1B = 32KB
bitset size = 2^(10+5) KB / 2^3 = 2^12 KB = 4KB
bitset:
bool has(x):
set(x):
clearall():
// 1 pass
find(file, max = 2^(10+5)):
list missing = new
bitset = new bitset(max)
using stream = create(file):
while stream.hasnext():
x = stream.next()
bitset.set(x)
for x = 0, x <= max, x++:
if !bitset.has(x):
missing.add(x)
return missing
With 2KB available memory?
// 1+ passes
find(file, max = 2^(10+5), available = 2^(11)):
list missing = new
bitset = new bitset(chunksize)
chunksize = available << 3 // 2KB = 2K x 8 bits
passes = (max / chunksize) +1 // +1 is needed
for pass = 0, pass < passes, pass++:
start = pass *chunksize
end = start +chunksize
using stream = create(file):
while stream.hasnext():
x = stream.next()
if !(start <= x < end):
continue
bitset.set(x -start)
for x = 0, x < chunksize, x++:
if !bitset.has(x):
missing.add(x +start)
bitset.clearall() // cannot new as limited space
return missing
XOR method: For only 1 integer missing in n-1 integers in range 1..n and no duplicates.
// xor method
find(file, max = 2^(10+5)):
xor1 = 0
using stream = create(file):
while stream.hasnext():
x = stream.next()
xor1 ^= x
xor2 = 0
for i = 0, i <= max, i++:
xor2 ^= i
missing = xor1 ^ xor2
return missing
[Hat tip to PC, GFG]
No comments:
Post a Comment