Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 算法复杂度的比较_Algorithm_Data Structures_Time Complexity_Big O_Notation - Fatal编程技术网

Algorithm 算法复杂度的比较

Algorithm 算法复杂度的比较,algorithm,data-structures,time-complexity,big-o,notation,Algorithm,Data Structures,Time Complexity,Big O,Notation,我目前正在学习大O符号的运行时间和摊销时间 我有以下问题: 两种基于分治原理的算法可用于解决复杂度为n的问题。 算法1将问题划分为18个小问题,需要O(n^2)运算将子解组合在一起。 算法2将问题划分为64个小问题,需要O(n)运算将子解组合在一起 哪种算法更好更快(对于大n) 我猜第二种算法更好,因为它需要更少的时间(O(n)比O(n^2)快)。 我的猜测正确吗 小问题的数量对算法的速度有影响吗?还是它总是需要一个恒定的时间?在这种情况下,它可能不是一个陷阱,但最好小心,可能会发生一些违反直觉

我目前正在学习大O符号的运行时间和摊销时间

我有以下问题:

两种基于分治原理的算法可用于解决复杂度为n的问题。 算法1将问题划分为18个小问题,需要O(n^2)运算将子解组合在一起。 算法2将问题划分为64个小问题,需要O(n)运算将子解组合在一起

哪种算法更好更快(对于大n)

我猜第二种算法更好,因为它需要更少的时间(O(n)比O(n^2)快)。 我的猜测正确吗


小问题的数量对算法的速度有影响吗?还是它总是需要一个恒定的时间?

在这种情况下,它可能不是一个陷阱,但最好小心,可能会发生一些违反直觉的事情。如果发生这种情况,陷阱主要是这样的:子问题比生成的子问题小多少

例如,对于这里的算法1来说,如果子问题的大小是当前问题的1/5或更小(可能意味着它们的大小是1/18?),则总体时间复杂度是O(n²)。但是如果问题的大小只下降了4倍,我们已经达到了O(n2.085),如果域只被切成一半(但仍然是18倍),那么它将一直上升到O(n4.17)

同样,对于算法2,如果它将一个程序划分为64个子问题,每个子问题的大小为1/64,则总体时间复杂度将为O(n logn)。但是如果子问题稍微大一点,比如说1/63的大小,我们立即在层次结构中向上移动一整步,直到O(n1.004)——指数中的一个微小常数,但不再是对数线性的。使问题的大小变为1/8,复杂性变为二次型,如果我们在每一步仅将问题的大小减半,那么问题的大小将一直增加到O(n6)!另一方面,如果问题缩小得稍微快一点,比如说1/65的大小,那么复杂性立即不再是对数线性的,但这次是另一个方向,变成O(n)

因此,它可以走任何一条路,这取决于子问题收缩的速度,这在您的问题陈述中没有明确提到。希望很明显,仅仅比较“每个步骤的附加处理”是不够的,总的来说是不够的。每一步大量加工是一个无法克服的缺点,但如果“收缩系数”比“扇出系数”小,则每一步只有少量加工是一个很容易失去的优点.

用于分治算法的渐近分析,它将为您提供一种获得直接答案而不是猜测的方法

T(n) = aT(n/b) + f(n)   
其中,T是主要问题,n是输入集,a是划分成的子问题的数量,b是每个子问题的输入集减少的因子,f(n)是将子问题拆分并组合在一起的函数。从这里我们可以找到c:

f(n) is O(n^c)
例如,在您的示例算法1中,c=2,在算法2中,c=1。算法1和算法2的值a分别为18和64。下一部分是您的问题缺少适当的信息,因为没有提供b换句话说,要得到一个清晰的答案,您需要知道每个子问题将原始输入分割的因子。

if c < logb(a) then T(n) is O(n^logb(a))
if c = logb(a) then T(n) is O(n^c log(n))
if c > logb(a) then T(n) is O(f(n))
如果clogb(a),那么T(n)是O(f(n))

先天的
,是的。当n-->无穷大时,第二个更好。但是,在某些情况下,即使对于相当大的“n”,第一个也可能更好。这取决于所涉及的常数。假设算法2在n->无穷大时更好是不正确的。为了准确确定哪种算法更快,您缺少了harold和我在下面讨论的信息。