0.前言
好久没写博客了,今天算是重出江湖了吧,以后会记着坚持写的。
最近在学习数据结构,参考教材是严蔚敏的《数据结构(C语言版)》第二版,至于为什么用第二版,或许是觉得这本书看着要顺眼一些吧(😂),同时还在看国嵌的数据结构视频。
1.基本概念和术语
计算机的程序是用来处理一些信息和数据的,那么什么是程序呢?国嵌里是这样说的,程序是为了实际问题而存在的,从本质上来说,程序是解决问题的步骤描述。
评鉴一个程序:用尽量少的内存空间解决问题;用尽量少的步骤解决问题。用咱们的古话来说叫做大道至简,或者叫做事情要化繁就简。
如何合理地组织数据、高效地处理数据,这就是数据结构主要研究的问题。数据结构主要研究非数值计算程序问题中的对象以及它们之间的关系。
数据:客观事物的符号表示,它是程序的操作对象,用于描述客观事物。它的特点有:1.可以输入到计算机中;2.可以被计算机程序处理。
数据元素:数据的基本单位,在计算机中通常作为一个整体进行考虑和处理。
数据项:组成数据元素的、有独立含义的、不可分割的最小单位。
数据对象:性质相同的数据元素的集合,是数据的一个子集。只要集合内的元素性质相同,都可称之为一个数据对象。
数据元素之间不是独立的,存在特定的关系,则这些关系就是结构。数据结构是相互之间存在一种或多种特定关系的数据元素的集合。
数据结构包括逻辑结构和存储结构两个层次。
逻辑结构与数据的存储无关,是独立于计算机的。它有两个要素,一是数据元素,二是关系,通常有四类基本结构。
1.集合结构:数据元素间除了“属于同一集合”的关系外,别无其他关系。
2.线性结构:数据元素之间存在着一对一的关系。
3.树形结构:数据元素之间存在一对多的关系。
4.图形结构:数据元素之间存在多对多的关系。
其中集合结构、属性结构和图形结构都属于非线性结构。
数据对象在计算机中的存储表示称为数据的存储结构,也称为物理结构。数据元素在计算机中有两种基本的存储结构,分别是顺序存储结构和链式存储结构。
顺序存储结构:将数据存储在地址连续的存储单元里。
链式存储结构:将数据存储在任意存储单元里,通过保存地址的方式找到相关联的数据元素。
2.算法与算法分析
2.1.算法
算法是为了解决某类问题而规定的一个有限长的操作序列。它是独立存在的一种解决问题的思想和方法。
对于程序而言,要做到高效,那就要在数据结构的基础上设计和选择算法。算法是为了解决实际问题而设计的,数据结构是算法需要处理的问题载体,数据结构与算法相辅相成。
程序 = 数据结构 + 算法
算法有5个重要特性:
1.输入:算法具有0个或多个输入;
2.输出:算法至少有1个或多个输出;
3.有穷性:算法在有限个步骤之后会自动结束而不会无限循环,并且每一步骤都在有限时间内完成;
4.确定性:算法中的每一步都有确定的含义,不会出现二义性;
5.可行性:算法的每一步都是可行的。
2.2.算法的设计准则
1.正确性:
(1)算法对于合法数据能够得到满足要求的结果;
(2)算法能够处理非法输入,并能得到合理的结果。
2.可读性:
算法要方便阅读,理解和交流。(最容易被忽视,程序是给人看的,而不是计算机)
3.健壮性:
算法能够正确处理非法数据,不会产生莫名其妙的结果。
4.高效性:
或者叫做高性价比,也就是利用最少的时间和资源得到满足要求的结果,时间复杂度和空间复杂度要尽量小。
2.3.算法效率的度量
影响算法效率的主要因素有:1)算法采用的策略和方法;2)问题的输入规模;3)编译器所产生的代码;4)计算机执行速度。
我们该如何衡量一个算法的效率呢?我们可以从时间复杂度和空间复杂度两个方面来讨论。
2.3.1.时间复杂度
一般情况下,算法中基本语句重复执行的次数是问题规模n的某个函数f(n),算法的时间量度记作:
T(n)=O(f(n))
它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称做时间复杂度。
我们通常用大O表示法来描述时间复杂度,例如下面三段代码:
{++x; s = 0;}
for (i = 1; i <= n; ++j) { ++s; }
for (j = 1; j <= n; ++j)
{
for (i = 1; i <= n; i++)
{
++s;
}
}
它们的时间复杂度分别是O(1)、O(n)、O(n²)。
2.3.2.空间复杂度
算法的空间复杂度通过计算算法的存储空间实现,它也是问题规模n的函数,记作:
S(n)=O(f(n))
其中n为问题规模,f(n)为在问题规模为n时所占用存储空间的函数。
初次接触数据结构,如有不对,欢迎各位大佬指正