线性查找法

简介: 线性查找法

什么是算法


一系列解决问题的,清晰的,可执行的计算机指令。


  • 有限性


  • 确定性: 不会产生二义性。不是说确定的输入就有确定的输出。


  • 可行性。


  • 输入(广义上的)


  • 输出(广义上的)


线性查找法


网络异常,图片无法展示
|


根据上面的案列,简单设计一个线性查找函数。


public class LinerSearch {
    public static int getLinerSearch(int[] arr, int target) {
        for(int i = 0; i < arr.length; i++) {
            if(arr[i] == target) {
                return i;
            }
        }
        return -1;
    }
    @Test
    public void test1() {
        int[] arr = new int[]{24, 18, 12, 9, 16, 66, 32, 4};
        int linerSearch = LinerSearch.getLinerSearch(arr, 16);
        System.out.println(linerSearch); // 4
    }
}


通过上面的测试可以发现,是没问题的,很简单。但是有一个问题,他只是满足int类型的数组。所以我们可以使用泛型让其可以适合任何类型的线性查找。


public class LinerSearch {
    public static <E> int getLinerSearch(E[] arr, E target) {
        for(int i = 0; i < arr.length; i++) {
        // 这里需要通过equals判断,因为可能出现比较错误。
            if(arr[i].equals(target)) {
                return i;
            }
        }
        return -1;
    }
    @Test
    public void test1() {
        Integer[] arr = new Integer[]{24, 18, 12, 9, 16, 66, 32, 4};
        int linerSearch = LinerSearch.getLinerSearch(arr, 16);
        System.out.println(linerSearch); // 4
    }
}


注意,我们在判断自定义类的查找时,一定要在类中重写equals方法。下面我们来看一下自定义类的线性查找吧。


public class Student {
        private String name;
        public Student(String name) {
            this.name = name;
        }
        // 重写equals方法
        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            Student student = (Student) o;
            return name != null ? name.equals(student.name) : student.name == null;
        }
    }


@Test
    public void test2() {
        Student[] arr = new Student[] {
                new Student("zh"),
                new Student("llm"),
                new Student("jcl")
        };
        int linerSearch = LinerSearch.getLinerSearch(arr, new Student("llm"));
        System.out.println(linerSearch); // 1
    }


复杂度分析


//    算法性能测试
    @Test
    public void test3() {
        int n = 1000000;
        int count = 100;
        long start = new Date().getTime();
        for(int i = 0; i < count; i++) { // 查询count次
            // LinerSearch.resultArr(n). 返回传入的n长度的数组。
            LinerSearch.getLinerSearch(LinerSearch.resultArr(n), n);
        }
        long end = new Date().getTime();
        System.out.println((end - start) / 1000 + "s");
    }


循环不变量


在每一次循环开始的时候,都满足一种条件。循环体是维持循环不变量的。他也是“证明”程序正确性的。


网络异常,图片无法展示
|


复杂度分析


  • 表示算法的性能。


  • 算法运行的上界。


  • 常数不重要。


  • 复杂度描述的是随着数据规模n的增大,算法性能的变化趋势。


网络异常,图片无法展示
|


常见复杂度比较


网络异常,图片无法展示
|

相关文章
|
23天前
|
存储 算法 Java
【算法系列篇】二分查找——这还是你所知道的二分查找算法吗?
【算法系列篇】二分查找——这还是你所知道的二分查找算法吗?
|
9月前
|
存储 算法
【查找算法】折半查找法
【查找算法】折半查找法
|
23天前
|
算法 测试技术 API
深入理解二分查找算法(一)
深入理解二分查找算法(一)
|
23天前
|
存储 算法 C#
C# | 二分查找算法的实现
二分查找法一种在**有序数组**中查找目标值的算法。划重点——“**有序**”,与需要遍历整个数组的查询算法不同,二分查找法通过将数组分成两部分来快速定位目标值所在的位置。 它的主要好处在于它的效率很高。因为它能够通过每次排除一半的元素来快速缩小搜索范围,因此在大型数据集上使用二分查找法可以显著提高查找速度。
22 0
|
9月前
|
算法
二分查找算法
以整型升序数组arr为例,将数组分为两部分:数组大小为size,设置数组下标left、mid、right,初始时分别为首元素下标0、中间元素下表(right-left)/2和最后元素下标 size-1,左部分为left-mid,右部分为 mid-right 设查找值为x,比较x与mid的大小。
42 0
|
9月前
|
存储 算法 搜索推荐
【查找算法】顺序查找法
【查找算法】顺序查找法
|
算法 C++
【基础算法】顺序查找 折半查找 & C++实现
顺序查找比较简单,就是顺序遍历我们所要查找的内容,判断并找出相应的目标数。比较简单,在这里不用图形说明程序实现具体情况。当面临大量数据时,顺序查找的效率非常低,时间复杂度大,所以会采用其他方法进行查找。
107 0
【基础算法】顺序查找 折半查找 & C++实现
|
11月前
二分法查找(折半查找)
二分法查找(折半查找)
42 0
|
12月前
二分查找法
二分查找法
|
算法
04查找算法:顺序查找法、二分查找法
04查找算法:顺序查找法、二分查找法
04查找算法:顺序查找法、二分查找法

热门文章

最新文章