Page Summary
sab123.livejournal.com - (no subject)
lev.livejournal.com - (no subject)
mopexod.livejournal.com - (no subject)
excubitus.livejournal.com - (no subject)
kgeorgiy.livejournal.com - (no subject)
alikr.livejournal.com - (no subject)
juan-gandhi.livejournal.com - (no subject)
sab123.livejournal.com - (no subject)
kcmamu.livejournal.com - (no subject)
vgramagin.livejournal.com - (no subject)
juan-gandhi.livejournal.com - (no subject)
cema.livejournal.com - (no subject)
http://users.livejournal.com/_guard_/ - (no subject)
b00ter.livejournal.com - (no subject)
outputlogic.livejournal.com - (no subject)
Active Entries
Style Credit
- Style: Early Edition for Five AM by
Expand Cut Tags
No cut tags
no subject
Date: 2016-04-14 04:46 pm (UTC)no subject
Date: 2016-04-14 04:50 pm (UTC)no subject
Date: 2016-04-14 04:51 pm (UTC)no subject
Date: 2016-04-14 05:00 pm (UTC)no subject
Date: 2016-04-14 04:56 pm (UTC)no subject
Date: 2016-04-14 05:00 pm (UTC)no subject
Date: 2016-04-14 04:59 pm (UTC)no subject
Date: 2016-04-14 05:26 pm (UTC)Видимо, при использовании пирамидальной схемы с битовыми трюками, это можно сделать за O(n+b).
no subject
Date: 2016-04-14 06:56 pm (UTC)no subject
Date: 2016-04-14 06:59 pm (UTC)no subject
Date: 2016-04-14 07:46 pm (UTC)no subject
Date: 2016-04-14 08:45 pm (UTC)Впрочем, нет смысла.
Поразбираюсь еще.
no subject
Date: 2016-04-14 07:18 pm (UTC)В классическом виде алгоритм подсчета бит, который рассматривает слово как массив N однобитных чисел, делит на два массива по N/2 2-битных чисел, складывает и т.д. использует числовое пространство неэффективно. То есть, например, для 32-битного слова после
a = (a & 0x55555555) + ((a>>1) & 0x55555555)
каждое 2-битное число может хранить значения вплоть до 3, а на самом деле они окажутся не больше 2. Поэтому туда можно добавить еще одну половинку расслоенного числа, которая потом пойдет обрабатываться дальше "забесплатно". Если в процессоре есть достаточно регистров, можно выстроить целую пирамиду таких частичных результатов, которые будут добавляться по мере возможности. Xраниться будут что-нибудь типа 32-битного числа/массива (64 бит не надо, у нас нет столько чисел в массиве, и вообще верхнюю категорию достаточно log2(arraysize)), 16-битного, 8-битного, 4-битного, 2-битного, остающейся второй половинки 2-битного.
Но оптимальный порядок сложения будет запутанным, про него надо подумать отдельно.
no subject
Date: 2016-04-14 07:47 pm (UTC)no subject
Date: 2016-04-14 07:38 pm (UTC)no subject
Date: 2016-04-14 07:45 pm (UTC)no subject
Date: 2016-04-14 08:14 pm (UTC)no subject
Date: 2016-04-14 08:48 pm (UTC)no subject
Date: 2016-04-15 03:13 am (UTC)no subject
Date: 2016-04-14 09:19 pm (UTC)А сделать логарифмическую зависимость от числа бит в слове, наверное, можно по принципу, аналогичному подсчету бит, выстроив пирамидку. Примерно так для 8-битных слов:
for (l = 0; l < arraysize; l += 8) { for (k = 0..1) { for (j = 0..1) { for (i = 0..1) { index = i + j*2 + k*4; if (index >= arraysize) break; v = array[index]; inter1[0] += v & 0x55; inter1[1] += (v>>1) & 0x55; } inter2[0] += inter1[0] & 0x33; inter2[1] += (inter1[0]>>2) & 0x33; inter1[0] = 0; inter2[2] += inter1[1] & 0x33; inter2[3] += (inter1[1]>>2) & 0x33; inter1[1] = 0; } count[0] += inter2[0] & 0x7; count[1] += (inter2[0] >> 4) & 0x7; inter2[0] = 0; count[2] += inter2[1] & 0x7; count[3] += (inter2[1] >> 4) & 0x7; inter2[1] = 0; count[4] += inter2[2] & 0x7; count[5] += (inter2[2] >> 4) & 0x7; inter2[2] = 0; count[6] += inter2[3] & 0x7; count[7] += (inter2[3] >> 4) & 0x7; inter2[3] = 0; } }Ну, понятно, что развернутые присваивания можно свернуть в циклы.
А потом сумма будет Sum[for i =0..7](2*count[i]*(arraysize-count[i]))
Впрочем нет, при таких раскладах - не будет логарифмичности. Для логарифмичности нужно делать больше итераций по k и j, чем 2. Гм, надо подумать, сколько их можно делать.
no subject
Date: 2016-04-14 10:01 pm (UTC)a[0...N-1] -- вход b[0...log_2 N], c[0...log_2 N] -- рабочие массивы (сперва в них нули) прочее -- одиночные переменные for(i = 1; i <= N; i++) for(d = a[i-1], j = 0; 1; j++) // в среднем крутится раза два if(i & (1 << j)) { c[j] = d; break; } else { e = b[j] ^ c[j] ^ d; d = b[j] & (c[j] | d) | c[j] & d; b[j] = e; c[j] = 0; } ответ = 0; for(i = 0; i < разрядность; i++) { for(d = j = 0; j <= log_2 N; j++) d += (!!(b[j] & (1 << i)) + !!(c[j] & (1 << i)) << j; ответ += d * (N - d); }no subject
Date: 2016-04-23 11:42 pm (UTC)no subject
Date: 2016-04-14 08:33 pm (UTC)no subject
Date: 2016-04-14 08:46 pm (UTC)no subject
Date: 2016-04-14 08:46 pm (UTC)no subject
Date: 2016-04-14 11:40 pm (UTC)no subject
Date: 2016-04-14 11:47 pm (UTC)no subject
Date: 2016-04-15 10:46 pm (UTC)That is Levenshtein's, another guy's. Though they match here I think as there are replacements only, no insertions or deletions.
no subject
Date: 2016-04-15 07:56 am (UTC)s = 0 for j in [0...M]: k = 0 for i in [0...N]: k += numbers[i] % 2 numbers[i] = numbers[i] // 2 s += k * (N - k) # <-- число пар 1 и 0 в j-м разрядеno subject
Date: 2016-04-15 02:42 pm (UTC)no subject
Date: 2016-04-15 02:46 pm (UTC)no subject
Date: 2016-04-15 02:50 pm (UTC)no subject
Date: 2016-04-15 11:48 am (UTC)no subject
Date: 2016-04-15 02:44 pm (UTC)no subject
Date: 2016-04-23 07:45 am (UTC)В процессе прохождения массива, надо накапливать частичные суммы, а также делать ХOR всех накопленных пар по диагонали.
Вот пример для массива {a,b,c,d}
1. a^b
2. a^b^c, b^c
3. a^b^c^d, b^c^d, c^d
В процессе делаем XOR пар по диагонали
(a^b)^(b^c)=a^c
(a^b^c)^(b^c^d)=a^d
(b^c)^(c^d)=b^d
no subject
Date: 2016-04-23 11:43 pm (UTC)