java数据结构与算法-线性表与链表(2)

来源:互联网 发布:true love ways 知乎 编辑:程序博客网 时间:2024/05/16 08:52
上一会我们讲到了在java中线性表和链表的创建,数据的添加和删除所消耗的代价。相信大家在他们的选择上都有了一些了解。那么,在使用中呢?我们这里只讲解他们和数据结构之间的关系,并不会给大家一一讲他们的语法。如果有一些朋友,对于这些东西还不是很熟悉,大家可以去其他地方找找教程。下面我们来给大家讲一下这两种结构的迭代器的使用。首先,我们来讲一讲为什么要引入迭代器这一个东西。举个例子,假如我要对储存数字的一个顺序表或者链表中的每一个数字进行判定,如果大于5,保留,否则,删除。那么,如果不引入迭代器的话,那么我们就要写一个循环,判断其中的数字的大小,如果小的话,就删除。在删除过程中,都是重新找到这个节点再删除。这样的话就有一些麻烦,明明已经找到这个数了,为什么还要再重新找呢?而且,在表中删除过结点以后,他的书目会减少,那么势必会对遍历带来影响,请看代码
       public static void main(String args[]){        LinkedList<Integer> ar=new LinkedList<>();      //  ArrayList<Integer> ar=new ArrayList<>();        long startTime=System.currentTimeMillis();        Random ran=new Random();        for(int i=0;i<500000;i++){            ar.add(ran.nextInt(5000));        }       for(int i=0;i<ar.size();i++){             if(i>1000){                 ar.remove(i);                 i--;             }         }            long endtime=System.currentTimeMillis();        System.out.println(endtime-startTime);    }

我运行了一下,添加和删除共用750ms,这个时间就是比较长了,估计有朋友要问了,为什么你从第零个开始删删除所有的时间都比这个长呢。其实他是因为你在删除某一个的时候是要去找到这个位置再删,而删除第零个就是直接删。

此时,我们就引入了迭代器。在迭代器中,他会将这个结构中的数据一个一个迭代,一般都是只能向后迭代。在找到某一个点之后,如果要删除它,在迭代器中删除,就不需要在找到这个位置了。而且在删除后,可以继续向后迭代,无需序号。我们直接上代码
    public static void main(String args[]){        LinkedList<Integer> ar=new LinkedList<>();      //  ArrayList<Integer> ar=new ArrayList<>();        long startTime=System.currentTimeMillis();        Random ran=new Random();        for(int i=0;i<500000;i++){            ar.add(ran.nextInt(5000));        }         Iterator<Integer> iteator=ar.iterator();while(iteator.hasNext()){  int aj=  iteator.next();    if(aj>1000)    iteator.remove();}            long endtime=System.currentTimeMillis();        System.out.println(endtime-startTime);    }

这个运行时间基本上都在90ms左右,时间复杂度大大提高。

0 0
原创粉丝点击