JAVA求股票K线最佳买卖时间等(复杂度为N)

package cn.test1;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Date;

public class StockAnalysize {

    public static void main(String[] args) {
        ArrayList<Node> source = new ArrayList<Node>();

        for (int i = 0; i < 1000000; i++) {
            Node node = new Node();
            double price = Math.random() * 10 + 20;
            DecimalFormat df = new DecimalFormat("0.00");
            String format = df.format(price);
            price = Double.valueOf(format);
            node.setPrice(price);
            node.setTime("2015-1-9-" + i);
            source.add(node);
        }
//      System.out.println(source);
        Date date1 = new Date();
        Node maxNode = null;
        Node minNode = null;
        Node tempNode = null;
        boolean beforePriceDi = false;// true位上升 false为下降

        for (int i = 0; i < source.size(); i++) {
            if (i == 0) {
                maxNode = source.get(i);
                minNode = source.get(i);
                continue;
            }
            double currentPrice = source.get(i).getPrice();
            double beforePrice = source.get(i - 1).getPrice();
            boolean currentDi = (currentPrice - beforePrice) > 0 ? true : false;

            if (beforePriceDi == currentDi) {
                continue;
            } else {
                if (beforePriceDi) {
                    // 先上升后下降 极大值
                    // 比较是否比之前的最大值大
                    if (beforePrice - maxNode.getPrice() > 0) {

                        // 大就替换最大值
                        maxNode = source.get(i - 1);
                        // 大就替换最小值
                        if (tempNode != null) {
                            minNode = tempNode;
                            tempNode = null;
                        }
                    }
                } else {
                    // 先下降后上升 极小值
                    // 判断是不是最小值 同 temp比较
                    if (tempNode != null) {

                        if (tempNode.getPrice() - beforePrice > 0) {
                            tempNode = source.get(i - 1);
                        }
                        continue;
                    }

                    // 小于则赋值给temp
                    if (minNode.getPrice() - beforePrice > 0) {
                        tempNode = source.get(i - 1);
                    }

                }
                beforePriceDi = currentDi;
            }
        }
        Date date2 = new Date();
        long time = date2.getTime()-date1.getTime();
        System.out.println("min: " + minNode.toString() + "max: " + maxNode.toString() + "Di: " + (maxNode.getPrice() - minNode.getPrice())+"\nruntime: "+time +" milliseconds ");

    }

}

class Node {
    private String time;
    private double price;

    public Node(String time, double price) {
        super();
        this.time = time;
        this.price = price;
    }

    public Node() {
        super();
        // TODO Auto-generated constructor stub
    }

    public String getTime() {
        return time;
    }

    public void setTime(String time) {
        this.time = time;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return " time=" + time + ", price=" + price + "\n";
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值