共计 2537 个字符,预计需要花费 7 分钟才能阅读完成。
前言
为什么要学习数据结构和算法,这里我举个简略的例子。
编程好比是一辆汽车,而数据结构和算法是汽车外部的变速箱。一个开车的人不懂变速箱的原理也是能开车的,同理一个不懂数据结构和算法的人也能编程。然而如果一个开车的人懂变速箱的原理,比方升高速度来取得更大的牵引力,或者通过升高牵引力来取得更快的行驶速度。那么爬坡时应用 1 档,便能够取得更大的牵引力;下坡时便应用低档限度车的行驶速度。
回到编程而言,比方将一个班级的学生名字要长期存储在内存中,你会抉择什么数据结构来存储,数组还是 ArrayList,或者 HashSet,或者别的数据结构。如果不懂数据结构的,可能轻易抉择一个容器来存储,也能实现所有的性能,然而前期如果随着学生数据量的增多,轻易抉择的数据结构必定会存在性能问题,而一个懂数据结构和算法的人,在理论编程中会抉择适当的数据结构来解决相应的问题,会极大的进步程序的性能。
数据结构
数据结构是计算机存储、组织数据的形式,指相互之间存在一种或多种特定关系的数据元素的汇合。
通常状况下,精心抉择的数据结构能够带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术无关。
1、数据结构的基本功能
- 如何插入一条新的数据项
- 如何寻找某一特定的数据项
- 如何删除某一特定的数据项
- 如何迭代的拜访各个数据项,以便进行显示或其余操作
2、罕用的数据结构
这几种构造优缺点如下:先有个大略印象,前面会具体解说!!!
对于数组,你们所说的查找快,我想只是随机查找快,因为晓得数组下标,能够按索引获取任意值。然而你要查找某个特定值,对于无序数组,还是须要遍历整个数组,那么查找效率是 O(n),效率是很低的(有序数组依照二分查找算法还是很快的)。
插入快,是在数组尾部进行插入,获取到数组的最初一个索引下标,加 1 进行赋值就能够了。
删除慢,除开尾部删除,在任意两头或者后面删除,前面的元素都要整体进行平移的,所以也是比较慢的。
综上所述:对于数组,随机查找快,数组尾部增删快,其余的操作效率都是很低的。
算法
算法简略来说就是解决问题的步骤。
在 Java 中,算法通常都是由类的办法来实现的。后面的数据结构,比方链表为啥插入、删除快,而查找慢,均衡的二叉树插入、删除、查找都快,这都是实现这些数据结构的算法所造成的。前面咱们讲的各种排序实现也是算法领域的重要畛域。
1、算法的五个特色
- 有穷性:对于任意一组非法输出值,在执行又穷步骤之后肯定能完结,即:算法中的每个步骤都能在无限工夫内实现。
- 确定性:在每种状况下所应执行的操作,在算法中都有确切的规定,使算法的执行者或阅读者都能明确其含意及如何执行。并且在任何条件下,算法都只有一条执行门路。
- 可行性:算法中的所有操作都必须足够根本,都能够通过曾经实现的基本操作运算无限次实现之。
- 有输出:作为算法加工对象的量值,通常体现在算法当中的一组变量。有些输入量须要在算法执行的过程中输出,而有的算法外表上能够没有输出,实际上已被嵌入算法之中。
- 有输入:它是一组与“输出”有确定关系的量值,是算法进行信息加工后失去的后果,这种确定关系即为算法性能。
2、算法的设计准则
- 正确性:首先,算法该当满足以特定的“规定阐明”形式给出的需要。其次,对算法是否“正确”的了解能够有以下四个档次:
- 程序语法错误。
- 程序对于几组输出数据可能得出满足需要的后果。
- 程序对于精心抉择的、典型、刻薄切带有刁难性的几组输出数据可能得出满足要求的后果。
- 程序对于所有非法的输出数据都能失去满足要求的后果。
PS:通常以第 三 层意义的正确性作为掂量一个算法是否合格的规范。
- 可读性:算法为了人的浏览与交换,其次才是计算机执行。因而算法应该易于人的了解;另一方面,艰涩难懂的程序易于暗藏较多的谬误而难以调试。
- 健壮性:当输出的数据非法时,算法该当失当的做出反馈或进行相应解决,而不是产生莫名其妙的输入后果。并且,解决出错的办法不应是中断程序执行,而是该当返回一个示意谬误或谬误性质的值,以便在更高的抽象层次上进行解决。
- 高效率与低存储量需要:通常算法效率值得是算法执行工夫;存储量是指算法执行过程中所须要的最大存储空间,两者都与问题的规模无关。
后面三点 正确性,可读性和健壮性置信都好了解。对于第四点算法的执行效率和存储量,咱们晓得比拟算法的时候,可能会说“A 算法比 B 算法快两倍”之类的话,但实际上这种说法没有任何意义。因为当数据项个数发生变化时,A 算法和 B 算法的效率比例也会发生变化,比方数据项减少了 50%,可能 A 算法比 B 算法快三倍,然而如果数据项缩小了 50%,可能 A 算法和 B 算法速度一样。
所以形容算法的速度必须要和数据项的个数分割起来。也就是“大 O”表示法,它是一种算法复杂度的绝对示意形式,这里我简略介绍一下,前面会依据具体的算法来形容。
绝对(relative):你只能比拟雷同的事物。你不能把一个做算数乘法的算法和排序整数列表的算法进行比拟。然而,比拟 2 个算法所做的算术操作(一个做乘法,一个做加法)将会通知你一些有意义的货色;
示意 (representation):大 O(用它最简略的模式) 把算法间的比拟简化为了一个繁多变量。这个变量的抉择基于察看或假如。
例如,排序算法之间的比照通常是基于比拟操作(比拟 2 个结点来决定这 2 个结点的绝对程序)。这外面就假如了比拟操作的计算开销很大。然而,如果比拟操作的计算开销不大,而替换操作的计算开销很大,又会怎么样呢?这就扭转了先前的比拟形式;
复杂度(complexity):如果排序 10,000 个元素破费了我 1 秒,那么排序 1 百万个元素会花多少工夫?在这个例子里,复杂度就是绝对其余货色的度量后果。
而后咱们在说说算法的存储量,包含:
程序自身所占空间;
输出数据所占空间;
辅助变量所占空间;
一个算法的效率越高越好,而存储量是越低越好。
总结
本篇文章咱们简略的介绍了数据结构和算法的概念,算法是解决问题的步骤,而数据结构的实现离不开算法,可能了解起来比拟含糊,不必放心,前面咱们会在具体的数据结构和算法实现过程中具体解说。
写在最初
欢送大家关注我的公众号【惊涛骇浪如码】,海量 Java 相干文章,学习材料都会在外面更新,整顿的材料也会放在外面。
感觉写的还不错的就点个赞,加个关注呗!点关注,不迷路,继续更新!!!