C# 如何使该函数在恒定时间内进行处理?
我需要找到这个无穷级数的第n项:1,2,2,3,3,3,4,4,4,4 你能给我一个这个任务的恒定时间函数吗C# 如何使该函数在恒定时间内进行处理?,c#,time-complexity,C#,Time Complexity,我需要找到这个无穷级数的第n项:1,2,2,3,3,3,4,4,4,4 你能给我一个这个任务的恒定时间函数吗 int i = 1; while(true) { if(i = n) //do things and exit the loop i++; } 我认为这不是一个固定时间函数…编辑 在读了更多的评论之后,我似乎误解了这个问题 如果您想在固定时间内找到数组第位的n项,那么答案很简单:x[n],因为数组访问是固定时间的。但是,如果出于某种原因,您正在使用访问时间不恒
int i = 1;
while(true)
{
if(i = n)
//do things and exit the loop
i++;
}
我认为这不是一个固定时间函数…编辑
在读了更多的评论之后,我似乎误解了这个问题
如果您想在固定时间内找到数组第位的n
项,那么答案很简单:x[n]
,因为数组访问是固定时间的。但是,如果出于某种原因,您正在使用访问时间不恒定的容器(例如,链表),或者不想在数组中查找值,则必须使用公式来找到答案
算术级数告诉我们,i
th唯一项的位置n
n = i * (i - 1) / 2
所以我们只需要求解i
。使用二次公式,放弃无意义的负期权,我们得到:
i = Math.Floor( (1 + Math.Sqrt(1 + 8 * n)) / 2)
原始响应
我假设你在寻找第n个唯一项的位置,因为否则问题很小
听起来像是第n个唯一术语的第一次出现。即,第n个唯一术语的位置为:
n * (n - 1) / 2
根据我对这个问题的理解,这更像是一个数学问题,而不是一个编程问题 如果问题是: 给定一个由1的1个副本、2的2个副本、3的3个副本组成的无限系列。。。n份,本系列的第k个值是多少? 现在处理这个问题的第一条线索是有1+2+3…+第一次出现n+1之前的n个值。具体而言,在n+1或(n)(n-1)/2之前存在(前n个数字的总和)值 现在设置(n)(n-1)/2=k。相乘并合理化为n^2-n-2k=0。用二次方程求解,得到n=(1+sqrt(1+8k))/2。这一层给出了n的完整拷贝数,幸运的是,给定了从零开始的索引,这一层给出了数组中第k个点的值 这意味着你在c#中的最终答案是
return(int)Math.Floor((1+Math.Sqrt(1+8*k))/2)代码>
给定非零基索引
return(int)数学层((1+Math.Sqrt(-7+8*k))/2)代码>公共静态长Foo(长索引)
{
如果(指数<0)
{
抛出新的IndexOutOfRangeException();
}
long nowNum=0;
长指数=0;
做
{
nowIndex+=nowNum;
nowNum++;
}而(nowIndex
返回x[n-1]代码>恒定时间足够你使用吗?澄清一下,数组是否总是包含一个“1”、两个“2”和三个“3”等等?哦,你想要第n个唯一项吗?我想我们都在关注这个数组的“数组”部分,这不是他的问题。我想问题是,“我怎样才能确定在O(1)时间内遵循这种模式的数字序列的第n项?”我不知道数组的长度或其他任何东西。我只知道数组的模式(例如:数组将有1个值为1的项,2个值为2的项,3i为v3,…,10i为v10)+1假设值始终遵循该模式,他所说的“项”是指值,那么是的,如果他想要给定序列的第n个唯一项,那么答案是返回n代码>…不,我想知道索引n处的值,而不知道孔阵列,只知道孔阵列的模式array@HansZ仅因为数组从1开始。遵循从任意数字开始的相同模式会使更有趣question@ngmiceli返回n+k-1//k是起始编号
public static long Foo(long index)
{
if (index < 0)
{
throw new IndexOutOfRangeException();
}
long nowNum = 0;
long nowIndex = 0;
do
{
nowIndex += nowNum;
nowNum++;
} while (nowIndex < index);
return nowNum;
}