秦九韶算法实现

/**
     * 设定多项式的系数,为1.0 ~ 10.0之间的随机数
     * @param num
     * @return
     */
    public ArrayList<Double> getRandomCoefficient(Integer num){
        ArrayList<Double> arrayList = new ArrayList<Double>();
        Random random = new Random();
        while (num >=0){
            arrayList.add((double) Math.round(random.nextDouble()*10));
            num--;
        }
        return arrayList;
    }

    /**
     * 秦九韶算法计算结果
     * @param arrayList
     * @param X
     * @return
     */
    public Double getResultByQjsh(ArrayList<Double> arrayList,Float X){

        ArrayList<Double> doubleLists = (ArrayList<Double>) arrayList.clone();
        Double V = doubleLists.get(0); // b0 = a0
        doubleLists.remove(0);
        long start = System.currentTimeMillis();
        for (Double An:
             doubleLists) {
            V = X * V + An;   //B(i) = B(i-1)*x + Ai
        }
        long end = System.currentTimeMillis();
        logger.info("秦九韶算法所用时间为:"+(end - start) + "毫秒");
        return V; //f(Xn) = V
    }

    /**
     * 传统的多项式计算方式
     * @param arrayList
     * @param X
     * @return
     */
    public Double getResultByOld(ArrayList<Double> arrayList,Float X){
        /*
        * 1.多项式系数
        * 2.各个X项的幂 ,ArrayList<Integer> xlists
        * 3.两层循环求多项式的值
        * */
       /* int lenc = arrayList.size();
        int lenx = xlists.size();
        float temp = 0;
        double P = 0;
        for (int i = 0; i < lenc; i++) {
            double coefficient = arrayList.get(i);
            for (int j = 0; j < lenx; j++) {
                Integer integer = xlists.get(j);
                while (integer >= 0){
                    temp = temp*X;
                }
            }
            P = P + coefficient*temp;
        }*/
//        return P;
        int N = arrayList.size() - 1;//系数个数的大小减去1就是X项的最高次
        Double res = 0D;
        long start = System.currentTimeMillis();
        for (Double An:
             arrayList) {
            Double Xn = 1D;
            int i = 0;
            while(i <N){
                Xn = Xn * X;
                i++;
            }
            N--;
            res = res +An*Xn;
        }
        long end = System.currentTimeMillis();
        logger.info("传统的计算方法用时为:"+(end - start)+"毫秒");
        return res;
    }


    @Test
    public void test(){
        ArrayList<Double> randomCoefficient = getRandomCoefficient(10);
        Double resultByQjsh = getResultByQjsh(randomCoefficient, 8f);
        logger.info("计算结果为:"+resultByQjsh);
        Double resultByOld = getResultByOld(randomCoefficient, 8f);
        logger.info("计算结果为:"+resultByOld);
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值