数据结构与算法知识学习小结_刘鑫婷的博客
一、数据结构
1、概念：数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。它主要描述的是用计算机存储和组织数据的方式。数据结构又分为逻辑结构、（存储）物理结构和数据的运算三个部分。
2、瑞士著名计算机科学家尼古拉斯.沃思（Niklaus.Wirth）提出了“算法+数据结构=程序”的观点，说明了数据结构的重要性。而是否能够熟练地选择和设计各种业务逻辑的数据结构和算法是区分程序设计人员水平高低的一个重要标志。因此，学好数据结构的目的是能使学生更快地编写出更高效的程序。
3、数据结构中的逻辑结构包括了以下四种结构：
（1）线性结构：数据元素之间存在着一对一的线性关系；除了第一个和最后一个数据元素之外，其余每个数据元素都只有一个前驱和一个后继数据元素。
（2）树形结构：数据元素之间存在着一对多的层次关系；除了根结点外，其余每个数据元素都只有一个前驱数据元素，以及零个或若干个后继数据元素。
（3）图（网）状结构：数据元素之间存在着多对多的任意关系；每个数据元素可有零个或若干个前驱数据元素和零个或若干个后继数据元素。
（4）集合：数据元素之间除了“同属于一个集合”的相互关系外，就没有其他关系了。
4、数据结构中的（存储）物理结构指的是数据的逻辑结构在计算机中的存储形式。它分为
（1）顺序存储结构：是把数据元素按顺序存放在一组存储地址连续的存储单元里，它的数据元素之间的逻辑关系和物理关系是一致的。
（2）链式存储结构：是把数据元素存放在任意的存储单元里，它的存储地址可为连续，也可以是不连续的；它的数据元素之间的物理关系不能够反映逻辑关系，所以要用指针来表示数据元素之间的逻辑关系。
5、数据结构中的逻辑结构和（存储）物理结构是密切相关的，任何一个算法的设计都是取决于选定的数据逻辑结构的，而算法的实现却是依赖于所采用的存储结构的。
二、算法
1、算法是解决问题的方法，是程序设计的精髓，程序设计的实质就是构造解决问题的算法。算法的设计取决于数据的逻辑结构，算法的实现取决于数据的物理存储结构。
2、概念：算法是对特定问题求解步骤的一种描述，它是指令的有限序列，其中每一条指令表示一个或多个操作。
3、算法具有以下五个重要特性：
（1）有穷性：是指一个算法应包含有限个操作步骤，而且这个算法在执行若干个步骤之后还能够自动结束而不是出现无限循环，并且每一步都在有限时间内完成。
（2）确定性：是指算法中的每一步都必须有确切的含义，不能产生二义性。
（3）可行性：是指算法中的每一个步骤都应该是能有效地执行，并得到确定的结果。
（4）输入：是指在算法执行时，从外界取得必要的数据。计算机运行程序的目的是为了进行数据处理，在大多数情况下，这些数据需要通过输入得到。有些情况下，数据已经包含在算法中，算法执行时不需要任何数据，所以一个算法可以有零个或多个输入。
（5）输出：是指一个算法至少有一个或多个输出，这是算法进行数据处理后的结果。没有输出的算法是毫无意义的。
正是算法的这些特性，约束了程序设计人员正确地书写算法，并使之能够正确无误地执行，从而达到了求解问题的预期效果。
4、算法设计的好坏关乎程序的执行效率，算法的设计必须满足下列四个要求：
（1）正确性。正确性的含义是算法对于一切合法的输入数据都能够得出满足要求的结果。但事实上要验证算法的正确性是极为困难的，因为通常情况下合法的输入数据量太大，用穷举法逐一验证是不现实的。所谓的算法正确性是指算法达到了测试要求。
（2）可读性。算法的可读性是指人对算法阅读理解的难易程度。可读性高的算法便于交流，有利于算法的调试和修改。通常增加算法的可读性是在书写算法时采用按缩进格式书写、分模块书写等方法。
（3）健壮性。对于非法的输入数据，算法能给出相应的响应，而不是产生不可预料的后果。
（4）效率与低存储量需求。效率指的是算法的执行时间；对于解决同一问题的多个算法，执行时间短的算法效率高。存储量需求指算法执行过程中所需要的最大存储空间；存储量需求越小的算法效率越高。
5、算法的效率包括时间与空间两个方面，分别称为时间复杂度和空间复杂度。
6、算法的时间复杂度就是算法的时间度量，随问题规模n的增大，算法的执行时间的增长率和f（n）的增长率相同，称作算法的渐进时间复杂度，简称为时间复杂度，记作T(n)=O(f(n))。其中，执行次数 T(n) 是关于问题规模 n 的函数，f（n）是问题规模n的某个函数。
7、可用算法中语句的执行次数来度量一个算法的效率。
8、语句频度是指语句在一个算法中重复执行的次数。
9、算法的时间复杂度越低，效率越高。算法的时间复杂度从小到大依次排序为：O(1)常数阶、O(log2n)对数阶、O(n)线性阶、O(nlog2n)、O(n2)平方阶、O(n3)立方阶、O(2n)指数阶。
10、算法的空间复杂度是作为算法所需存储空间的量度，记做S(n) = O (f(n))。其中，n为问题的规模；f（n）为语句关于n的所占存储空间的函数。注意：
（1）一般情况下，一个程序在机器上运行时，除了需要存储程序本身的指令、常数、变量和输入数据以外，还需要存储一些对数据进行操作的辅助存储空间。
（2）其中对于输入数据所占的具体存储量只取决于问题本身，和算法无关，这样只需要分析该算法在实现时所需的辅助空间单元数即可。
（3）若算法执行时所需的辅助空间相对于输入数据量而言是个常量，则称此算法为原地工作，空间复杂度为O(1)。
（4）因为算法的执行时间和存储空间的耗费是一对矛盾体，即算法执行的高效通常是以增加存储空间为代价的，反之亦然。
（5）就一般情况而言，常常是以算法执行时间做为算法优劣的主要衡量指标的。