从Python学习中得到的一点启发

看了几天Python,感觉记忆力不行了,很多东西记不住了。但是终归是得到了一点知识:重写一个ArrayList,允许从负值的索引得到指定的项。然后写一个得到斐波拉契数组的方法,这种方法要比递归调用的方式好很多,性能上大概提升几百倍。

关于Java的递归调用的性能:

  Java中的每一个方法调用都会把这个调用的方法加入到调用栈,等到一个方法执行完毕返回的时候(return,如果没有显式写return语句,实际上还是有的 - 方法内还有一个指针,用来执向当前执行的代码位置),才把方法从栈中弹出来,

而在Java中,这个栈的维护会很费性能,而且递归调用还有个5000次的约束。所以,在Java中尽量不要使用递归调用。

  如果在Android中还可以使用SoarseIntArray来代替ArrayList,那样性能更好些,避免了大量创建BigInteger对象的,性能还能再提升N倍,N>100
        SparseIntArray sia = new SparseIntArray();

现在看下这个实现吧:


1
package com.xinye.test; 2 3 4 import java.math.BigInteger; 5 import java.util.ArrayList; 6 import java.util.Collection; 7 import java.util.List; 8 9 /** 10 * 斐波那契数列的各种实现方式 11 * F0 = 0 12 * F1 = 1 13 * Fn = Fn-2 + Fn-1 14 * 15 * 16 * @author xinye 17 * 18 */ 19 public class Test { 20 public static void main(String[] args) { 21 long startTime = System.currentTimeMillis(); 22 XYArrayList<BigInteger> list = getFiboArray(1, 1, 50); 23 for(BigInteger b : list){ 24 System.out.println(b.toString()); 25 } 26 System.out.println("计算" + list.size() + "项花费的时间是:" + (System.currentTimeMillis() - startTime) + "毫秒"); 27 } 28 /** 29 * 得到斐波那契数组 30 * @param first 数组第一项 31 * @param second 数组第一项 32 * @param index 要得到的最大项,从2开始 33 * @return 34 */ 35 public static XYArrayList<BigInteger> getFiboArray(int first,int second,int index){ 36 XYArrayList<BigInteger> feiboArray = new XYArrayList<BigInteger>(); 37 if(index <= 0){ 38 return feiboArray; 39 } 40 BigInteger bi01 = BigInteger.valueOf(first); 41 feiboArray.add(bi01); 42 if(index == 1){ 43 return feiboArray; 44 } 45 BigInteger bi02 = BigInteger.valueOf(second); 46 feiboArray.add(bi02); 47 if(index == 2){ 48 return feiboArray; 49 } 50 for(int i = 2;i < index;i++){ 51 feiboArray.add(feiboArray.get(-1).add(feiboArray.get(-2))); 52 } 53 return feiboArray; 54 } 55 } 56 /** 57 * 一个采用了负值索引的ArrayList 58 * 最后一项索引-1,倒数第二项-2,倒数第三项-3 59 * 也可以正向取值:0,1,2,3,4,5 60 * 61 * @author xinye 62 * 63 * @param <E> 64 */ 65 class XYArrayList <E> extends ArrayList<E>{ 66 67 /** 68 * 69 */ 70 private static final long serialVersionUID = -1319739564479533206L; 71 72 public E get(int index){ 73 74 if(index < 0){ 75 index = index + size(); 76 } 77 return super.get(index); 78 } 79 public E set(int index,E element){ 80 if(index < 0){ 81 index = index + size(); 82 } 83 return super.set(index, element); 84 } 85 public void add(int index, E element) { 86 if(index < 0){ 87 index = index + size(); 88 } 89 super.add(index, element); 90 } 91 92 public boolean addAll(int index, Collection<? extends E> c) { 93 if(index < 0){ 94 index = index + size(); 95 } 96 return super.addAll(index, c); 97 } 98 public E remove(int index) { 99 if(index < 0){ 100 index = index + size(); 101 } 102 return super.remove(index); 103 } 104 /** 105 * 删除指定范围内的对象 106 * 无论从正向取值还是负向取值,fromIndex总要比toIndex先出现 107 */ 108 public void removeRange(int fromIndex, int toIndex) { 109 if(fromIndex < 0){ 110 fromIndex = fromIndex + size(); 111 } 112 if(toIndex < 0){ 113 toIndex = toIndex + size(); 114 } 115 super.removeRange(fromIndex, toIndex); 116 } 117 /** 118 * 得到从fromIndex到toIndex的List的子集 119 * 无论从正向取值还是负向取值,fromIndex总要比toIndex先出现 120 */ 121 public List<E> subList(int fromIndex, int toIndex) { 122 if(fromIndex < 0){ 123 fromIndex = fromIndex + size(); 124 } 125 if(toIndex < 0){ 126 toIndex = toIndex + size(); 127 } 128 return super.subList(fromIndex, toIndex); 129 } 130 }

So Easy.

做个笔记,忘了的时候再来看看!

原文地址:https://www.cnblogs.com/xinye/p/3451052.html