算法-01-查找
线性搜索法(Linear Search)
线性搜索(Linear Search)算法又称为循序搜索(Sequential Search)算法,是学习编程语言最先需要学会的搜索算法。
它可以按照元素在集合中的顺序,从头开始进行走访,并连续判断目前走访到的元素是否是我们想要找的元素。
def linear_search(li, val):
for ind, v in enumerate(li):
print("索引 :" + str(ind))
print("索引值:" + str(v))
print('-----间隔---')
if v == val:
return ind
else:
return None
li = [1, 2, 3, 4, 5, 6, 7, 8, 9]
result = linear_search(li, 3)
print(result)
线性搜索法(Linear Search)
线性搜索法的概念
线性搜索法是以土法炼钢的方式走访集合中的每个元素,并在每次迭代时去判断目前走访到的元素是否正是我们想要找的元素。
线性搜索法在任何场合下都可以使用,不需要去在乎集合中的元素顺序。然而虽然它直觉又方便,但它通常不会是一个很有效率的搜索方法。
线性搜索法的过程
前面有提到线性搜索法可以用在任何场合,这边就以无排序的整数数组来举例吧!假设现在有个整数数组,内容如下:
索引 0 1 2 3 4 5 6 7 8
数值 9 8 3 3 9 2 4 6 3
若要用线性搜索法来找到元素6
,那就从数组的索引0
开始,判断索引0
的元素是否是6
,如果不是的话就继续判断下一个索引的元素值。
直到找到我们要找的元素值,也就是6
后才停止。如果已经走访到数组结尾了,却都没有发现元素值6
的话,表示6
并不存在于这个数组之中。
●
索引 0 1 2 3 4 5 6 7 8
数值 9 8 3 3 9 2 4 6 3
6 != 9
●
索引 0 1 2 3 4 5 6 7 8
数值 9 8 3 3 9 2 4 6 3
6 != 8
●
索引 0 1 2 3 4 5 6 7 8
数值 9 8 3 3 9 2 4 6 3
6 != 3
●
索引 0 1 2 3 4 5 6 7 8
数值 9 8 3 3 9 2 4 6 3
6 != 3
●
索引 0 1 2 3 4 5 6 7 8
数值 9 8 3 3 9 2 4 6 3
6 != 9
●
索引 0 1 2 3 4 5 6 7 8
数值 9 8 3 3 9 2 4 6 3
6 != 2
●
索引 0 1 2 3 4 5 6 7 8
数值 9 8 3 3 9 2 4 6 3
6 != 4
●
索引 0 1 2 3 4 5 6 7 8
数值 9 8 3 3 9 2 4 6 3
6 == 6
1.什么是算法
一系列解决问题的,清晰,可执行的计算机指令。
2.算法的五大特性
- 有限性
- 确定性:不会产生二义性
- 可行性
- 输入
- 输出
3.线性查找法
**定义:**线性查找又称顺序查找,是一种最简单的查找方法,它的基本思想是从第一个记录开始,逐个比较记录的关键字,
直到和给定的K值相等,则查找成功;若比较结果与文件中n个记录的关键字都不等,则查找失败
**举例:**在data数组中查找16
从数组的第一个元素24开始查找,直到找到16,返回其索引4,如果没有找到,则返回-1。
4.实现线性查找法
创建一个LinearSearch
类,里面定义静态search()
方法,把空参构造声明为私有的,避免外部使用new
创建该对象。
public class LinearSearch {
private LinearSearch() {};
/**
* 如果查询到目标元素,则返回目标元素所在的索引;查询不到,返回-1
* @param data 元数据数组
* @param target 查询目标元素
* @return
*/
public static int search(int[] data, int target) {
for (int i = 0; i < data.length; i++) {
if (data[i] == target) {
return i;
}
}
return -1;
}
public static void main(String[] args) {
int[] data = {24, 18, 12, 9, 16, 66, 32, 4};
//查找data数组里为16的
int res = LinearSearch.search(data, 16);
System.out.println(res);
//查找data数组里为999的
int res2 = LinearSearch.search(data, 999);
System.out.println(res2);
}
}
5.使用泛型
用户的数据类型可能是千奇百怪的,有可能是字符型、chat类型、浮点型,也有可能是用户自己设计的一个类,比如说的Student
类,在Student
数组中查找某一个相应的学生
,那么这些需求呢,我们现在的这个线性查找算法LinearSearch
中的search()
方法 ,都是无法满足的,接下来我们就要使用泛型
解决这个问题。
使用泛型需要注意的地方:不可以是基本数据类型,只能是类对象
现在的泛型是类对象,我们要把if (data[i] == target)
修改成if (data[i].equals(target))
,因为==
判断的是引用相等,而equals
判断的是值相等。
public class LinearSearch {
private LinearSearch() {};
/**
* 如果查询到目标元素,则返回目标元素所在的索引;查询不到,返回-1
* @param data 元数据数组
* @param target 查询目标元素
* @return
*/
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;
}
public static void main(String[] args) {
Integer[] data = {24, 18, 12, 9, 16, 66, 32, 4};
int res = LinearSearch.search(data, 16);
System.out.println(res);
int res2 = LinearSearch.search(data, 999);
System.out.println(res2);
}
}
6.使用自定义类测试我们的算法
定义一个Student
类,里面有个name
属性,一个全参构造,然后重写equals()
方法,实现自己的比较逻辑。
public class Student {
private String name;
public Student(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (o == null)
return false;
if (this.getClass() != o.getClass())
return false;
Student student = (Student) o;
return this.name.equals(student.name);
}
}
在main函数中使用这个类来测试线性查找法。
public static void main(String[] args) {
Student[] students = {new Student("zzm"), new Student("zhangsan"), new Student("lisi")};
Student zzm = new Student("zzm");
int res3 = LinearSearch.search(students, zzm);
System.out.println(res3);
}
7.循环不变量
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战