算法与数据结构体系 - 线性查找

  • 什么是算法
  • 线性查找法
    • 基础创建
    • 修改1:私有化
    • 修改2:泛型
    • 提升:自定义Student类测试算法
    • 复杂度分析:表示算法的性能
    • 常见算法的复杂度
    • 测试算法性能

什么是算法

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

  1. 有限性
  2. 确定性:无二义性
  3. 可行性
  4. 输入
  5. 输出

线性查找法

基础创建

输入: 数组,目标元素
输出: 目标元素所在的索引( 若不存在,返回 -1 )

// linear search
public class LinearSearch {//输入: 数组,目标元素public int Search(int[] data, int target){//遍历for(int i = 0; i < data.length; i ++) {//如果查询到一样的内容if (data[i] == target) {//输出:目标元素所在的索引return i;}}// 若不存在,返回 -1     return -1;}//测试用例public static void main(String[] args){//创建数组int[] data = {4, 35, 45, 42, 63, 23, 6, 77};// 存在的情况// 创建linearSearch类的对象LinearSearch ls = new LinearSearch();int res1 = ls.Search(data, 6);System.out.println(res1);// 不存在的情况int res2 = ls.Search(data, 7);System.out.println(res2);}
}

修改1:私有化

  1. LinearSearch是一个动词,对于动作而言,创建一个对象很奇怪,所以修改为类似Math方法的直接调用
  2. 不希望用户创建对象,将LinearSearch创建为私有的

文件1 :LinearSearch.java

public class LinearSearch {//让它私有化 即外部不能创建对象 只能直接使用private LinearSearch(){}public static int Search(int[] data, int target){for(int i = 0; i < data.length; i ++) {if (data[i] == target) {return i;}}return -1;}
}

文件2:Main.java

public class Main {public static void main(String[] args){int[] data = {4, 35, 45, 42, 63, 23, 6, 77};//        LinearSearch ls = new LinearSearch();int res1 = LinearSearch.Search(data, 6);System.out.println(res1);int res2 = LinearSearch.Search(data, 7);System.out.println(res2);}
}

修改2:泛型

不是只有int类型的变量,若是学生姓名的查找,换了类型之后,就会重复代码,因此需要修改 – 泛型
(目的:向Java的标准库看齐)

泛型复习

  1. 泛型只能接受类对象,不能接受基本数据类型
  2. 基本数据类型:
    boolean, byte, char, short, int, long, float, double
  3. 每个基本数据类型有对应的包装类: Boolean, Byte, Character, Short, Integer, Long, Float, Double

文件1 :LinearSearch.java

public class LinearSearch {private LinearSearch(){}public static <E> int Search(E[] data, E target){for(int i = 0; i < data.length; i ++) {// 类对象之间的判断,要使用equals方法if (data[i].equals(target)) {return i;}}return -1;}
}

文件2:Main.java

public class Main {public static void main(String[] args){Integer[] data = {4, 35, 45, 42, 63, 23, 6, 77};int res1 = LinearSearch.Search(data, 6);System.out.println(res1);int res2 = LinearSearch.Search(data, 7);System.out.println(res2);}
}

提升:自定义Student类测试算法

文件1 :LinearSearch.java

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:Main.java

public class Main {public static void main(String[] args){Integer[] data = {4, 35, 45, 42, 63, 23, 6, 77};int res1 = LinearSearch.Search(data, 6);System.out.println(res1);int res2 = LinearSearch.Search(data, 7);System.out.println(res2);Student[] students = {new Student("ccq"),new Student("cq"),new Student("cc")};Student ccq = new Student("Ccq");int res3 = LinearSearch.Search(students, ccq);System.out.println(res3);}
}

文件3:Student.java

public class Student {private String name;public Student(String name){this.name = name;}// 设计者自己去定义什么叫两个人相等的含义// 将两个学生类的比较,变为学生姓名字符串的比较public boolean equals(Object student){// 地址是否是一样(即地址是否一样)if(this == student)return true;if(student == null)return false;// 判断类对象是否相等if(this.getClass() != student.getClass())return false;// 强制将Object 转化为 StudentStudent another = (Student)student;return this.name.toLowerCase().equals(another.name.toLowerCase());}
}

复杂度分析:表示算法的性能

  1. 复杂度分析通常看最差的情况
  2. 数据规模:n = data.length
  3. 算法性能:T = ?
    若 T = c1 * n + c2 → O(n)
    常数不重要
    复杂度描述的是随着数据规模N的增大,算法性能的变化趋势

常见算法的复杂度

[一定要明确n到底是谁]

O ( n ) = ( n 2 ) O(n) = (n^2) O(n)=(n2)

1.
for(int i=0;i<data.length;i++)for(int j=1;j<data.length;j++)//获得数据对(data[i],data[j])2. 遍历一个n*n的二位数组
for(int i=0;i<n;i++)for(int j=0;j<n;j++)//遍历到A[i][j]

O ( n ) = ( l o g n ) O(n) = (logn) O(n)=(logn)

//数字n的二进制位数
while(n){n % 2 // n;n /= 2;
}

O ( n ) = ( n ) O(n) = (\sqrt{n}) O(n)=(n ​)

//数字n的所有约数
for(int i=1;i*i<=n;i++){if(n%i==0)//i和n/i是n的两个约数
}

O ( n ) = ( 2 n ) O(n) = (2^n) O(n)=(2n)

长度为n的二进制数字

O ( n ) = ( n ! ) O(n) = (n!) O(n)=(n!)

长度为n的数组的所有排列

O ( 1 ) O(1) O(1) < O ( l o g n ) O(logn) O(logn) < O ( n ) O(\sqrt{n}) O(n ​) < O ( n ) O(n) O(n) < O ( n l o g n ) O(nlogn) O(nlogn) < O ( n 2 ) O(n^2) O(n2) < O ( 2 n ) O(2^n) O(2n) < O ( n ! ) O(n!) O(n!)

测试算法性能

文件1 :LinearSearch.java

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:Main.java

public class Main {public static void main(String[] args){//        int n = 10000000;
//        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;
//        //线性查找法对于100000这个数据总共花费多少秒
//        System.out.println(time + " s");int [] dataSize = {1000000, 10000000};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;//线性查找法对于100000这个数据总共花费多少秒System.out.println("n = " + n + ", 100 runs : " + time + " s");}}
}

文件3:ArrayGenerator.java

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

算法与数据结构体系:线性查找相关推荐

  1. 数据结构之线性查找和折半查找

    1.线性查找 比如字符串 char s[] = "chenyu"; 如果我们是线性查找的话,就是从字符'c'依次到字符串结尾'u'查找 2.折半查找 注意查找之前必须是有序的 比如 ...

  2. 算法与数据结构之二分查找

    一.两道LeetCode题 首先来两道算法题举例,来初步探讨二分查找 278.First Bad Version 先贴上代码 // Forward declaration of isBadVersio ...

  3. 算法与数据结构 -- 排序和查找(五)

    一.排序算法 冒泡排序 选择排序 插入排序 希尔排序 快速排序 归并排序 堆排序 桶排序 二.算法实现 冒泡排序 每次比较相邻两个元素,若不符合大小关系,则交换元素位置.让最小的(或最大)元素在列表尾 ...

  4. 【算法与数据结构】3 知行合一,线性查找的自定义类测试

    欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享,与更多的人进行学习交流 本文收录于算法与数据结构体系专栏,本专栏对于0基础者极为友好,欢迎与我一起完成算法与数据结构的从0到1的跨越 线性查找 ...

  5. 高并发和大数据下的高级算法与数据结构:如何快速获取给定年龄区间的微信用户数量或快速获取美团中购买量前k的品类

    在技术领域有一句经典话:程序=算法+数据结构.这意味着一个好的程序员往往要在算法与数据结构上有扎实的功底.这也是为何各个国内外大厂在面试时一定会考核这个领域.随着时代的发展,算法与数据结构的定义也在发 ...

  6. 算法与数据结构基础<一>----线性查找法

    开篇: 对于数据结构及算法的学习在17年时就已经在博客中开了专栏: 但是!!!感觉学得有点零散,有c版本的,也有java版本的,没成体系,当然其效果也并没达到自己满意的效果,基于此,这里准备重新开个专 ...

  7. 算法与数据结构(第一周)——线性查找法

    目录 线性查找法介绍 实现线性查找法 使用泛型 使用自定义类测试算法 循环不变量 简单的复杂度分析 常见的时间复杂度 测试算法性能 线性查找法介绍 线性查找法是一个非常简单的算法,比如说现在有一打试卷 ...

  8. 算法与数据结构(python):线性查找与二分查找

    提示:提示:专栏解锁后,可以查看该专栏所有文章. 文章目录 查找 线性查找 1普通线性查找 2递归线性查找 二分查找 1普通二分查找 2递归二分查找 查找 查找可以说是我们业务代码里用得最多的操作,比 ...

  9. Java数据结构与算法——线性查找 二分查找 插值查找

    1.线性查找 有一个数列: {1,8, 10, 89, 1000, 1234} ,判断数列中是否包含此名称[顺序查找] 要求: 如果找到了,就提示找到,并给出下标值. package com.szh. ...

最新文章

  1. 魔豆路由工程版体验:智能路由脱离手机的尝试
  2. ant 使用常见问题
  3. 六十一、Vue中父子组件传值和组件参数校验
  4. 如何禁用单个FegionClient的Hystrix的支持
  5. java robot 控制 不用用户 界面_编写一个基于Java Robot类的屏幕捕获工具
  6. java天气预报webservice_webservice之实现天气预报
  7. createsolidcaret 后 很快就不闪烁了_为什么LED灯会越用越暗?为什么会闪烁?
  8. 聚焦BCS|吴云坤产业峰会演讲:用内生安全框架提升网络安全产值
  9. C语言随机数10到999990,C语言程序设计(高清pdf) 丹尼斯 里奇
  10. win10拨号上网开启热点
  11. Oracle分区表详解,分区表创建,分区表按日期划分
  12. QC —什么是量子计算机?
  13. 经典按键java手机游戏_盘点曾经红极一时的手机游戏,每款都是经典中的经典...
  14. webug 3、延时注入
  15. 全力加速,绝对实力!从Q3财报看华米科技的逆势而为
  16. 疫情期间给女朋友敲段代码,给女朋友个小惊喜
  17. bartender在服务器系统,BarTender 2016系统要求
  18. bitwig编曲软件linux,Bitwig Studio下载
  19. Jackson全面解析--注解全讲解一(@JacksonAnnotation,@JacksonAnnotationsInside,@JacksonInject,@JsonAlias)
  20. 怎么在网上找计算机答案,试卷上怎么啊

热门文章

  1. python正态性检验:检验数据是否服从正态分布
  2. 【跟着陈七一起学C语言】今天总结:C语言最基础入门
  3. python下载微信公众号文章_python selenium 微信公众号历史文章随手一点就返回首页?郁闷之下只好将他们都下载下来。...
  4. Windows下使用VisualSFM + CMVS/PMVS +MeshLab进行三维重建
  5. 【新品】高速大数据最新应用——全国首个非营运货车风险评估助手上线!
  6. mysqlsql常用函数_MySQL中的常用函数
  7. 福田国资引入电子合同,勇当数字治理排头兵
  8. 喜马拉雅听书海外版怎么样?怎么在海外用国内版?
  9. [Go] 开源客服系统以及多商户客服系统-GOFLY在线客服
  10. 弘辽科技:经济内循环助推电商发展,解读未来电商新趋势