【问题标题】:Sorting algorithm using divide and conquer使用分而治之的排序算法
【发布时间】:2016-05-04 01:03:34
【问题描述】:

这就像一个股票营销问题,我很困惑,问题是如何获得每天的最大利润?我只知道算法的时间复杂度可以是O(n)或者O(n log2 n)。

输入是 A,一个股票价格数组。对于第 i 天,最好的交易是在第 i 天买入并在随后一天卖出可以实现的最大利润。为方便起见,您可以将最后一天的最佳交易简单地定义为 -A[n](因为如果您在最后一天买入,您将无法卖出并且您损失了所有的钱)。 给出一个算法的伪代码,该算法返回一个数组,该数组包含 A 中每天的最大利润。

更新:我现在了解如何获得最大利润,我可以使用类似于分治合并排序的算法来找到这个最大利润。我的问题是使用时间复杂度 O(n) 来找到最大利润的另一种方法(算法)是什么,或者我该如何以这种方式接近?

【问题讨论】:

  • 它基本上告诉你找到每天交易的最小值和最大值。您以 MIN(i) 买入并以 MAX(i+1) 卖出,除了您不再购买的最后一天。
  • 每天识别S 的股票,其中price(S, n+1)/price(S, n) 尽可能大。如果它小于 1,请当天坐在外面。否则尽可能多地购买 S。

标签: algorithm


【解决方案1】:

你可以想到这个问题的一种方法是使用一个 for 循环,因为它是 O(n),我可以给你一些提示:

    for i from 0 to n:
        if (A[i] < A[min])   // find the minimum value of stock
          min = i;
        profit = A[i] - A[min]    // get the profit
        if (profit > maxProfit) {   // compares the profits
          maxProfit = profit   // always update the max profit

【讨论】:

    【解决方案2】:

    如果您在i当天买入,您可以赚取的最大利润是Amax(i) - A[i], 其中Amax(i) 是出现在之后i 的最高价格。 我对算法规范的解读是,您将构造并返回数组M,其条目由M[i] = Amax(i) - A[i] 定义。

    i 日之后出现的最高价格是 A[i+i]i + 1 之后出现的最高价格。

    最后一段给你一个递归关系,除了不像 您可能会看到的“典型”递归,ith 值取决于 i + 1st 值而不是相反。 但幸运的是,您已经知道 nth 的值和 后面的每个值都是 0,也就是说,在n 一天之后,您的股票将获得 0。 所以你只需要计算出几天的值 1, 2, ..., n - 1,你可以在 O(n) 时间内完成。 并且每次找到这些值之一时,Amax(i),您可以使用M[i] = Amax(i) - A[i] 设置M 的条目之一。


    如果您想找出在任何一天买入一股股票并在随后的任何一天卖出所能获得的最大利润,一次 (虽然这不是问题陈述所要求的,据我所知),你只需要在M 中找到最大值,你可以在 O(n) 时间内完成。

    如果您的目标是通过一系列操作(买卖股票)获得最大利润,那么您能做的最好的事情就是在股票处于局部最小值时尽可能多地购买股票(假设无限第一天之前的价格)并在达到当地最高价格时出售所有东西。您可以在 O(n) 时间内识别所有局部最小值和最大值,在任一方向扫描A,并给定起始金额,您可以使用局部列表计算 O(n) 时间内的最大总利润A 的最小值和最大值。 (但这并没有使用原始问题陈述要求您构建的数组,因为该数组不考虑购买的股票数量,也不考虑多次交易的可能性。)

    请记住,如果两遍算法的每一遍都需要 O(n) 时间,那么整个算法需要 O(n) 时间。

    【讨论】:

    • 感谢大卫,但我不明白如何确保我购买股票的当天是最低价格? (例如,第 1 天(2 美元)、第 2 天(1 美元)、第 3 天(10 美元),如果我在第一天买入,那么我无法获得最大利润)并检查我需要 O(n) 的最小值,检查第 i 天之后的最大值,我需要 O(n)。会变成 O(n^2) 吗?
    • 我没有看到程序规范中的哪个位置说您必须以​​最低价格购买。它只是说返回一个数组,如果我正确阅读了规范,它会告诉您如果您在i 当天购买并在那之后以最高价格出售会发生什么。您可以遵循其他策略来更好地优化您的股票买卖,但这个问题并不需要这些策略。
    猜你喜欢
    • 2020-07-23
    • 2015-04-08
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    • 2012-01-01
    • 2018-02-09
    • 2019-04-08
    • 2013-02-03
    相关资源
    最近更新 更多