|
|
|
скалярное умножение массива на побитовый вектор, принимающий все возможные значения
|
|||
|---|---|---|---|
|
#18+
Итак, есть массив [ a0 a1 a2... an ], и есть вторые массив такой же длины, но его элементы -- единицы или нули. [ 0 0 0... 0 ] [ 1 0 0... 0 ] [ 0 1 0... 0 ] ... [ 1 1 1... 1 ] Понятно, что число вторых массивов 2 ^ N. Мне надо достаточно быстро получить всевозможные числа, получающиеся путём скалярного произведения первого массива на всевозможные вторые массивы. Делать напрямую мне видится слишком медленным, как ускорить? Самое простое, что приходит на ум -- это вычислять текущее скалярное произведение через предыдущее, вроде должно быстрее получатся, исходя из тех соображений, что i-й элемент будет "мигать" в 2 раза реже (i - 1) - го. До конца ещё не додумал, возможно ли это. Буду рад, если кто-нибудь поделится более быстрым способом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2013, 22:50 |
|
||
|
скалярное умножение массива на побитовый вектор, принимающий все возможные значения
|
|||
|---|---|---|---|
|
#18+
ayvangoИтак, есть массив [ a0 a1 a2... an ], и есть вторые массив такой же длины, но его элементы -- единицы или нули. [ 0 0 0... 0 ] [ 1 0 0... 0 ] [ 0 1 0... 0 ] ... [ 1 1 1... 1 ] Понятно, что число вторых массивов 2 ^ N. Мне надо достаточно быстро получить всевозможные числа, получающиеся путём скалярного произведения первого массива на всевозможные вторые массивы. Делать напрямую мне видится слишком медленным, как ускорить? Самое простое, что приходит на ум -- это вычислять текущее скалярное произведение через предыдущее, вроде должно быстрее получатся, исходя из тех соображений, что i-й элемент будет "мигать" в 2 раза реже (i - 1) - го. До конца ещё не додумал, возможно ли это. Буду рад, если кто-нибудь поделится более быстрым способом. Так... что такое скалярное произведение векторов вычитал 10 минут назад из википедии (что бы не ругали, если отвечу не в тему )... Итак, если правильно понял, при данных условия в итоге мы должны получить всевозможные суммы элементов первого массива. А значит, первым что приходит на ум - это устройство закономерностей двоичной системы. если мы рассмотрим такой набор двоичных чисел: 0000 0001 0010 0011 0100 0101 0110 ... (думаю достаточно) меняя первый флаг мы получаем 2 варианта (вкл, выкл). задействовав второй влаг, мы получаем тоже 2 варианта, но с задействованным вторым флагом задействовав третий флаг мы получаем 4 варианта идентичный предыдущим, но с задействованным третим флагом и т.д. А значит, что бы просчитать следующую порцию скалярных умножений, нам достаточно взять все предыдущие результаты и добавить к ним новый элемент. По-моему это самый лёгкий способ (если я правильно понял задачу) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2013, 01:09 |
|
||
|
скалярное умножение массива на побитовый вектор, принимающий все возможные значения
|
|||
|---|---|---|---|
|
#18+
А значит, что бы просчитать следующую порцию скалярных умножений, нам достаточно взять все предыдущие результаты и добавить к ним новый элемент Кстати, простой и понятный способ, спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2013, 11:41 |
|
||
|
скалярное умножение массива на побитовый вектор, принимающий все возможные значения
|
|||
|---|---|---|---|
|
#18+
ayvango, какая-то надуманная постановка. Если у тебя стоит задача - быстро излекать нужное скалярное произведение - то кешируй расчитанные значения. Если надо просто перебрать всё что можно то это похоже на обход двоичного дерева. Спускаешся вниз - прибавляешь листик. Поднимаешся вверх вычитаешь. Для N-кратных каким-то хардверным константам и для невысоких max значений произведения можно запилить наверное всякие SSЕ операции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2013, 12:50 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=38297141&tid=1341777]: |
0ms |
get settings: |
10ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
171ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
32ms |
get tp. blocked users: |
1ms |
| others: | 231ms |
| total: | 482ms |

| 0 / 0 |
