LINUX.ORG.RU

История изменений

Исправление bugfixer, (текущая версия) :

В двумерном нулей чуть меньше половины, дальше с ростом D все становится гораздо хуже. При N=10 вот такая картина маслом:

Возможно мы общаемся на слишком разных языках: в итоге Вы пришли к тому же что я сразу сказал - vector<double> плюс функция дающая позицию в векторе по координате в N-мерном пространстве.

Двумерный случай вообще тривиален, и никаких табличек даже не надо. Например:

int calcPos(int x, int y)
{
   int diag = x + y;
   int prevSize = diag * (diag + 1) / 2;
   return prevSize + x;
}

Ну это просто чтобы идею продемонстрировать, не претендую ;)

Мне кажется, если подумать, то на N-мерный случай оно тоже обобщается, и самое главное - остаётся O(1).

Исходная версия bugfixer, :

В двумерном нулей чуть меньше половины, дальше с ростом D все становится гораздо хуже. При N=10 вот такая картина маслом:

Что-то в этой математике не так: я не вижу почему overhead по памяти решения «в лоб» растёт быстрее чем 2^(D-1). Либо Вы чего-то не договариваете и хранить нужно не весь «треугольник».

Ну и возможно мы общаемся на слишком разных языках: в итоге Вы пришли к тому же что я сразу сказал - vector<double> плюс функция дающая позицию в векторе по координате в N-мерном пространстве.

Двумерный случай вообще тривиален, и никаких табличек даже не надо. Например:

int calcPos(int x, int y)
{
   int diag = x + y;
   int prevSize = diag * (diag + 1) / 2;
   return prevSize + x;
}

Ну это просто чтобы идею продемонстрировать, не претендую ;)

Мне кажется, если подумать, то на N-мерный случай оно тоже обобщается, и самое главное - остаётся O(1).