1、为什么要学习数据结构与算法?
程序=数据结构+算法,不懂数据结构和算法也能编程,但是要写出高质量的代码必须了解数据结构与算法。
比如:要将一个用户的用户名称存储在内存中,你会选择什么数据结构来存储呢?是选择数组还是ArrayList或者HashSet,亦或是其它的数据结构呢?
如果你不懂数据结构,可能随便选择一个容器来存储,也能完成所有的功能。但是后期,随着用户数据量越来越多,不合适的数据结构肯定会存在性能问题。而懂数据结构与算法的人,在实际编程中会选择适当的数据结构来解决相应的问题,会极大的提高程序的性能。
2、什么是数据结构?
数据结构是计算机用来存储、组织数据的方式。选择适当的数据结构存储数据可以提高存储和运行效率。
而所有的数据结构必须具备如下四种基本功能:
1)、如何插入一条新的数据项
2)、如何查找某一特定的数据项
3)、如何删除某一特定的数据项
4)、如何迭代的访问各个数据项,以便进行显示或者其它操作。
3、常用的数据结构如下:
序号 | 数据结构 | 优点 | 缺点 |
1 | 数组 | 插入快 | 查找、删除慢,大小固定,只能存储同类型数据 |
2 | 有序数组 | 比无序数组查询快 | 插入、删除慢,大小固定,只能存储同类型数据 |
3 | 栈 | 先进后出的存取方式 | 存取其他项很慢 |
4 | 队列 | 先进先出的存取方式 | 存取其它项很慢 |
5 | 链表 | 插入快,删除快 | 查找慢 |
6 | 二叉树 | 如果树是平衡的,则查询、插入、删除都快 | 删除算法复杂 |
7 | 红黑树 | 查询、插入、删除都快,树总是平衡的,算法复杂 | 算法复杂 |
8 | 2-3-4树 | 查找、插入、删除都快,树总是平衡的 | 算法复杂 |
9 | 哈希表 | 如果关键字已知,则存取极快 | 删除慢,如果不知道关键字则存取慢,对存储空间使用不充分 |
10 | 堆 | 插入、删除快,对最大数据项存取快 | 对其它数据项存取慢 |
11 | 图 | 对现实世界建模 | 有些算法慢且复杂 |
4、什么是算法?
在java中,算法通常都是由类的方法来实现的。
前面提到的数据存储结构,如:链表为什么插入、删除快,而查找慢?平衡的二叉树为什么插入、查询、删除都快?这都是实现这些数据结构的算法所造成的。
5、算法的五个特征
1)、有穷性:算法在执行有穷步骤之后一定能得到结果,且每一步都必须在有穷时间内完成。
2)、确定性:对于每种情况下所执行的操作.在算法中都有确切的规定。使算法的执行者或阅读者都能明确其含义以及如何执行。
3)、可行性:算法中的所有操作都可以通过已经实现的基本操作运算执行有限次来实现。
4)、输入:一个算法有零个或多个输入。
当用函数描述算法时,输入往往是通过形参表示的。在它们被调用时,从主调函数获得输入值。
5)、输出:一个算法有一个或多个输出。输出是算法进行加工后得到的结果,如果没有输出的算法则没有任何意义。
当用函数描述算法时,输出多用返回值或引用类型的形参表示。
6、算法的设计原则
1、可读性
算法首先考虑人的阅读,其次才是计算机的执行。因此,算法应该易于人的理解。另外晦涩难懂的程序容易出错且难以调试。
2)、健壮性
当输入的数据非法时,算法应作出恰当的反应并处理,而不是产生莫名其妙的输出结果。并且,处理出错的方法不应该是中断程序执行,而是返回一个表示错误或错误性质的值,以便在更高的抽象层次上进行处理。
3)、正确性
算法至少应该具有输入、输出、加工处理后无歧义性、能正确反映问题的需要,能得到问题的正确答案。
4)、高效率和低存储量
算法的效率指算法的执行时间
算法的存储量指算法执行过程中所需要的最大存储空间
算法的执行效率与存储量与问题的规模有关。算法分析的任务是对涉及的每一个具体的算法,利用数学工具,讨论其复杂度,探讨具体算法对问题的适应性。