【问题标题】:What is the time complexity of the following code fragment for Stock Buy & Sell?以下股票买卖代码片段的时间复杂度是多少?
【发布时间】:2021-01-13 22:52:40
【问题描述】:

最近我在尝试股票买卖问题,我们可以在任何一天买入一只股票并在接下来的任何一天卖出,我们必须找到我们可以获得的最大利润。

我首先想到的解决方案是下面的代码,但我无法确定它的时间复杂度。如果您能提供帮助,那将非常有帮助。

int maxProfit(int price[], int start, int end){
  if(end<=start)
    return 0;

  int profit=0;

  for(int i=start; i<end; i++){

    for(int j=i+1; j<=end; j++){

      if(price[j]>price[i]){

        int curr_profit=price[j]-price[i]+maxProfit(price,start,i-1)+maxProfit(price,j+1,end);
        profit=max(profit,curr_profit);
      }
    }

    return profit;
  }
}

【问题讨论】:

  • 循环是 O^2,两个递归调用只会让事情变得更糟。在这一点上,试图弄清楚最终的复杂性是没有意义的。将其描述为“坏”就足够了。
  • 只是想知道因为我读了几个小时但找不到与此相关的内容。有人说它是某种二进制递归,但这也无济于事。这段代码的时间复杂度可以用递归树计算吗?
  • 我猜它的 n^4。 maxProfit 可能需要缓存它已经计算的值。应该把它降低到 n^2
  • 这些来自各种在线编码/黑客/竞赛网站的谜题对帮助任何人实现学习 C++ 的目标毫无帮助。这个问题的正确解决方案将是 O(n),并且不需要任何递归。只有三个循环和两个临时向量(元组)来存储中间结果。您不会在上述各种在线编码/黑客/竞赛网站上找到有关用于解决这些难题的计算机算法的信息,而只能在教科书中找到有关此主题的信息。
  • @SamVarshavchik 我知道它可以在线性时间内解决,但是从这段代码中值得学习的是准确确定时间复杂度,我真的没有见过这样的时间问题复杂。这是我问的唯一原因。 (我没有要求最佳解决方案)

标签: c++ algorithm c++11 data-structures time-complexity


【解决方案1】:

我认为它会给你 Ω(n!)
如果我们只关注maxProfit(price,j+1,end) :
一开始,元素个数是n。
在每次迭代中,我们有两个循环调用 maxProfit(price,j+1,end),将元素数量减 1。
我们得到:
n^2(第 2 次循环)*(n-1)^2(第一次调用)*(n-2)^2(第二次调用)*(n-3) ^2 * ... * (nn-1)^2
这给出了 O(n!)。

因为我忽略了maxProfit(price,start,i-1),这也带来了额外的复杂性,所以我认为最好使用 Ω(n!) 来表示它至少需要 n!。

【讨论】:

  • 我不确定,但我认为这是不可能的。如果我们以A: maxProfit(price,start,i-1) + B: maxProfit(price,j+1,end) ==> 复杂度(A)+ 复杂度(B)的简单案例为例,每次调用时,我们都会乘数,但也会相加。这会生成一棵树,所以当我们下降到 prefedeur 时,我们乘以,但在同一级别我们只是添加。在叶级别,我们得到 (n!) *(所有路径的数量)。所以它取决于路径的最终数量,在我看来是(n)(不确定)。最后,你会得到类似 O(n*n!) 的东西。不确定,正如我所说,你必须检查所有这些。
  • 但是,无论如何,n!是可怕的复杂性,没有人使用它。很简单,如果存在,则搜索另一种解决方案(算法),否则,请寻求近似解决方案。祝你好运。
猜你喜欢
  • 2015-09-21
  • 1970-01-01
  • 1970-01-01
  • 2014-01-14
  • 2015-03-31
  • 1970-01-01
  • 2017-09-26
相关资源
最近更新 更多