Позвольте мне переформулировать вопрос, который, я думаю, вы задаете, чтобы, если он совсем не по теме, вы могли сообщить мне:
Для целого числа k и ряда (1, 2), (1, 3), ..., (1, k), (2, 3), (2, 4), ..., (2, k) , (3, 4), ..., (k - 1, k) и индекс n возвращают значение n-го члена этого ряда.
Вот простой алгоритм решения этой проблемы, который, вероятно, не является асимптотически оптимальным. Обратите внимание, что первая (k - 1) пара начинается с 1, следующая (k - 2) начинается с 2, следующая (k - 3) с 3 и т. д. Чтобы определить значение первого элемента в пары, вы можете продолжать складывать эти числа (k - 1) + (k - 2) + ..., пока не получите значение, которое больше или равно вашему индексу. Количество раз, которое вы могли бы сделать это, плюс один, дает вам ваше первое число:
E1 = (1, 2)
E2 = (1, 3)
E3 = (1, 4)
E4 = (1, 5)
E5 = (2, 3)
E6 = (2, 4)
E7 = (2, 5)
E8 = (3, 4)
E9 = (3, 5)
E10 = (4, 5)
Здесь k = 5. Чтобы найти первое число члена 8, мы сначала добавляем k - 1 = 4, что меньше восьми. Затем мы добавляем k - 2 = 3, чтобы получить 7, что все еще меньше восьми. Однако добавление k - 3 = 2 даст нам девять, что больше восьми, и поэтому мы останавливаемся. Мы сложили два числа вместе, поэтому первое число должно быть 3.
Как только мы узнаем, что такое первое число, вы можете довольно легко получить второе число. Выполняя шаг для получения первого числа, мы, по сути, перечисляем индексы пар, в которых изменяется первое число. Например, в приведенном выше случае у нас были ряды 0, 4, 7. Добавление одного к каждому из них дает 1, 5, 8, которые действительно являются первыми парами, начинающимися с чисел 1, 2 и 3 соответственно. . Как только вы узнаете, что такое первое число, вы также узнаете, где начинаются пары с этим числом, и поэтому вы можете вычесть индекс вашего числа из этой позиции. Это говорит вам с нулевым индексом, сколько шагов вы сделали вперед от этого элемента. Более того, вы знаете, каково второе значение этого первого элемента, потому что это единица плюс первый элемент, и поэтому вы можете сказать, что второе значение задается первым числом, плюс единица, плюс количество шагов, за пределами вашего индекса первая пара, начинающаяся с заданного числа. В нашем случае, поскольку мы смотрим на индекс 8 и знаем, что первая пара, начинающаяся с тройки, находится на позиции 8, мы получаем, что второе число равно 3 + 1 + 0 = 4, а наша пара — (3, 4) .
Этот алгоритм на самом деле довольно быстрый. Для любого k этот алгоритм выполняет не более k шагов, поэтому выполняется за O(k). Сравните это с наивным подходом сканирования всего, что занимает O(k2).
person
templatetypedef
schedule
19.01.2011