数据结构学习笔记(一)

知识点结构(转)

查看方式:在新标签页中打开图片查看 || 下载查看(图片太大太强了QAQ)

1 初识数据结构

这一段主要用来理清数据结构的一些相关概念。

1.1 数据结构基本概念

数据

数据(data)是事实或观察的结果,是对客观事物的逻辑归纳,是用于表示客观事物的未经加工的原始素材。 数据可以是连续的值,比如声音、图像,称为模拟数据。也可以是离散的,如符号、文字,称为数字数据。 在计算机系统中,数据以二进制信息单元0,1的形式表示。

——百度百科

数据是描述客观事物的符号,是计算机中可以操作的对象,能被计算机识别,并输入给计算机处理的符号集合。

数据元素

数据元素(data element)是计算机科学术语。它是数据的基本单位,数据元素也叫做结点或记录。

——百度百科

数据元素是组成数据的、有一定意义的基本单位,在计算机通常作为整体处理,也被称为记录。

数据项

数据项是指数据元素可由若干个数据项(data item)组成,数据项是数据的不可分割的最小单位。

——百度百科

1.2 数据结构形式

数据结构分类

数据结构是相互之间存在一种或多种特定关系的数据元素的集合。

逻辑结构
  • 集合结构
  • 线性结构
  • 树形结构
  • 图形结构
物理结构
  • 顺序存储结构
  • 链式存储结构

具体概念

逻辑结构:数据对象中数据元素之间的相互关系

集合结构:集合中的数据元素除了同属一个集合外,它们之间没有其他关系

线性结构:一个有序数据元素的集合;数据元素之间是“一对一”的关系的数据结构

树形结构:数据元素之间存在一种“一对多”的层次关系

图形结构:数据元素是“多对多”的关系

物理结构:数据的逻辑结构在计算机中的存储形式

顺序存储结构:数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的

链式存储结构:数据元素存放在任意存储单元里,存储单元可以是连续的,也可以是不连续的

逻辑结构与物理结构的关系

逻辑结构是面向问题的,物理结构是面向计算机的,其基本目标就是将数据及其逻辑关系存储到计算机的内存中。

1.3 程序

计算机程序是一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求的信息化工具。

——百度百科

A computer program is a collection of instructions that performs a specific task when executed by a computer.

——Wikipedia

程序的组成部分主要有算法数据结构

1.4 算法

算法:特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。

算法特性

  • 输入:算法有零个或多个输入
  • 输出:至少有一个或多个输出
  • 有穷性:算法在执行有限的步骤之后,自动结束而不会出现无限循环,并且一个步骤在可接受的时间内完成
  • 确定性:算法的每一个步骤都有确定含义,不会出现二义性
  • 可行性:算法的每一步必须是可行的,也就是说,每一步都能通过执行有限次数完成

算法设计要求

  • 正确性
  • 可读性
  • 健壮性
  • 时间效率高
  • 空间使用率低
  • 简单性

2 算法的复杂度

算法的时间复杂度是一个函数,它定性的描述该算法的运行时间。

算法的空间复杂度是对一个算法在运行过程中临时占用存储空间大小的度量。

2.1 算法分析的分类

平均情况

任意输入规模的期望运行次数

最坏情况

任意输入规模的最大运行次数

最好情况

任意输入规模的最小运行次数(通常最好情况不会出现)

2.2 时间复杂度--O渐进表示法

一般算法O(n)计算法

  1. 取常数1取代运行时间中的所有加法常数 (所以才会有O(1)时间复杂度的算法啊)
  2. 在修改后的运行次数函数中,只保留最高阶项
  3. 如果最高阶项系数存在且不是1,则去除与这个项相乘的常数($3x^2 \rightarrow x^2$)

分治算法的时间复杂度计算

  1. 二分搜索算法的时间复杂度是 $lgN$
  2. M分搜索算法的时间复杂度是 $log_mN$

递归算法的时间复杂度计算

递归总次数 $\times$ 每次递归次数

递归算法空间复杂度计算

N $\times$ 每次递归空间大小

3. 递归

3.1 递归定义

若一个对象的部分包含它自己或者该对象用它自己给自己定义,则称这个对象是递归的。

3.2 递归的过程

一个过程直接或间接的调用自己

3.3 递归的思想

把问题分解成规模更小的具有与原来问题相同解法的小问题

3.4 递归条件

  • 缩小问题规模,使新问题具有相同的解决方式
  • 设置递归的出口

3.5 递归分类

数据结构递归

问题解法递归

递归调用栈

尾递归

递归调用返回的结果总被直接返回

尾递归的本质

将单次计算的结果缓存起来,传递给下次调用,相当于自动累积

时间复杂度

递归总次数 $\times$ 每次递归次数

回溯法

  • 基本思想: 从一条路往前走,能进则进,不能进则退回来,换一条路再试。
  • 迷宫算法

回溯算法说白了就是穷举法。不过回溯算法使用剪枝函数,剪去一些不可能到达 最终状态(即答案状态)的节点,从而减少状态空间树节点的生成。

3.6 递归的优缺点

优点

  • 递归在解决某些问题的时候使得我们思考的方式得以简化,代码也更加简练,容易阅读
  • 在树的前序,中序,后序遍历算法中,递归的实现明显要比循环简单得多。

缺点

  • 递归的实质就是自己调用自己,而函数的调用开销是很大的,系统要为每次函数调用分配存储空间,并将调用点信息压栈,而在函数的调用结束后,还要释放空间,弹栈恢复断点。这些操作都需要时间。$\rightarrow$ 效率
  • 递归中很多计算都是重复的,由于其本质是把一个问题分解成两个或者多个小问题,多个小问题存在相互重叠的部分,则存在重复计算,如fibonacci斐波那契数列的递归实现。$\rightarrow$ 效率
  • 调用栈可能会溢出,其实每一次函数调用都会在内存栈中分配空间,进而每个进程的栈容量是有限的,当调用的层次太多时,就会超出栈的容量,导致栈溢出。 $\rightarrow$ 性能