Java 常数未知时在O(n)和O(n^2)之间选择正确算法

Java 常数未知时在O(n)和O(n^2)之间选择正确算法,java,algorithm,Java,Algorithm,我已经给出了解决同一问题的两个算法的运行时函数。比方说- 对于第一种算法:T(n)=an+b(n中为线性) 对于第二种算法:T(n)=xn^2+yn+z(n中的二次方) 每本书都说,时间上的线性比二次好,当然,它适用于更大的n(多大?)。我觉得根据常量a、b、x、y和z可以定义大的变化 当我们从algo2切换到algo1,或者从algo2切换到algo1时,请告诉我如何找到n的阈值(是否仅通过实验找到?)。如果有人能解释一下专业软件开发组织是如何做到这一点的,我将不胜感激 我希望我能解释我的问题

我已经给出了解决同一问题的两个算法的运行时函数。比方说-

对于第一种算法:
T(n)=an+b
(n中为线性)
对于第二种算法:
T(n)=xn^2+yn+z
(n中的二次方)

每本书都说,时间上的线性比二次好,当然,它适用于更大的
n
(多大?)。我觉得根据常量
a
b
x
y
z
可以定义大的变化

当我们从algo2切换到algo1,或者从algo2切换到algo1时,请告诉我如何找到
n
的阈值(是否仅通过实验找到?)。如果有人能解释一下专业软件开发组织是如何做到这一点的,我将不胜感激

我希望我能解释我的问题,如果没有请让我知道

提前感谢你的帮助


另外,该实现将采用Java语言,并有望在各种平台上运行。我发现很难从数学上估计常数
a
b
x
y
z
。在专业软件开发中,我们如何解决这个难题?

只需使用预期的输入大小来分析代码,如果您还添加了最坏情况下的输入,那就更好了。不要浪费你的时间去解这个方程,这在一开始可能是不可能的

通常,从n=10000的大小来看,可以预期O(n2)比O(n)慢得多。显著的慢意味着任何人都能注意到它的慢。根据算法的复杂度,您可能会注意到较小n处的差异


关键是:基于时间复杂度判断一个算法可以让我们忽略一些算法,这些算法对于最大输入大小的任何输入来说显然太慢了。但是,根据输入数据的域,某些复杂度较高的算法实际上会优于其他时间复杂度较低的算法。

我总是使用O(n)一,对于较小的n,它可能会较慢,但n无论如何都很小。如果要为每个数据集选择最佳算法,代码中增加的复杂性将使调试和维护变得更加困难。

不可能在所有实际情况下都估计固定因子。即使你能做到,除非你也能预测未来投入的规模将如何演变,否则它也不会有帮助


除非其他因素(如内存消耗)也起作用,否则应始终首选线性算法。如果实际表现不可接受,你可以寻找替代方案。

你问的是数学问题,而不是编程问题

注意,我假设x是正的

你需要知道什么时候

an+b < xn^2 + yn + z
an+b

0
您可以将其插入到求解二次方程的标准方程中

取较大的0,然后你知道对于所有大于这个值的值(x为正),O(n^2)都较大


你最终得到了一个可怕的方程,包括x、y、a、z和b,我很怀疑它对你有什么用处。

当我们为大规模目的编写算法时,我们希望它对大型“n”有良好的性能。在您的情况下,根据
a、b、x、y和z
,第二个算法可能会执行得更好,尽管它是二次的。但是无论
a、b、x、y和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)
如果f(n)=O(g(n))
那么它意味着对于某些值n>=n0(常数)

f(n)实验。我还遇到了这样一种情况:我们有代码在实例列表中查找特定实例。最初的代码做了一个简单的循环,这在几年内运行良好。 有一次,我们的一位客户记录了一个性能问题。在他的例子中,列表包含数千个实例,查找速度非常慢

我的开发伙伴的解决方案是将哈希添加到列表中,这确实解决了客户的问题。然而,现在其他客户开始抱怨,因为他们突然出现了性能问题。在大多数情况下,列表似乎只包含几个(大约10个)条目,而散列比在列表上循环慢得多

最终的解决方案是测量两个备选方案(循环与散列)的时间,并确定循环比散列慢的点。在我们的案例中,这大约是70。所以我们改变了算法:

  • 如果列表中包含的项目少于70项,我们将循环
  • 如果列表包含超过70个项目,我们将散列

解决方案可能与您的情况类似。

在特定场景中,将实际使用的运行时间最小化的解决方案会更好。换句话说,这要看情况而定。根据经验法则,只需选择指数最低的n。如果你真的需要看看是否可以通过使用另一种算法来提高性能,那么你需要针对特定情况进行实验。而O(n)和O(n^2)+一些选择使用哪种算法的方法在所有情况下都比O(n)更慢(因为在选择算法上花费了额外的时间)。谢谢Robert。。。从上面的答案中,我明白了,因为我无法精确地估计a、b、x、y和z(不进行实验),所以我无法为精确的n解出(an+bIf 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)