[从今天开始修炼数据结构]查找算法概论和顺序表查找

一、查找概论

  查找的概念也没什么好说的,就介绍几个特殊概念

  主关键字:唯一标识一个记录的关键字,对比sql中的主键

  次关键字:可以识别多个数据元素的关键字,即并非一一对应的关键字

  静态查找表:只做查找,不做其他操作的表

  动态查找表:查找的同时,插入或删除数据的表

  好了下面进入正题

二、顺序表查找

  1,顺序表查找就是最基本的查找技术,从表中的第一个或最后一个元素开始,将表中的元素逐个与进行记录的关键字和给定值进行比较,若比较相同,则查找成功,若比较到尽头都不等,则查找失败

  代码实现:

    public static int equentialSearch(List list, Object obj){
        for (int i = 0; i < list.size(); i++){
            if (list.get(i).equals(obj)){
                return i;
            }
        }
        return -1;
    }

  查找复杂的表结构时,把你的List换成泛型,或者其他数据结构;写一个comparator或者comparable就可以了。

  2,顺序表查找优化

  每次查找都要对i是否越界进行判断,是件很麻烦的事。我们用更好的方法,设置一个哨兵。实现如下

    public static int enquentialSearch2(List list, Object obj){
        list.set(0, obj);
        int index = list.size();
        while (!list.get(index).equals(obj)){
            index--;
        }
        return index;
    }

  设置了list的0元素作为哨兵。

  3,算法分析

  顺序查找最好的情况,就是一开始就找到了目标元素,那么时间复杂度是O(1),如果最终才找到,查找次数是n+1,则时间复杂度是O(n),所以平均查找次数是(n+1)/2。即最终时间复杂度还是O(n)

  顺序表查找的显著缺点就是,面对表长很大的情况下,查找效率很低,但好处是,算法简单,对静态查找表没有组织结构的需求。对于这种查找,由于查找概率不同,我们在组织数据时,可以将常用的记录放在前面,不常用的往后面放,效率可大大提高。

  4,使用Java8流式编程实现

  

posted @ 2019-12-29 11:11  Joey777210  阅读(192)  评论(0编辑  收藏  举报