cmp
InterviewTime limit10sMemory limit256 MB
Store which of 12-bit buckets hold the remembered 12-bit value with 4095 bits, then read 12 prefix sums to binary search the bucket and compare it by a 12-bit count table to fit 20 memory accesses.
- Level
Hard8 of 10
- Topics
- Bit manipulation, Binary search, Math, Array
- Solved
- No attempts yet
Problem
You must design an algorithm for an ancient computer whose memory is just an array of 10240 bits. The memory is initialized to zero, after which you may write and read a single bit at a time.
You must implement two operations on this computer:
-
remember(a):ais an integer between 0 and 4095- The implementation of this operation may call:
bit_set(address):addressis an integer between 1 and 10240- The memory bit at position
addresswill be set to 1
- The memory bit at position
- The implementation of this operation may call:
-
compare(b):bis an integer between 0 and 4095- if
b<a, it should return -1 - if
b=a, it should return 0 - if
b>a, it should return 1 - The implementation of this operation may call:
bit_get(address)- Returns the memory bit at position
address: 1 if it was set throughbit_set()during theremember(a)operation, and 0 otherwise.
- Returns the memory bit at position
- if
Implement remember() and compare() to minimize the total number of memory accesses (bit_set() and bit_get()) in the worst case for all possible values of a and b.
Your solution will be evaluated exhaustively:
define AllMemory = array [0..4095][1..10240] of bits
set AllMemory to zeros
for a = 0..4095:
define bit_set(address): AllMemory[a][address] = 1
remember(a)
let maxA= the maximum number of bit_set() calls executed for any a
for (a,b) ∈ {0..4095}×{0..4095} in random order (i.e. all valid pairs (a,b) are considered, in some random order)
define bit_get(address): return AllMemory[a][address]
answer =compare(b)
if answer for comparing a and b is incorrect : your score = 0; exit
let maxB = the maximum number of bit_get() calls executed for any (a,b) pair
T=maxA + maxB
If (T>20): your score = 0; exit
else your score = 1 + 9 * (21– T); exit
Constraints
- You may be disqualified for any attempt to interact with the memory of our grading code.
- If your solution does not obey the protocol defined above (e.g. calling
bit_set()duringcompare()or with an invalid address), you will receive zero points.