欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享,与更多的人进行学习交流
目前,已开了以下专栏,欢迎关注与指导
1️⃣Java基础知识系统学习(持续更文中…)
2️⃣UML的应知应会(已更完)
3️⃣MySQL的应知应会(持续更文中…)
4️⃣算法与数据结构体系(持续更文中…)
5️⃣软考中级:软件设计师系列(持续更文中…)
还有更多文章在主页,欢迎访问爱书不爱输的程序猿
本文收录于算法与数据结构体系专栏,本专栏是服务于0基础者,一起完成从0到1的跨越
问路
:坐公交车到达某一站下车—>再转某一个地铁站 这个地铁站坐几号线?从哪一站下车?下车以后从几号地铁口出去?—>再怎么走就能到了–>求解方程
:一步一步的求解一元二次方程,这里涉及的每一步都是清晰可执行的- 这一系列的指令本质其实就是一个算法: 解决了如何到达目的地的一个问题,解决了如何求得一个一元二次方程的解
有限的时间
里可以执行完≠
时间短 : 假设一个算法需要万年亿年才能执行完,那么从原则上讲他也是一个算法,只不过他消耗的时间太长,这个算法并不实用而已,同样的,不实用不代表没有意义,研究算法恰恰是从这样的一个看似不可行的算法出发,一步一步的优化它,最终得到一个可行的算法含义唯一
的, 不会产生二义性
≠
相同输入会有相同输出 : 对于一个随机算法来说,那么很有可能输入是同样的一个数据,输出的结果呢却不相同每一步应该是可行的
有输入
的≠
算法没有输入 : 算法的输入的概念是更加广义的,对于一个函数来讲,可能并没有输入的参数,但对于一个算法来说,他肯定是有他需要操作的对象的,那么他所操作的这些对象就是这个算法的输入具体表现在程序中,一个算法操作的对象有可能定义在一个类中,它是一个成员变量,是一个全局变量,它不是这个函数的参数,那么它也是这个算法的输入,甚至有可能一个算法操作的对象本身隐藏在这个算法的语义中——比如设计一个算法,这个算法他做的事情就是生成零这个数字,所以这个算法内部的逻辑直接通过return 0返回零就好了,那么这个算法看起来没有输入的值,但是其实我们必须在数学上定义清楚了0:0到底是什么?才能返为零这样的一个数字。那么从数学上拥有了零这个概念本身就是我们这个算法的输入
有输出
的
- 比如一个算法做的事情是在屏幕中绘制了一个圆 ,那么这样的一个绘制函数很有可能它的返回类型是void,但是这个算法本身确实在我们的这个屏幕中把这个圆绘制出来了,这个绘制的结果就是这个算法的输出。
- 或者一个算法做的事情就是休眠x分钟,x是一个输入,那么对于这个算法来说,没有返回值,只是执行了休眠x分钟这样的一个操作,返回值是void,但是这个算法的输出就是我们的这个程序真的休眠了x分钟,在这x分钟中不进行任何的响应
一个一个的去寻找自己想要找到的那个目标元素
i
,初始的时候是0一个数组
——即我们要从一堆试卷中找到属于自己的那一张试卷,首先要有这一堆试卷,在算法中用一个数组来表示一个目标元素
——知道自己的名字是什么,才能在这一点试卷中找到属于自己的那一张试卷,在上面这个例子中,目标元素其实就是16目标元素所在的索引
——例子中16这个元素索引为4,这个算法返回就应该是4目标在数组中不存在
——返回-1,因为-1不是一个合法的索引值 (对于任何一个索引值来说 肯定是大于等于零的一个值)public class LinearSearch {
/*
@function 线性查找的方法
@param data 整型数组 待查找的数组
@param terget 整型数组 查找的目标
@return 整型 找到的索引值或-1
*/
public int search(int[] data, int target) {
for (int i = 0; i < data.length; i++) {
if (data[i] == target)
return i; //如果找到目标,返回对应的索引值
}
return -1; //如果没有找到目标,返回-1
}
public static void main(String[] args) {
//准备用于查找的数组
int[] data = {24, 18, 12, 9, 16, 66, 32, 4};
LinearSearch ls = new LinearSearch(); //声明一个LinearSearch的对象
//调用LinearSearch的search(),查找目标16
//将返回的结果赋值给一个整型变量res
int res = ls.search(data, 16);
System.out.println(res); //输出res
int res2 = ls.search(data,666); //查找目标666
System.out.println(res2);
}
}
- 没有必要声明一个LinearSearch的对象,可以将search()改成静态的方法,这样在调用search()的时候,就可以直接用LinearSearch这个类名进行调用search()
用户不需要创建一个LinearSearch的对象
,他只希望使用线性查找的方式从某个数组中查找一个元素,我们将这个方法写成static,直接让用户调用这个方法
就好了,而不需要new 一个新对象
public class LinearSearch {
/*
@function 线性查找的方法,static将其设置为静态方法
@param data 整型数组 待查找的数组
@param terget 整型数组 查找的目标
@return 整型 找到的索引值或-1
*/
public static int search(int[] data, int target) {
for (int i = 0; i < data.length; i++) {
if (data[i] == target)
return i; //如果找到目标,返回对应的索引值
}
return -1; //如果没有找到目标,返回-1
}
public static void main(String[] args) {
//准备用于查找的数组
int[] data = {24, 18, 12, 9, 16, 66, 32, 4};
//调用LinearSearch的search(),查找目标16
//将返回的结果赋值给一个整型变量res
int res = LinearSearch.search(data, 16);
System.out.println(res); //输出res
int res2 = LinearSearch.search(data,666); //查找目标666
System.out.println(res2);
}
}
上述优化后,虽然用户能直接通过LinearSearch.search()调用方法,但是用户依然可以进行“new一个LinearSearch类的对象”的操作,如何阻止这一操作?
可以在LinearSearch中将LinearSearch的构造函数声明为私有的
即可
public class LinearSearch {
//将LinearSearch的构造函数声明为私有
private LinearSearch(){}
/*
@function 线性查找的方法,static将其设置为静态方法
@param data 整型数组 待查找的数组
@param terget 整型数组 查找的目标
@return 整型 找到的索引值或-1
*/
public static int search(int[] data, int target) {
for (int i = 0; i < data.length; i++) {
if (data[i] == target)
return i; //如果找到目标,返回对应的索引值
}
return -1; //如果没有找到目标,返回-1
}
public static void main(String[] args) {
//准备用于查找的数组
int[] data = {24, 18, 12, 9, 16, 66, 32, 4};
//调用LinearSearch的search(),查找目标16
//将返回的结果赋值给一个整型变量res
int res = LinearSearch.search(data, 16);
System.out.println(res); //输出res
int res2 = LinearSearch.search(data,666); //查找目标666
System.out.println(res2);
}
}
- 虽然将LinearSearch的构造函数声明为私有,但是上述代码中的main()里依旧可以进行“new一个LinearSearch类的对象”的操作
- 这是因为当前的main()是LinearSearch类的内部的函数,所以它依然可以访问到LinearSearch中的所有方法(包括私有方法),但这个优化的思想是没有问题的,是需要我们学习的