数据结构和算法------有序数组和二分查找

来源:互联网 发布:星际淘宝网txt下载 编辑:程序博客网 时间:2024/05/16 15:09


之前研究了下无序数组,这里咱们将数组排序,这样呢可以进行一些个稍微额复杂但是可以提高速度的行为(看吧,咱们开始让程序变快了呵呵)。


有序数组有个好处这就是可以进行2分查找,吼吼这东西很有用,比线性查找快了老么老么多。(当然你得数组长度是2就当我没说)


首先,咱们来讨论2分查找.根据书上说的因为数组是有序的,好我们将数组分成2半,如果查找的大于中间值我们从大的那块继续二分查找(同理如果小于从小的那部分查找).直到找到值.这个搜索速度对于小数据量不明显,但是对于大数据量来说效果很ok.吼吼.

看下代码:

public int find(int searchKey){    int  lowerBound=0;    int upperBound=nElems-1;    int curIn;    while(true){        curIn=(lowerBound+upperBound);        if(a[curIn]==searchKey){            return curInl        }else if(lowerBound>upperBound){            return  nElems;        }else{            if(a[curIn]<searchkey){                lowerBound=curIn+1;            }else{                upperBound=curIn-1;            }        }    }}

这就是那个查找。


我们找的快了,存在一个问题插入,

嗯我们要维持排序这里的插入就稍微慢了点。看看代码吧:

public void insert(int value){    int j;    for(j=0;j<nElems;j++){        if(a[j]>value){            break;        }        for(int k=nElemns;k>j;k--){            a[k]=a[k-1]        }    }    a[j]=value;    nElems++;}
这里我的插入行为慢了点。

再看删除,删除要先找,再删,再移位。这里呢可以用二分查找了,其他的没有变化,吼吼变快了。


所以呢。这里有序数组比无需数组快了很多,但是删除和插入因为涉及到移位,怎么弄都很慢,有序数组在查找频繁的情况下十分有用,但是插入与删除较为频繁时就无能为力了。


下面要引入一个概念大O法则,这里用来表示运算时间 ,但是这里并不准确只是一个大概的时间概念,但是可以形象的表示了

我们认为数组是一个十分巨大的数组,所以N趋紧与无穷大,这样就有了下面的比较。


基本上对数组有了一个大体上的了解,后面还要研究其他的查找方式带来的性能的提升。或者性能上的差异。


在于使用数组上 无需数组插入很快,查询慢。有序数组查询快而插入慢。所以需要根据情况选择。

同时呢数组不能动态的改变大小, 如果初始创建的比较大那只能浪费资源,少了又不够用。所以这些都需要注意。

当然了可以将旧的数组复制到新的数组中去,使用新的扩容后的数组,这里其实也消耗了资源,需要进一步研究这种情况在何种情况下可以使用。



原创粉丝点击