Problem Statement
We're given an array of Integers stack
of length height
. The width
tells us that at most the width
-lowest bits in each entry of xs
are set.
Compute an array profile
of length width
such that profile[i] == max_i
with: max_i
is maximal with stack[max_i]
having the i
-th bit set.
How can I achieve this in a more efficient way than below?
Current solution
Currently I go over the columns and check each bit separately.
The following shows my current implementation in Scala. But feel free to give answers in other languages (Java, C, C++), as I am mainly interested in the algorithmic part (optimized for current CPUs).
Scala code:
def tetrisProfile(stack: Array[Int]): Array[Int] = {
var col = 0
val profile = new Array[Int](width)
while(col < width){
var row = 0
var max = 0
while(row < height){
if(((stack(row) >> col) & 1) == 1)
max = row + 1
row += 1
}
profile(col) = max
col += 1
}
return profile
}
Typical values
- array size
height
is 22 - width
width
is 10
Gist with benchmark code
Find the code here.
Current results:
original: 2.070s, 2.044s, 1.973s, 1.973s, 1.973s
maxihatop: 0.492s, 0.483s, 0.490s, 0.490s, 0.489s