网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
目录
查找问题(顺序查找,二分查找,分块查找,二叉排序树查找,哈希查找)
算法概述
什么是算法?
算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。. 也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。. 如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。. 不同的算法可能用不同的时间、空间或效率来完成同样的任务。. 一个算法的优劣可以用空间复杂度与时间复杂度来衡量。. 算法中的指令描述的是一个计算,当其运行时能从一个初始状态和(可能为空的)初始输入开始,经过一系列有限而清晰定义的状态,最终产生输出并停止于一个终态。. 一个状态到另一个状态的转移不一定是确定的。. 随机化算法在内的一些算法,包含了一些随机输入。
解题的方法与步骤
算法概念的要点
- 算法的每一步都必须清晰,明确
- 算法所处理的输入的值域必须仔细定义
- 同样一种算法可以用几种不同的形式来描述
- 可能存在几种解决相同问题的算法
- 针对同一个问题的算法可能会基于完全不同的解题思路,而且解题速度也会完全不同。
欧几里得算法
求解任意两个数m(m>0)和n(n>0)的最大公约数,简称为欧几里得算法。
欧几里得递归算法
package 算法设计与分析;
public class DiGui {
public int getGCD(int m, int n) {
if (n == 0) {
return m;
} else {
return getGCD(n, m % n);
}
}
public static void main(String[] args) {
DiGui gcd = new DiGui();
int div = gcd.getGCD(90, 60);
System.out.println("最大公约数为:" + div);
}
}
欧几里得迭代算法
package 算法设计与分析;
import java.util.Scanner;
public class DieDai {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
System.out.println("请输入第一个数字");
int a = input.nextInt();
System.out.println("请输入第二个数字");
int b = input.nextInt();
int r = 1;
// a对b取余,b赋值给a 余数赋值给b,,直到 b == 0
do {
r = a % b;
a = b;
b = r;
}
while(b!=0);{
System.out.print("这两个数的最大公约数为"+a);
}
}
}
欧几里得连续整数检测算法
package chapter01;
import java.util.Scanner;
public class JianCe {
public static void main(String[] args) {
System.out.println("请输入两个正整数:");
Scanner scan = new Scanner(System.in);
Scanner scan2 = new Scanner(System.in);
int m = scan.nextInt();
int n = scan2.nextInt();
System.out.println("欧几里得算法求最大公约数是:" + gcd(m, n));
}
public static int gcd(int m,int n) {
int t;
if(m<n) {
t=m;
}else {
t=n;
}
while(m%t!=0||n%t!=0){
t--;
}
return t;
}
}
算法是用计算机解决某一类特定问题的一组规则的有穷集合,或则说是对特定问题求解步骤的一种描述,它是指令的有限序列。
算法的特征
- 输入:一个算法可以有零个或则多个输入,这些输入是在算法开始之前给出的量,它们取决于特定对象的集合,通常体现为算法中的一组变量。
- 输出:一个算法必须具有一个或多个输出,以反映算法对输入数据加工后的结果,这些输出是同输入有某种特定关系的量,实际上是输入的某种函数,不同取值的输入,产生不同的输出结果,没有输出的算法是没有意义的。
- 确定性:确定性算法指算法的每一个步骤都必须是有明确的定义的,必须是足够清楚的,无二义性的,确定性保证了以同样的输入多次执行一个算法时,必定产生相同的结果,否则一定出现了错误。
- 可行性:算法中所有的操作都必须足够基本,使算法的执行者或阅读者能明确其含义以及如何执行。它们可以通过已经实现的基本运算执行有限次数来实现。
- 有穷性:算法的有穷性是指算法必须总能在执行有限步骤之后终止,且每一步的时间也是有限的。
算法的基本要素
一个算法通常由两种基本要素组成,一种是对数据对象的运算和操作,二是算法的控制结构。
①对数据对象的运算和操作
- 算术运算:包括加,减,乘,除等运算。
- 逻辑运算:包括与,或,非等运算。
- 关系运算:包括大于,小于,等于,不等于等运算。
- 数据传输:包括赋值,输入,输出等操作。
②算法的控制结构
- 一个算法的功能不仅取决于选用的操作,而且还与各操作之间的执行顺序有关,算法中各操作之间的执行顺序称为算法的控制结构。
算法描述的工具
①自然语言:就是直接将设计者完成任务的思维过程用母语记录下来。
②流程图:是用规定的图形,流程线,文字说明表示算法的方法,是一种图形方式的描述手段,流程图可以清晰的描绘出完成解题任务的方法及步骤,是最早的算法描述工具。
③N-S流程图:这种流程图适用于结构化程序设计,能清楚的显示出程序的结构,是一种结构化的流程图。
④伪代码:伪代码是用介于自然语言和计算机语言之间的文字和符号描述算法,是一种描述语言。
算法与程序和数据结构之间的关系
①算法与程序
- 算法代表了对特定问题的求解,是行为的说明,是一组逻辑步骤,而计算机程序则是算法用某种程序设计语言的表述,是算法在计算机上的具体实现,执行一个程序就是执行一个用计算机语言表述的算法。
- 算法在描述上一般使用半形式化的语言,而程序是用形式化的计算机语言描述的,是使用一些特殊编程语言表达的算法。
- 一个算法可以用不同的编程语言编出不同的程序,但他们遵循的逻辑步骤是相同的,它们都表达同样的算法,它们不是同样的程序 ②算法与数据结构
- 算法是数据结构的灵魂,算法的结构和选择在很大程度上依赖于数据结构,数据结构是算法的基础,“算法+数据结构=程序”
问题求解的过程
问题及问题的求解过程
一个计算机开发的过程就是使用计算机求解问题的过程,软件工程将软件开发和维护过程分为若干阶段,称为生命周期或软件生命周期。
分为分析,设计,编码,测试和维护五个阶段。
算法设计和分析的步骤
①理解问题:在设计算法前首先要做的就是完全理解所给出的问题,明确定义所要求的问题,并用恰当的方式表示问题
②设计方案:求解问题时,考虑从何处下手,考虑选择何种问题求解策略和技术进行求解,以得到问题求解的算法。
③实现方案:实现求解问题的算法,使用问题进行测试,验证。
④回顾复查:检查该求解方法是否确实求解了问题或达到了目的。
⑤评估算法:考虑该解法是否可以简化,改进和推广。、
算法设计与算法表示
算法的求解过程
算法分为精确算法和启发式算法。精确算法就是总能保证求得问题的解;启发式算法通过使用某种规则,简化或智能猜测来减少问题求解的时间。对于最优问题的解,一个算法如果致力于寻找近似解而不是最优解,被称为近似算法,如果在算法中需做出某些随机选择,则称为随机算法。
算法设计策略
算法设计策略是使用算法解题的一般性方法,可用于解决不同领域的多种问题,算法设计方法主要有:分治策略,贪心算法,动态规划,回溯法,分支限界法等。
算法的表示
算法需要用一种语言来描述,算法的表示是算法思想的表示形式,算法应该用没有歧义的算法语言来描述,不能具有二义性。
算法的确认和算法分析
确认一个算法是否正确称为算法确认其目的在于确认一个算法是否能正确无误的工作,即证明算法对所有可能的合法输入都能得出正确的答案。
算法证明
算法证明与算法描述语言无关。使用数学工具证明算法的正确性,称为算法证明。算法证明常用的方法是数学归纳法。
算法测试
程序测试是指对程序模块或程序总体,输入事先准备好的样本数据(测试用例)检查程序的输出,来发现程序存在的错误及判定程序是否满足其设计要求。
调试只能指出有错误,而不能指出它们不存在错误。测试的目的是发现错误,调试是诊断和纠正错误。
算法分析
算法分析是对算法利用时间资源和空间资源的效率进行研究。算法分析活动对算法的执行时间和所需的存储空间进行估算。算法分析不仅可以预防算法能是否有效的完成任务,而且可以知道在最好,最坏和平均情况下的运行时间。使用样本数据可以测量一个程序所消耗的时间和空间,这称为程序的性能测量。
算法的复杂性分析
采用一个合适的算法的,解决问题的速度会大大提高,评价一个算法的好坏主要看执行算法时需要花费的计算机CPU时间的多少和需要占用的计算机村存储空间的大小。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
需的存储空间进行估算。算法分析不仅可以预防算法能是否有效的完成任务,而且可以知道在最好,最坏和平均情况下的运行时间。使用样本数据可以测量一个程序所消耗的时间和空间,这称为程序的性能测量。
算法的复杂性分析
采用一个合适的算法的,解决问题的速度会大大提高,评价一个算法的好坏主要看执行算法时需要花费的计算机CPU时间的多少和需要占用的计算机村存储空间的大小。
[外链图片转存中…(img-wF1yyaTa-1715725744051)]
[外链图片转存中…(img-f68yIxJw-1715725744051)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新