Algorithm 算法分析:基于RNG的递归函数的预期运行时间

Algorithm 算法分析:基于RNG的递归函数的预期运行时间,algorithm,recursion,analysis,Algorithm,Recursion,Analysis,我对一个程序的运行时分析有些困惑,这个程序有依赖于RNG的递归调用。(随机生成的数字) 让我们从伪代码开始,然后我将讨论到目前为止我所想到的与此相关的内容 Func1(A, i, j) /* A is an array of at least j integers */ 1 if (i ≥ j) then return (0); 2 n ← j − i + 1 ; /* n = number of elements from i to j */ 3 k ← Random(n); 4 s ← 0

我对一个程序的运行时分析有些困惑,这个程序有依赖于RNG的递归调用。(随机生成的数字)

让我们从伪代码开始,然后我将讨论到目前为止我所想到的与此相关的内容

Func1(A, i, j)
/* A is an array of at least j integers */

1 if (i ≥ j) then return (0);
2 n ← j − i + 1 ; /* n = number of elements from i to j */
3 k ← Random(n);
4 s ← 0; //Takes time of Arbitrary C

5 for r ← i to j do
6 A[r] ← A[r] − A[i] − A[j]; //Arbitrary C
7 s ← s + A[r]; //Arbitrary C
8 end

9 s ← s + Func1(A, i, i+k-1); //Recursive Call 1
10 s ← s + Func1(A, i+k, j); //Recursive Call 2
11 return (s);
好的,现在让我们开始我到目前为止尝试过的数学。在这里我尽量不要太迂腐,因为这只是对预期运行时间的粗略估计分析

首先,让我们考虑最坏的情况。请注意,K=Random(n)必须至少为1,最多为n。因此,最坏的情况是选择K=1。这导致总运行时间等于T(n)=cn+T(1)+T(n-1)。这意味着总的来说,它需要大约cn^2的总时间(如果您对递归关系感到困惑或生疏,您可以使用Wolfram来解决递归关系,尽管这是一个相当简单的问题)

现在,我有点困惑了。对于预期运行时间,我们必须根据随机数K的概率进行假设。因此,我们必须将不同K值的所有可能运行时间加上各自的概率相加。根据引理/直觉逻辑:任意一个随机生成的k,k在1到n之间,其概率等于1/n

因此,(在我看来/分析中)预期运行时间是:

ET(n)=cn+(1/n)*(ET(k-1)+ET(n-k)之和(从k=1到n-1)

让我解释一下。cn只是运行i到j的循环。这是cn估计的。总和表示k的所有可能值。(1/n)乘以这个总和是因为任何一个k的概率是(1/n)求和中的项表示Func1递归调用的运行时间。左侧的第一项取ET(k-1),因为此递归调用将从i循环到k-1(大致为ck),然后可能再次调用Func1。第二个是第二个递归调用的表示,它将从i+k循环到j,也由n-k表示


在扩展求和后,我们可以看到整个函数ET(n)的阶数为n^2。但是,作为一个测试用例,插入k=(n/2)会使Func 1的总运行时间大约为nlog(n)。这就是我感到困惑的原因。如果估计的运行时间为n^2级,这怎么可能?我是否在考虑为k插入n/2的“好”案例?或者我在某种程度上对k的想法是错误的

预期的时间复杂度为
ET(n)=O(nlogn)
。以下是我自己推导的数学证明,如有错误请告知:-

ET(n) = P(k=1)*(ET(1)+ET(n-1)) + P(k=2)*(ET(2)+ET(n-2)).......P(k=n-1)*(ET(n-1)+ET(1)) + c*n

As the RNG is uniformly random  P(k=x) = 1/n for all x

hence ET(n) = 1/n*(ET(1)*2+ET(2)*2....ET(n-1)*2) + c*n

ET(n) = 2/n*sum(ET(i)) + c*n i in (1,n-1)

ET(n-1) = 2/(n-1)*sum(ET(i)) + c*(n-1) i in (1,n-2)

sum(ET(i)) i in (1,n-2) = (ET(n-1)-c*(n-1))*(n-1)/2

ET(n) = 2/n*(sum(ET(i)) in (1,n-2) + ET(n-1)) + c*n

ET(n) = 2/n*((ET(n-1)-c*(n-1))*(n-1)/2+ET(n-1)) + c*n

ET(n) = 2/n*((n+1)/2*ET(n-1) - c*(n-1)*(n-1)/2) + c*n

ET(n) = (n+1)/n*ET(n-1) +  c*n - c*(n-1)*(n-1)/n

ET(n) = (n+1)/n*ET(n-1) + c

solving recurrence

ET(n) = (n+1)ET(1) + c + (n+1)/n*c + (n+1)/(n-1)*c + (n+1)/(n-2)*c.....


ET(n) = (n+1) + c + (n+1)*sum(1/i) i in (1,n)


sum(1/i) i in (1,n) = O(logn)


ET(n) = (n+1) + c + (n+1)*logn


ET(n) = O(nlogn)

这是一个计算机科学问题,并不是一个很适合的问题。考虑将这个问题迁移到(通过一个慢化剂标志),或者(因为这个问题还没有答案)删除和转发。(除了更专业的读者之外)的另一个好处是,您可以使用数学格式来提高问题的可读性。如果
Random(n)
返回[1,n]中的数字,最坏的情况是递归根本不会终止。如果每次选择
k
作为
n
,第9行中的递归调用将具有与原始调用相同的
i
j
值。您可能需要查找具有相同行为的快速排序分析(没有上一条注释中提到的问题)。“在扩展求和时,我们看到整体函数ET(n)的阶数为n^2。”:我不同意。你能扩展你的思维吗?我之前也做过类似的事情,我认为这至少是正确的方向。把所有的东西都放在求和的形式中,简化和扩展。