如何找到一个系列的公式
How to find the formula of a series
我最近遇到了一个问题。
问题=>
给定 n,k,我们必须找出序列中第 k 个索引处的数字。
(未给出系列我们必须逻辑生成它以找到系列中的第 k 个元素)
系列图案请看例子
(索引是从 1 开始而不是从 0 开始)。
例子=>
n=4, k=5
series = 1, 2, 3, 4, 1, 2, 3, 1, 2, 1
answer = 1 (because it is at 5th index, index is from 1).
示例=>
n=5, k=8
series = 1, 2, 3, 4, 5, 1, 2, 3, 4, 1, 2, 3, 1, 2, 1
answer=3 (because 3 is at 8th index).
我想在 O(1) 时间复杂度内执行此操作。是否有任何公式或其他方法可以做到这一点?
我不知道那里可能有公式,但你可能应该在数学论坛上问这个问题。
我会做以下几行:
while(K > N) {
K= K - N
N=N-1;
}
while 停止时,这里的 K 将是您的答案。它不是公式,但应该比生成数组和获取第 k 个索引更快。
您的系列可以按三角形组织,例如 n = 4:
1 2 3 4 1 2 3 4
1 2 3 5 6 7
1 2 8 9
1 10
(值在左边,索引 k 在右边。索引 k 必须在 [1; N] 中,其中 N = n · (n + 1) / 2]。)你可以反转三角形:
1 10 0
1 2 8 9 1 2
1 2 3 5 6 7 3 4 5
1 2 3 4 1 2 3 4 6 7 8 10
最右边是倒序的从零开始的索引。每行第 i 个数是三角数 T(i) = i · (i + 1) / 2.
你可以用
找到倒三角的第i行(从零开始)
i = floor(−½ + math.sqrt(½ + 2·(N − k)))
该行的第一个索引是
T=T(i)=i·(i+1)/2
从起始索引 T 和倒三角形中的搜索索引 N − k,您可以得到您的值,但您必须从该行的末尾开始计数:
res(n, k) = i + 1 − (N − k − T)
很抱歉,由于反复颠倒和从基于一的索引切换到基于零的索引,反之亦然,解释有点混乱。下面是一些 Python 实现上述内容的代码:
def value(n, k):
N = n * (n + 1) // 2 # length of series
K = N - k # inverted index, zero-based
i = int(-1 + math.sqrt(1 + 8*K)) // 2
T = i * (i + 1) // 2 # row and its starting index
return i + 1 - (K - T)
我最近遇到了一个问题。
问题=>
给定 n,k,我们必须找出序列中第 k 个索引处的数字。 (未给出系列我们必须逻辑生成它以找到系列中的第 k 个元素)
系列图案请看例子
(索引是从 1 开始而不是从 0 开始)。
例子=>
n=4, k=5
series = 1, 2, 3, 4, 1, 2, 3, 1, 2, 1
answer = 1 (because it is at 5th index, index is from 1).
示例=>
n=5, k=8
series = 1, 2, 3, 4, 5, 1, 2, 3, 4, 1, 2, 3, 1, 2, 1
answer=3 (because 3 is at 8th index).
我想在 O(1) 时间复杂度内执行此操作。是否有任何公式或其他方法可以做到这一点?
我不知道那里可能有公式,但你可能应该在数学论坛上问这个问题。
我会做以下几行:
while(K > N) {
K= K - N
N=N-1;
}
while 停止时,这里的 K 将是您的答案。它不是公式,但应该比生成数组和获取第 k 个索引更快。
您的系列可以按三角形组织,例如 n = 4:
1 2 3 4 1 2 3 4
1 2 3 5 6 7
1 2 8 9
1 10
(值在左边,索引 k 在右边。索引 k 必须在 [1; N] 中,其中 N = n · (n + 1) / 2]。)你可以反转三角形:
1 10 0
1 2 8 9 1 2
1 2 3 5 6 7 3 4 5
1 2 3 4 1 2 3 4 6 7 8 10
最右边是倒序的从零开始的索引。每行第 i 个数是三角数 T(i) = i · (i + 1) / 2.
你可以用
找到倒三角的第i行(从零开始)i = floor(−½ + math.sqrt(½ + 2·(N − k)))
该行的第一个索引是
T=T(i)=i·(i+1)/2
从起始索引 T 和倒三角形中的搜索索引 N − k,您可以得到您的值,但您必须从该行的末尾开始计数:
res(n, k) = i + 1 − (N − k − T)
很抱歉,由于反复颠倒和从基于一的索引切换到基于零的索引,反之亦然,解释有点混乱。下面是一些 Python 实现上述内容的代码:
def value(n, k):
N = n * (n + 1) // 2 # length of series
K = N - k # inverted index, zero-based
i = int(-1 + math.sqrt(1 + 8*K)) // 2
T = i * (i + 1) // 2 # row and its starting index
return i + 1 - (K - T)