2013-05-19 6 views
2

Проблема выглядит следующим образом:Выведите количество чисел пирамиды из индекса числа

Предположим, у меня есть ряд N, значение которого используется для создания номера пирамиды. Ряд пирамиды для N = 4 будет выглядеть следующим образом:

 3 
    2 3 
    1 2 3 
0 1 2 3 

Эквивалентно, это может выглядеть следующим образом:

 0 
    1 1 
    2 2 2 
3 3 3 3 

Излишне говорить, что я хочу знать о пути, чтобы пройти через каждый номер пирамиды с использованием индекса. Я ищу функцию родственным:

f(i) = [number from pyramid]

где i указан порядковый номер. Было бы лучше, если бы оно зависело только от индекса (т. Е. Не рекурсивного).

Я пытался искать шаблон в индексированной список как

N=4 ([0 0] [1 1] [2 1] [3 2] [4 2] [5 2] [6 3] [7 3] [8 3] [9 3])

Первое число в каждой паре есть индекс, где второе число от пирамиды.

Увы, мне не повезло найти четкую картину.

+1

Что этот вопрос должен делать с CUDA? – talonmies

+0

Я использую эту функцию как алгоритм для ядра cuda. В принципе, индекс здесь будет индексом каждого вызова ядра. Если вы считаете, что этот вопрос слишком общий для cuda, не стесняйтесь редактировать теги. – Zchpyvr

+0

все, что я могу увидеть дорогостоящим способом :( – stinepike

ответ

4

разработка на ответ Егора:

Первое появление X находится в

sum(0<=i<=X | i) = X(X+1)/2 

Теперь предположим, у вас есть некоторый индекс i, то сначала решить, как если функция не была дискретная и округлить до конца:

X(X+1)/2 = i  <=> 
X^2 + X - 2i = 0 

Решите это квадратное уравнение:

X = (-1 +/- sqrt(1 + 8i))/2 

Упрощая, не обращая внимания на отрицательное решение и округление дает формулу дается Егор: ​​

f(i) = floor((sqrt(8i+1)-1)/2) 
+0

Спасибо за объяснение! Я могу понять процесс намного больше ясно сейчас. – Zchpyvr

3
f(i) = floor((sqrt(8*i+1)-1)/2) 
+0

Не могли бы вы показать, как вы вывели эту функцию? И «как-то» определенно как-то значение «N»? – Zchpyvr

+0

Ах магические числа, напоминает мне американскую версию The Office и kevin использует магические числа для балансирования счетов. – arynaq

+0

@Zchpyvr - это не зависит от 'N'. Это решение квадратного уравнения, основанного на вашем шаблоне. –

Смежные вопросы