Bash Max Counters
max_counters() {
local _n=$1
local -n _a="$2"
local -n _out="$3"
local -a _counters
local _i
for ((_i = 0; _i < _n; _i++)); do _counters[_i]=0; done
local _maxCounter=0 _lastUpdate=0
local _condition=$(( _n + 1 ))
local _v
for _v in "${_a[@]}"; do
if (( _v <= _n )); then
local _index=$(( _v - 1 ))
if (( _counters[_index] < _lastUpdate )); then
_counters[_index]=$_lastUpdate
fi
(( _counters[_index]++ ))
(( _counters[_index] > _maxCounter )) && _maxCounter=${_counters[_index]}
fi
if (( _v == _condition )); then
_lastUpdate=$_maxCounter
fi
done
for _i in "${!_counters[@]}"; do
if (( _counters[_i] < _lastUpdate )); then
_counters[_i]=$_lastUpdate
fi
done
_out=("${_counters[@]}")
}
This delays the expensive “set all counters to max” work until it is really needed, which keeps the solution fast.