我已经为两个算法提供了解决相同问题的运行时函数。让我们说 -
For First algorithm:T(n) = an + b
(n中的线性)
对于第二个算法:T(n) = xn^2 + yn + z
(n中的二次方)
每本书都说线性时间比二次更好,当然它更大n
(有多大?)。我觉得基于常量a
,b
,x
,y
和z
来定义大变化。
如果我们应该从algo2切换到algo1,反之亦然(请问是仅通过实验找到?),请告诉我如何找到n
的阈值。如果有人能解释如何在专业软件开发组织中完成它,我将不胜感激。
我希望我能解释一下我的问题,如果没有,请告诉我。
提前感谢您的帮助。
P.S。 - 实现将使用Java,并且预计将在各种平台上运行。我发现很难用数学方法估算常数a
,b
,x
,y
和z
。我们如何解决专业软件开发中的这种困境?
答案 0 :(得分:5)
我总是使用O(n),对于较小的n,它可能会较慢,但无论如何n都很小。如果代码尝试为每个数据集选择最佳算法,那么代码中增加的复杂性将使调试和维护变得更加困难。
答案 1 :(得分:2)
在所有具有实际意义的案例中,无法估计固定因素。即使你可以,也没有用,除非你还能预测未来输入的大小将如何发展。
除非其他因素也起作用(例如,内存消耗),否则线性算法应始终是首选。如果实际性能不可接受,那么您可以寻找替代方案。
答案 2 :(得分:1)
只需使用预期的输入大小来分析代码,如果您还添加了最坏的情况输入,那就更好了。不要浪费你的时间来解决这个方程式,这可能是最不可能的。
一般来说,你可以预期O(n 2 )从大小为n = 10000时明显慢于O(n)。明显更慢意味着任何人都会注意到它更慢。根据算法的复杂程度,您可能会注意到较小的n的差异。
重点是:基于时间复杂度判断算法允许我们忽略一些对于最大输入大小的任何输入而言显然太慢的算法。但是,根据输入数据的域,某些具有较高复杂度的算法实际上会比其他算法具有更低的时间复杂度。
答案 3 :(得分:1)
你问的是数学问题,而不是编程问题。
NB我假设x是正面的......
你需要知道什么时候
an+b < xn^2 + yn + z
即
0 < xn^2 + (y-a)n + (z-b)
您可以将其插入标准方程式中以求解正方形http://en.wikipedia.org/wiki/Quadratic_equation#Quadratic_formula
然后取大0,然后你知道所有大于此的值(因为x为正)O(n ^ 2)更大。
你最终得到一个涉及x,y,a,z和b的可怕方程,我非常怀疑对你有用。
答案 4 :(得分:1)
试验。我还遇到了一种情况,我们有代码在实例列表中查找特定实例。原始代码做了一个简单的循环,几年来运行良好。 有一次,我们的一位客户记录了性能问题。在他的情况下,该列表包含数千个实例,查找速度非常慢。
我的开发人员的解决方案是在列表中添加散列,这确实解决了客户的问题。然而,现在其他客户开始抱怨,因为他们突然遇到了性能问题。似乎在大多数情况下,列表只包含一些(大约10个)条目,并且散列比仅循环遍历列表要慢得多。
最终的解决方案是测量两种备选方案的时间(循环与散列)并确定循环变得比散列慢的点。在我们的例子中,这大约是70.所以我们改变了算法:
在您的情况下,解决方案可能类似。
答案 5 :(得分:0)
当我们为大规模目的编写算法时,我们希望它对大'n'表现良好。在您的情况下,取决于a, b, x, y and z
,第二种算法虽然可以更好地执行二次运算。但无论a, b, x, y and z
的值是多少,都会有n
的某个下限(比如说n0
),超过该下限,第一个算法(线性一个)总是比第二个快。
If f(n) = O(g(n))
then it means for some value of n >= n0 (constant)
f(n) <= c1*g(n)
So
if g(n) = n,
then f(n) = O(n)
因此,请根据您对n