前篇

什么是数据结构?学习数据结构有什么用?

  • 如何用程序代码把现实世界的问题信息化
  • 如何使用计算机处理这些信息从而创造价值

image-20241025104534231

什么是数据?

​ 它是信息的载体,是描述客观事物属性的数字、字符以及所有能输入到计算机里并且可以被计算机程序识别和处理的符号的集合。

​ 比如,一个人,高180cm,那么可以用hight代表身高,所以用数据来描述这个人的属性就是hight:180cm,这就是数据,而用数据描述客观事物属性的人,也可以称作“数据艺术家”。

数据类型

数据类型可以分为原子类型和结构类型。

原子类型:值不可以再分的数据类型(int、double)

结构类型:值可以再分解为若干分量的数据类型(struct定义的数据类型)

抽象数据类型(ADT)

​ 抽象数据之间的结构关系,数据的组织,以及可以执行什么样的操作

什么是数据对象、数据结构

image-20241025104750852

​ 数据对象是一个集合,这个集合里面是一些具有相同性质的数据元素,也就是具有一些相同属性(身高、年龄)的个体(数据元素),它是数据的一个子集。它针对每个数据元素的内容,而不针对数据元素之间的关系。

image-20241025104809412

​ 数据结构就是数据元素互相之间存在一种,或者多种特定关系的数据元素的集合,也就是用来描述各个数据对象之间的关系。它针对于关系,而不是每个数据元素的内容。

数据结构的三要素

逻辑结构和数据的运算两个要素就可以定义一个数据结构,而物理结构(存储结构)这个要素则是主要对于如何实现这个数据结构需要考虑的要素,因此对于一个数据结构的使用者,只需要知道前两个要素即可,相当于定义一个抽象数据类型

逻辑结构

集合结构

image-20241025105119872

比如中国400个富豪的集合

线性结构

image-20241025105222960

重点在于他是一对一的关系

树形结构

image-20241025105324183

重点在于他是一对多的关系

图状结构

image-20241025105403981

重点在于他是多对多的关系

数据的运算

对于某种逻辑结构,结合实际的需求,定义的基本运算(操作)

​ 对于线性结构,可能需要定义一些查找、增加、替换、删除等操作,而使用计算机实现这些操作就是对数据的基本运算(操作)。

物理结构(存储结构)

为了方便,这里只使用线性结构讨论这几种实现方式,数据结构的分类可以说为顺序存储和非顺序存储(离散存储)

采用不同的数据结构会影响存储空间分配的方便程度,会影响对数据的运算速度

顺序存储

image-20241025110026955

​ 在内存中是连续的,不间断的,因此它的劣势也很明显,需要一大片连续的空间,并且考虑实际应用的话,对于增删改查不方便。

链式存储

image-20241025110153055

​ 在内存中是不连续的,主要是靠指针来指向下一个元素,优势在于不需要连续的地址,哪里有空放哪里,对于它的基本操作也就主要对于其指针进行操作。

索引存储

image-20241025110354080

​ 和链式存储很像,离散的,但是它主要是靠索引表来对元素进行操作、排序。

散列存储

​ 根据元素的关键字直接计算出该元素的存储地址,又称哈希存储。比较复杂,后面在做讨论。

算法

image-20241028101414571

什么是算法?

​ 程序=数据结构+算法,算法,就是如何高效的处理数据

​ 算法是对问题求解步骤的一种描述,是指有限序列,其中每条指令表示一个或多个操作,例如番茄炒蛋?步骤就是算法,食材就是数据,是输入,程序就是结合的过程,番茄炒蛋就是输出。

算法的特性

  1. 有穷性:一个算法必须在执行又穷步之后结束,并且每一步都可以在又穷时间内完成。算法是有穷的,程序可以是无穷的。
  2. 确定性:算法中每条指令必须有确切的定义,是无歧义的,对于相同的输入只能得出相同的输出。
  3. 可行性:算法中的操作都可以通过计算机来实现。
  4. 输入:一个算法有零个或多个输入。
  5. 输出:一个算法有一个或多个输出。

什么是一个好的算法呢?

  1. 正确性:能够正确的解决问题。但是不能正确解决问题的算法也是算法,只不过不能说是一个好的算法。
  2. 可读性:好的算法应该具有良好的可读性,帮助理解,方便队友或者自己。
  3. 健壮性:输入非法数据时,算法能够适当做出反应或处理,而不会有莫名其妙的输出结果。
  4. 高效率和地存储量需求:时间复杂度低、空间复杂度低,花的时间少,不费内存。

如何计算时间复杂度

用于评价一个算法的时间开销的一个指标,运行时间长就不优秀?时间短就优秀?和机器性能有关,和编程语言有关,和编译程序产生的机器指令质量有关。因此不能事后统计算法优劣,会有很多外界因素的影响以及例如导弹控制算法,是无法事后统计的。

时间复杂度:T与问题规模n的关系T(n)。

image-20241029094648801

空间复杂度

是空间开销(内存开销)S(n)和问题规模n之间的关系

如果 S(n)=O(1)那么这个算法就是可以原地工作--算法所需要的内存空间为常量

image-20241029152049266

posted @ 2024-10-25 11:23  system639  阅读(18)  评论(0)    收藏  举报