spamsink: (lenin)
[personal profile] spamsink
Сегодня я исправил ошибку в собственном коде, которой практически ровно 10 лет. Интересно, что за всё это время она ни разу не проявлялась ни на примерах из реальной жизни, ни на стандартном пакете тестов, а была обнаружена при очередном раунде улучшения тестирования.

Даны N K-битных слагаемых. Каждый бит каждого слагаемого представлен булевской переменной (возможно, неуникальной, как, например, в случае размножения знака) или константой 0/1. Предложите алгоритм вычисления минимальной разрядности операции сложения для получения правильного результата разрядности K.

Пример: пусть требуется сложить два 8-битных слагаемых вида "aaaaaaab" и "cccccccd". Понятно, что реально складывать нужно всего несколько младших бит слагаемых, а старшие биты окончательного результата будут всегда равны старшему биту полученной суммы. Задача заключается в нахождении алгоритма вычисления оптимума для общего случая.
До исправления ошибки мой алгоритм давал правильный оптимальный ответ в подавляющем большинстве случаев, но иногда его результат был на 1 меньше, чем надо.

Date: 2016-03-22 05:14 am (UTC)
From: [identity profile] mi-ze.livejournal.com
Ничего не понимаю, но поздравляю! :)

Date: 2016-03-22 05:18 am (UTC)
From: [identity profile] arno1251.livejournal.com
Снимаю шляпу.

Date: 2016-03-22 06:31 am (UTC)
From: [identity profile] fatoff.livejournal.com
Пример: пусть требуется сложить два 8-битных слагаемых вида "aaaaaaab" и "cccccccd".

Почему биты такие fancy, и даже у них наблюдается полиморфизм?

Date: 2016-03-22 02:49 pm (UTC)
From: [identity profile] fatoff.livejournal.com
Ok, то переменные в строку.

Вид сущности изменяется, в то время, когда она несёт ту же функцию. a == 0, c == 0; b == 1, d == 1, или там вовсе другое понимание бита?
Edited Date: 2016-03-22 02:50 pm (UTC)

Date: 2016-03-22 09:13 am (UTC)
From: [identity profile] janatem.livejournal.com
Забавно, буквально на днях решал похожую задачу (только у меня вместо битов цифры-матрицы, а случай настолько частный, что решение тривиально).

Только условие требует уточнения. Можно считать, что мы берем универсальный случай (когда слагаемые пробегают все возможное значения) и вычисляем длину результата (она, очевидно, равна K+log N). Потом думаем, сколько старших разрядов результата можно отбросить в данном конкретном случае. Вопрос (уточнение формулировки): мы отбрасываем только нули или вообще константы?

Date: 2016-03-22 09:19 am (UTC)
From: [identity profile] janatem.livejournal.com
Если бит представляется именно переменной (а не функцией от одной или нескольких переменных), то я вижу очень простое решение (пригодное для обеих формулировок). В силу монотонности достаточно рассмотреть только экстремальные значения — когда все переменные равны 1 (во второй формулировке — два случая: все равны 0 и все равны 1). И смотреть, сколько старших битов равны нулю (смотреть, какие старшие биты не варьируются).

Date: 2016-03-22 03:58 pm (UTC)
From: [identity profile] janatem.livejournal.com
Да, я делал не то — искал количество битов, которых достаточно для представления результата.

В данном примере вроде достаточно трехбитового сумматора (с четырехбитовым результатом): tzyx := aab+ccd, тогда результат записывается как tzzzzzzyx. В общем случае пока не понял, как решать.

Date: 2016-03-22 04:48 pm (UTC)
From: [identity profile] janatem.livejournal.com
Теперь, когда я, наконец, усвоил условие задачи, могу его переформулировать с целью уточнения.

Для двух слагаемых в качестве вычислительного базиса можно использовать ровно один сумматор и любое количество операций, которые в схемотехнике считаются условно бесплатными: копирование переменных и размещение их где угодно. В этих условиях требуется минимизировать разрядность сумматора. В случае нескольких слагаемых, видимо, дается (N-1) сумматоров, и нужно минимизировать разрядность максимального из них (ну или, более точно, найти минимум в каком-то лексикографическом порядке).

Потому что если же не фиксировать количество сумматоров, то можно взять тучу элементарных одноразрядных сумматоров с переносом, поскольку они образуют логический базис.

А если нужно найти более прагматичное решение — минимизировать глубину схемы, используя произвольное количество сумматоров, то я могу предложить универсальное тролльское решение, которое будет побеждать при очень больших N и K.

Upd: я исправил "log N сумматоров" на "(N-1) сумматоров".
Edited Date: 2016-03-22 04:56 pm (UTC)

Date: 2016-03-22 09:22 am (UTC)
From: [identity profile] janatem.livejournal.com
Ой, я не ту задачу решал. ;)

Date: 2016-03-22 06:12 pm (UTC)
From: [identity profile] sab123.livejournal.com
Совсем оптимальный - наверное такой:

* сортируем все слагаемые по числу значащих бит
* берем два самых коротких, заменяем на одно, в котором бит будет как в более длинном из двух плюс один (поскольку сложение может вызвать перенос), вставляем это число на правильное место в сортированный список
* повторяем предыдущий пункт пока слагаемых в списке больше одного
* берем результат из последнего оставшегося элемента в списке

На всякий случай: слагаемые в приведенном примере будут "ab" и "cd", 2-битные (включая бит знака).
Edited Date: 2016-03-22 06:15 pm (UTC)

Date: 2016-03-22 08:06 pm (UTC)
From: [identity profile] sab123.livejournal.com
Для этого там "плюс один".

Если слагаемые со знаком, то должен возвращать 4, иначе бит знака испортится.

Но да, мой алгоритм субоптимально суммирует короткие значения.

Date: 2016-03-24 07:26 pm (UTC)
From: [identity profile] sab123.livejournal.com
Ну как бы из подсказок очевидно, что для пущей оптимальности суммировать надо не биты как таковые, а максимальные значения (плюс отдельно наличие бита знака).

Или ответ более умный?

Date: 2016-03-27 03:50 am (UTC)
From: [identity profile] kcmamu.livejournal.com
А что должно быть ответом для N-значного abbb...bbbc + deee...eeef? Константа или нечто зависящее от N?

Profile

spamsink: (Default)
spamsink

April 2026

S M T W T F S
   1234
567891011
1213 1415161718
19 202122232425
2627282930  

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Apr. 29th, 2026 04:17 pm
Powered by Dreamwidth Studios