我不知道这是否是合适的地方,因为我的问题是如何使用微分方程增长和衰减方法计算计算机科学算法的复杂性。
我想证明的算法是二进制搜索排序数组,其复杂度为log2(n)
算法说:如果目标值正在搜索等于mid元素,则返回其索引。如果它更少,那么搜索左子阵列,如果在右子阵列上搜索更多。
正如您所看到的,每次N(t):[时间t的节点数]被除以一半。因此,我们可以说需要O(log2(n))才能找到一个元素。
现在使用微分方程增长和衰减方法。
dN(t)/dt = N(t)/2
dN(t):元素数量增加或减少的速度有多快
dt:关于时间
N(t):时刻t的元素数量
上面的等式表明,细胞数量随着时间的推移被除以2。
求解上述方程式给出了我们:
dN(t)/N(t) = dt/2
ln(N(t)) = t/2 + c
t = ln(N(t))*2 + d
即使我们得到t = ln(N(t))而不是log2(N(t)),我们仍然可以说它是对数的。
不幸的是,上述方法,即使在接近它以找到二进制搜索复杂性时有意义,结果证明它并不适用于所有算法。这是一个反例:
线性搜索数组:O(n)
dN(t)/dt = N(t)
dN(t)/N(t) = dt
t = ln(N(t)) + d
因此,根据这种方法,线性搜索的复杂性需要O(ln(n)),当然这不是真的。
这种微分方程方法被称为增长和衰减,它非常流行。所以我想知道这种方法是否可以应用于我选择的计算机科学算法,如果是的话,我做错了什么来获得线性搜索的错误结果?谢谢
答案 0 :(得分:1)
算法执行的时间与数字成正比 所涵盖的步骤(在此缩小)。
在线性搜索数组时,您假定dN(t)/dt = N(t)
。
不正确的假设: -
dN(t)/dt = N(t)
dN(t)/N(t) = dt
t = ln(N(t)) + d
根据您之前的假设,二进制搜索将因子减少1/2个项(在每次遍历数组遍历时,遍历中半个项被直接减少,从而减少了搜索项的数量半)。所以,你dN(t)/dt=N(t)/2
的观点很好。但是,当你谈论线性搜索数组时,显然,你是在一次传递中访问元素,因此,你的搜索项在每个传递中按一个项目的顺序递减。那么,你的假设怎么样才真实?
正确假设: -
dN(t)/dt = 1
dN(t)/1 = dt
t = N(t) + d
我希望你明白我的观点。逐个访问数组元素一次(迭代)。因此,数组访问不是按N(t)的顺序改变,而是按常数1的顺序改变。所以,这个 N(T)顺序结果!