第一章:线性查找

系列文章目录


文章目录

  • 系列文章目录
  • 前言
  • 一、线性查找
  • 二、实现查找算法
  • 三、循环不变量
  • 四、复杂度分析
  • 五、常见复杂度
  • 六、测试算法性能
  • 总结


前言

从线性查找入手算法。


一、线性查找

线性查找
目的 在线性数据结构中一个一个查找目标元素
输入 数组和目标元素
输出 目标元素所在的索引;若不存在,返回-1

第一章:线性查找_第1张图片

二、实现查找算法

public class LinearSearch {

    private LinearSearch(){}
    //构造函数私有化

    public static <E> int search(E[] data, E target)
    {
        for(int i = 0;i < data.length;i++)
        {
            if(data[i].equals(target))
                return i;

        }
        return -1;
    }
}

三、循环不变量

循环的目的
维持循环不变量

第一章:线性查找_第2张图片
第一章:线性查找_第3张图片

四、复杂度分析

算法复杂度分析 T = o(?)
分析 通过计算执行指令量(数据的规模)来衡量算法的复杂度,最终让算法的复杂度归结某一个量级,再来进行比较算法的性能
复杂度 随着数据规模n的增大,算法性能的变化趋势

第一章:线性查找_第4张图片
第一章:线性查找_第5张图片
第一章:线性查找_第6张图片

五、常见复杂度

复杂度估算量级
时间复杂度的计算与数据规模相关,要先确定数据规模

第一章:线性查找_第7张图片
第一章:线性查找_第8张图片
第一章:线性查找_第9张图片

六、测试算法性能

public class ArrayGenerator {

    public static Integer[] generateOrderedArray(int n)
    {
        Integer[] arr = new Integer[n];
        for(int i = 0;i < n;i++)
        {
            arr[i] = i;
        }

        return arr;
    }
}

public class Main {
    public static void main(String[] args)
    {
        int[] dataSize = {100000, 1000000};


        for(int n:dataSize)
        {
            Integer[] data = ArrayGenerator.generateOrderedArray(n);
            long startTime = System.nanoTime();
            for(int k = 0;k < 100;k++)
                LinearSearch.search(data, n);
            long endTime = System.nanoTime();
            double time = (endTime - startTime) / 1000000000.0;

            System.out.println("n = " + n + ",100 runs," + time + "s");
        }



    }
}

在这里插入图片描述


总结

算法复杂度需要结合数据规模进行分析,要看懂一个算法需要找到循环不变量和数据规模。

你可能感兴趣的:(#,查找算法,java,算法)