Ваше ядро l oop все не так. Если вы хотите, чтобы sum[i]
содержал значения для данного пути, вам нужно трактовать i
, как если бы это был путь через матрицу.
В общем, обрабатывать i
как число в базе n (= 2 для вашего примера). Это означает, что
i = idx_1 * n ^ (n-1) + idx_2 * n ^ (n-2) + ... + idx_n
Вы можете восстановить различные индексы путем многократного деления на n и взятия остатка:
for(uint64_t i=0;i<power;i++){
sum[i] = 0;
uint64_t encoded_index = i;
for (size_t j = 0; j < n; j++) {
uint64_t index_j = encoded_index % n;
encoded_index /= n;
sum[i] += hist[j][index_j];
}
}
И, конечно, этот трюк работает, только если n * n <2 ** 64 (так как uint64_t равен 64 битам). Для более общего подхода см. Мой ответ на ваш другой вопрос. </p>