java - 最长的盈利交易算法

标签 java algorithm

在面试中遇到这个问题。想知道有没有更好的解决办法:

给定股票价格序列 [p1, p2, p3, p4, …. pN].交易员乔被要求在时间 i 购买 1 股股票,并在时间 j 出售相同的股票。他的目标是最大化买入时间和卖出时间之间的时间间隔,但仍然有利可图。 例如,Trade Joe 按时间顺序给出了一系列价格:

Time,Price

10:00,10.3

10:01,10.1

10:02,11

10:03,13

10:04,9.5

10:05,7.3

10:06,8

10:07,10.2

10:08,9.8

如果他在 10:01 买入股票,价格 = 10.1,并在 10:07 卖出,价格 10.2。他将获利 0.1,买卖之间的时间为 6 分钟。这是此示例的最长时间。

输入

第一行包含序列的长度 N。接下来的 N 行包含 (time, price) 对: 否 时间1,价格1 时间2,价格2 ……

输出

使用给定的价格序列,有利可图的买卖行为之间的最长时间

示例输入(使用文件或标准输入):

7

10:01,7

10:02,4

10:03,5

10:04,10

10:05,5

10:06,2

10:07,6

示例输出:

5 (This is using a buy at 10:02 ($4) and a sell at 10:07 ($6), the time delta is 10:07 – 10:02 = 5 minutes)

我提出的解决方案是 O(N2),有一个小的优化:

    for(int i = 0; i < lines.size(); i++){
        for(int j = lines.size()-1; j >= 0; j--){
            try
            {
                String[] partsFirst = lines.get(i).split(",");
                String[] partsLast = lines.get(j).split(",");

                String firstPriceString = partsFirst[1];
                String lastPriceString = partsLast[1];

                String firstDateString = partsFirst[0];
                String lastDateString = partsLast[0];

                double firstPriceInt = Double.parseDouble(firstPriceString);
                double lastPriceInt = Double.parseDouble(lastPriceString);


                Date date1 = format.parse(firstDateString);
                Date date2 = format.parse(lastDateString);
                long difference = date2.getTime() - date1.getTime();

                //optimization
                if(difference <= maxDuration)
                    continue;


                if(lastPriceInt > firstPriceInt && (difference) > maxDuration)
                    maxDuration = difference;
            }
            catch (ParseException ex)
            {
                System.out.println("Exception "+ex);
            }
        }
    }

有没有更有效的解决方案?

最佳答案

是的,有一个 O(n) 时间算法。

向前扫描价格(从头到尾),将低于所有先前价格的价格及其时间存储在辅助数组中。做一些类似的事情来找到大于所有后续价格的所有价格。这些数组自然都是有序的。

最佳交易从第一个数组买入并卖出到第二个数组。两个数组的变体排序合并将识别所有 O(n) 交易,这些交易在一个端点固定的情况下是有利可图的,并且距离最大。

合并的工作方式是,我们将一个索引初始化为“买入”(第一个)数组,将另一个索引初始化为“卖出”(第二个)数组,从最低价格开始。如果当前买入价低于当前卖出价,则考虑该交易并转到下一个最高买入价。否则,转到下一个最高售价。

关于java - 最长的盈利交易算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27551793/

相关文章:

java - 如何使用 Bootstrap 主题生成 JavaDoc?

c++ - 优化字符串数组中最宽字符串的查找?

algorithm - Haskell:两个单词之间的共享字母

algorithm - 突击队风格的视线算法

algorithm - RSA算法复杂度分析

java - 体系结构 x86_64 : "_fcloseall" 的 undefined symbol

java - 如何检查生成的 Java 代码是否符合 Java 语言规范?

Java静态定义字典/HashMap

java - Android 等待 Text to Speech OnInit 被调用

algorithm - 计算达到一定数量所需的最少操作次数