C# 如何使该函数在恒定时间内进行处理?

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],因为数组访问是固定时间的。但是,如果出于某种原因,您正在使用访问时间不恒

我需要找到这个无穷级数的第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]
,因为数组访问是固定时间的。但是,如果出于某种原因,您正在使用访问时间不恒定的容器(例如,链表),或者不想在数组中查找值,则必须使用公式来找到答案

算术级数告诉我们,
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;
        }