java 这个算法的代价函数是什么?

kwvwclae  于 2023-05-05  发布在  Java
关注(0)|答案(1)|浏览(151)

我的问题在标题里。经过几个小时的思考和在谷歌上查找网站,我得出的结论是,我不太确定如何解决这个问题,或者它是否正确。也许你们可以给予我一些建议,以更快或更容易的方式解决这些问题。任何帮助是赞赏!
该算法的成本函数为:
时间复杂度O(n)
外循环被执行大约log(n)次(因为“i”在每次迭代中被加倍),并且内循环在外循环的每次迭代中(在外循环的第一次迭代上)被执行至多n次,并且在外循环的每次后续迭代中至多执行一半次数。这样的话,时间复杂度为O(n)。

public float[] normalize (float[] seq) {
  int n = seq.length;
  float sum = 0;
  int cnt = 0;
  int i;
  for (i = 1; i < n; i = i + i ) {
    for ( int j = 0; j < i; j++) {
      sum = sum + seq [j];
    }
    cnt += i;
  }
  float[] res = new float [n];
  while (i >= 0) {
    if (i < n) {
      res [i] = seq[i] / (sum / cnt);
    }
  i--;
  }
  return res;
}

该算法的成本函数为:
时间复杂度O(n)
外循环被执行大约log(n)次(因为“i”在每次迭代中被加倍),并且内循环在外循环的每次迭代中(在外循环的第一次迭代上)被执行至多n次,并且在外循环的每次后续迭代中至多执行一半次数。这样的话,时间复杂度为O(n)。

92dk7w1h

92dk7w1h1#

是的,是O(n log n)
1.对于(int i = 0; i < n; i = i + i),它确实是一个log(n)性能特性。不是“近似地”,而是 * 精确地 * -近似被融入性能特征的概念中。
1.然后,对于每一个,你循环通过0-i,其中i的最坏/平均情况都是来自n的恒定引用,或多或少-因此,O(n)。将两者结合起来,得到O(n log n)
1.剩下的是O(n),常数因子“不计数”,所以O(2n * log n)仍然只是简化的O(n log n)
这种分析通常是确定这些事情的唯一方法。理论上你可以把它画出来;毕竟,'这个函数是O(n log n)意味着:
如果你制作一个2D折线图,Y轴上是“花费的时间”,X轴上是“n的值”,你实际上填写了值(生成一些n=1的输入)。运行它几次并计算运行时间的平均值。让我们假设它是5 msec。在x=1,y=5上加一个点。现在在n=2时运行它。假设是7毫秒。在x=2,y=7上加一个点。继续现在画一条线,大致符合点。瞧!
O(n log n)表示:如果你向右看得足够远,用零表示你必须看多远,曲线看起来就像数学函数描述的曲线的最右边部分:y = x * log(x),不管日志是哪个基(它们看起来都一样)。它只是看起来像什么,因此,常数因子是不相关的,因此,任何不“控制”的东西都可以省略(例如。y=x^2 + xy = x^2看起来完全一样,如果你看得足够远的话;这就是为什么O(x^2 + x)只是官样文章,唯一要说的是“这是曲线最终的样子”,而+ x的东西对外观没有影响,因此,包含它没有意义,因此,O(n)符号永远不会。
无论如何,这为您提供了另一种方法:实际上把它画出来,并把它和一些标准曲线进行比较。但我怀疑这比推理要少。

相关问题