Этот вопрос был вдохновлен ответом, над которым я работал вчера.
Скажем, у нас есть N входов, которые оцениваются как true, так и false, что является наиболее эффективным способом определить, является ли X этих входов правда?
Предостережения:
- Входы не входят в массив, поэтому, если вы конвертируете их в массив, учитывайте все накладные расходы.
- Под "наиболее эффективным" я имею в виду наилучший средний случай (хотя мне бы очень хотелось видеть статистику лучших и худших случаев).
Вот два метода, с которыми я столкнулся вчера.
1) Вспомните переменные как логические входы для схемы и уменьшите их с помощью K-map
Сначала я думал, что это будет самое эффективное средство, потому что оно следует за логикой схемы, но у меня определенно были мысли. По мере увеличения количества входов количество сравнений растет экспоненциально2 inputs:
1 of 2: if(1 OR 2)
2 of 2: if(1 AND 2)
3 inputs:
1 of 3: if(1 OR 2 OR 3)
2 of 3: if((1 AND 2) OR (1 AND 3) OR (2 AND 3))
3 of 3: if(1 AND 2 AND 3)
4 inputs:
1 of 4: if(1 OR 2 OR 3 OR 4)
2 of 4: if((1 AND 2) OR (1 AND 3) OR (1 AND 4) OR (2 AND 3) OR (2 AND 4) OR (3 AND 4))
3 of 4: if((1 AND 2 AND 3) OR (1 AND 2 AND 4) OR (1 AND 3 AND 4) OR (2 AND 3 AND 4))
4 of 4: if(1 AND 2 AND 3 AND 4)
... etc. ...
Самый лучший сценарий - штраф (O(1)
), но худший случай намного хуже, чем...
2) Счетчик и последовательные операторы if
Это всегда выполняется в O(n)
времени, что нормально, но я надеялся на лучший лучший вариант.
counter = 0
if(input 1)
counter++
if(input 2)
counter++
if(input 3)
counter++
... etc. ...
if(counter >= X)
// true
Что является более эффективным решением, чем любой из этих?