【数据类型】数据类型笔记


该笔记内容根据浙江大学陈越、何钦铭老师的公开课 《数据结构》整理得到。

基本概念

抽象数据类型(Abstract Data Type)

仅描述数据对象集和相关操作集“是什么”,而不涉及“如何做到”。

  • 数据类型
    • 数据对象集
    • 数据集合相关联的操作集
  • 抽象:描述数据类型的方法不依赖于具体实现
    • 与存放数据的机器无关
    • 与数据存储的物理结构无关
    • 与实现操作的算法和编程语言无关

算法(Algorithm)

算法包括:

  • 一个有限指令集
  • 接收一些输入(有些情况下不需要输入)
  • 产生输出
  • 一定在有限步骤之后终止
  • 每一条指令必须
    • 有充分明确的目标,不可以有歧义
    • 计算机能处理的范围之内
    • 描述应不依赖于任何一种计算机语言以及具体的实现手段(指令的伪代码描述)

算法复杂度

好的算法需要考虑:

  • 空间占用
  • 乘法操作次数

分析算法效率时,考虑两方面:

  • 最坏情况复杂度 T w o r s t ( n ) T_{worst}(n)
  • 平均复杂度 T a v g ( n ) T_{avg}(n) (因为不同情况运行复杂度不一样,平均复杂度很难衡量)

算法复杂度的渐进表示法:

  • T ( n ) = O ( f ( n ) ) T(n)=O(f(n)) 表示存在常数 C > 0 , n 0 > 0 C>0,n_0>0 ,使得当 n n 0 n \ge n_0 时,有 T ( n ) C f ( n ) T(n) \le C \cdot f(n)
  • T ( n ) = Ω ( f ( n ) ) T(n)=\Omega (f(n)) 表示存在常数 C > 0 , n 0 > 0 C>0,n_0>0 ,使得当 n n 0 n \ge n_0 时,有 T ( n ) C f ( n ) T(n) \ge C \cdot f(n)
  • T ( n ) = Θ ( f ( n ) ) T(n)=\Theta (f(n)) 表示同时满足 T ( n ) = O ( f ( n ) ) T(n)=O(f(n)) T ( n ) = Ω ( f ( n ) ) T(n)=\Omega (f(n))

复杂度关系: O ( 1 ) < O ( log ( n ) ) < O ( n ) < O ( n log ( n ) ) < O ( n 2 ) < O ( n 3 ) < O ( 2 n ) < O ( n ! ) O(1)<O(\log(n))<O(n)<O(n\log(n))<O(n^2)<O(n^3)<O(2^n)<O(n!)

复杂度分析的运算法则:

  • 若两段算法的复杂度分别为 T 1 ( n ) = O ( f 1 ( n ) ) T_1(n)=O(f_1(n)) T 2 ( n ) = O ( f 2 ( n ) ) T_2(n)=O(f_2(n)) ,则
    • 当两段算法相接时, T 1 ( n ) + T 2 ( n ) = max ( O ( f 1 ( n ) ) , O ( f 2 ( n ) ) ) T_1(n)+T_2(n)=\max(O(f_1(n)),O(f_2(n)))
    • 当两段算法嵌套时, T 1 ( n ) × T 2 ( n ) = O ( f 1 ( n ) × f 2 ( n ) ) T_1(n) \times T_2(n)=O(f_1(n) \times f_2(n))

线性结构

线性表满足:

  • 元素有序地顺序存储
  • 大小有限

顺序存储:

  • 在元素的逻辑关系和存储空间上,都顺序相关

链表存储:

  • 仅在元素的逻辑关系上,顺序相关

广义表:

  • 广义表是线性表的推广
  • 广义表中的元素,可以是单元素,也可以是另一个广义表

多重链表:

  • 链表中的节点可能同时隶属于多个链
  • 节点的指针域会有多个,不同的指针域指向不同的链
  • 包含两个指针域的链表并不一定是多重链表,例如双向链表中的不同指针域指向的是同一个链
  • 多重链表可以描述树、图等复杂的数据结构

堆栈(Stack):

  • 特点:后入先出,逐个堆积
  • 具有一定约束的线性表,所谓约束即只在一端(栈顶,Top)做插入(入栈Push)、删除(出栈Pop)

猜你喜欢

转载自blog.csdn.net/ylonge37/article/details/90906099