数据结构与算法基础
数据结构简介:
数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及它们之间的关系和操作等相关问题的学科。
数据结构的基本操作的设置的最重要的准则是,实现应用程序与存储结构的独立。实现应用程序是“逻辑结构”,存储的是“物理结构”。逻辑结构主要是对该结构操作的设定,物理结构是描述数据具体在内存中的存储(如:顺序结构、链式结构、索引结构、希哈结构)等。
数据:所有能被输入到计算机中,且能被计算机处理的符号的集合。是计算机操作的对象的总称。
数据元素:数据(集合)中的一个“个体”,数据及结构中讨论的基本单位
数据项:数据的不可分割的最小单位。一个数据元素可由若干个数据项组成。
数据类型:在一种程序设计语言中,变量所具有的数据种类。整型、浮点型、字符型等等
- 数据结构示意图
数据的逻辑结构:数据之间的相互关系。
在数据结构中,从逻辑上可以将其分为线性结构和非线性结构
集合:结构中的数据元素除了同属于一种类型外,别无其它关系。
线性结构:数据元素之间一对一的关系
树形结构:数据元素之间一对多的关系
图状结构或网状结构: 结构中的数据元素之间存在多对多的关系
数据的物理结构/存储结构:数据在计算机中的表示。
物理结构是描述数据具体在内存中的存储(如:顺序结构、链式结构、索引结构、哈希结构)等
顺序存储结构:是把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的。数组就是顺序存储结构的典型代表。
链式存储结构:是把数据元素存放在内存中的任意存储单元里,也就是可以把数据存放在内存的各个位置。这些数据在内存中的地址可以是连续的,也可以是不连续的。
- 顺序存储结构和链式存储结构的区别:
比如去银行取钱,顺序存储结构就相当于,所有的客户按照先来后到的顺序有序的的坐在大厅的椅子上(注意:是有顺序的坐着哦)。
而链式存储结构相当于,所有的客户只要一到银行,大堂经理就给他们每人一个号码,然后他们可以随便坐在哪个椅子上(随便坐,不需要按照什么顺序坐),只需要等待工作人员广播叫号即可。
而每个客户手里的号码就相当于指针,当前的指针指向下一个存储空间,这样,所有不连续的空间就可以被有顺序的按照线性连接在一起了。
算法:
是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制
- 算法的特性:
输入
一个算法具有零个或者多个输出。以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件。后面一句话翻译过来就是,如果一个算法本身给出了初始条件,那么可以没有输出。
输出
算法至少有一个输出。也就是说,算法一定要有输出。输出的形式可以是打印,也可以使返回一个值或者多个值等。也可以是显示某些提示。
有穷性
算法的执行步骤是有限的,算法的执行时间也是有限的。
确定性
算法的每个步骤都有确定的含义,不会出现二义性。
可行性
算法是可用的,也就是能够解决当前问题。
当然,回过头来一看,这五个特性都是废话,并且依稀记得大学老师都教过。所以,我们不用浪费脑力在这些不必要的概念上,因为大学早已离我远去,考试什么的跟我也没有一毛钱关系,只要知道这么回事就好。
- 算法的设计要求
要设计一个好的算法,需要考虑以下4个特性(其实多半是废话)。
正确性
废话,谁会设计一个不能够解决问题的方法。
可读性
指算法无论是从设计思路上,还是从注释方面,都要能够保证算法是可读的,也就是可以被其他人员能够读懂的。其实也是废话,这是一个优秀的程序员必备的。
健壮性
通俗的讲,一个好的算法应该具有捕获异常/处理异常的能力。另外,对于测试人员的压力测试、边界值测试等***难的测试手段,算法应该能够轻松的扛过去。
时间效率高和存储量低
这其实是两个概念,时间效率就是指的时间复杂度,存储量就是指的空间复杂度。翻译过来就是一个好的算法应该考虑时间复杂度和空间复杂度。而往往时间复杂度和空间复杂度是相互弥补的。