1.简介
接下来我们将梳理数据结构和算法,为什么要学习数据结构和算法,这里我举个简单的例子。
编程好比是一辆汽车,而数据结构和算法是汽车内部的变速箱。
一个开车的人不懂变速箱的原理也是能开车的,同理一个不懂数据结构和算法的人也能编程。
但是如果一个开车的人懂变速箱的原理,比如降低速度来获得更大的牵引力,或者通过降低牵引力来获得更快的行驶速度。
那么爬坡时使用1档,便可以获得更大的牵引力;下坡时便使用低档限制车的行驶速度。
回到编程而言,比如将一个班级的学生名字要临时存储在内存中,你会选择什么数据结构来存储,
数组还是ArrayList,或者HashSet,或者别的数据结构。
如果不懂数据结构的,可能随便选择一个容器来存储,也能完成所有的功能,
但是后期如果随着学生数据量的增多,随便选择的数据结构肯定会存在性能问题,
而一个懂数据结构和算法的人,在实际编程中会选择适当的数据结构来解决相应的问题,会极大的提高程序的性能。
1.1数据结构
数据结构是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。
通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。
数据结构往往同高效的检索算法和索引技术有关。
1.1.1数据结构的基本功能
- 如何插入一条新的数据项
- 如何寻找某一特定的数据项
- 如何删除某一特定的数据项
- 如何迭代的访问各个数据项,以便进行显示或其他操作
1.1.2常用的数据结构
- 数组Array
- 栈Stack
- 队列Queue
- 链表Linked List
- 树Tree
- 哈希表Hash
- 堆Heap
- 图Graph
这几种数据结构的优缺点如下:
| 数据结构 | 优点 | 缺点 |
|---|---|---|
| 数组 | 插入快 | 查找慢,删除慢,大小固定,只能存储单一元素 |
| 有序数组 | 比无序数组查询快 | 插入慢,删除慢,大小固定,只能存储单一元素 |
| 栈 | 提供后进后出的存取方式 | 存取其他项很慢 |
| 队列 | 提供先进先出的存取方式 | 存取其他项很慢 |
| 链表 | 插入快 | 删除慢 查找慢 |
| 二叉树 | 如果树是平衡的,则查找、插入、删除都快 | 删除算法复杂 |
| 红黑树 | 查找、插入、删除都快 | 树总是平衡的算法复杂 |
| 2-3-4树 | 查找、插入、删除都快。树总是平衡的。类似的树对磁盘存储有效 | 算法复杂 |
| 哈希表 | 如果关键字已知则存取极快 | 删除慢,如果不知道关键字存取慢,对存储空间使用不充分 |
| 堆 | 插入、删除快,对最大数据项存取快 | 对其他数据存取慢 |
| 图 | 对现实世界建模 | 有些算法慢且复杂 |
1.2算法
算法简单来说就是解决问题的步骤。
在Java中,算法通常都是由类的方法来实现的。
前面的数据结构,比如链表为啥插入、删除快,而查找慢,平衡的二叉树插入、删除、查找都快,
这都是实现这些数据结构的算法所造成的。
后面我们讲的各种排序实现也是算法范畴的重要领域。
1.2.1算法的五个特征
- 有穷性:对于任意一组合法输入值,在执行又穷步骤之后一定能结束,即:算法中的每个步骤都能在有限
时间内完成。 - 确定性:在每种情况下所应执行的操作,在算法中都有确切的规定,使算法的执行者或阅读者都能明确其
含义及如何执行。并且在任何条件下,算法都只有一条执行路径。 - 可行性:算法中的所有操作都必须足够基本,都可以通过已经实现的基本操作运算有限次实现之。
- 有输入:作为算法加工对象的量值,通常体现在算法当中的一组变量。有些输入量需要在算法执行的过程
中输入,而有的算法表面上可以没有输入,实际上已被嵌入算法之中。 - 有输出:它是一组与“输入”有确定关系的量值,是算法进行信息加工后得到的结果,这种确定关系即为算
法功能。
1.2.2算法的基本原则
- 正确性:算法应当满足以特定的“规则说明”方式给出的需求。
- 可读性:算法为了人的阅读与交流,其次才是计算机执行。因此算法应该易于人的理解;另一方面,晦涩
难懂的程序易于隐藏较多的错误而难以调试。 - 健壮性:当输入的数据非法时,算法应当恰当的做出反应或进行相应处理,而不是产生莫名其妙的输出结
果。并且,处理出错的方法不应是中断程序执行,而是应当返回一个表示错误或错误性质的值,以便在更高的抽象
层次上进行处理。 - 高效率与低存储量需求:通常算法效率值得是算法执行时间;存储量是指算法执行过程中所需要的最大存
储空间,两者都与问题的规模有关。
总结
本篇文章我们简单的介绍了数据结构和算法的概念,算法是解决问题的步骤,而数据结构的实现离不开算法,
可能理解起来比较模糊,不用担心,后面我们会在具体的数据结构和算法实现过程中详细讲解。
联系作者
微信公众号
xiaomingxiaola
(BossLiu)
QQ群
58726094
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 384276224@qq.com