软件设计师笔记-数据结构

数据结构

数据元素的集合及元素间的相互关系和构造方法。

线性表的存储结构

  • 顺序存储
  • 链式存储

单链表节点

c 复制代码
typedef struct node { 
	int data; 
	struct node *link; 
}NODE, *LinkList; 

双向链表

每个节点有两个指针,分别指出直接前驱和直接后继。

循环链表

尾节点指针指向第一个节点。

静态链表

借助数组来描述线性表的链式存储结构。

  • 特点:后进先出
  • 初始化栈: InitStack(S)
  • 判栈空:StackEmpty(S)
  • 入栈:Push(S,x)
  • 出栈:Pop(S)
  • 读取栈顶元素:Top(S)-----顺序存储+链式存储

队列

  • 特点:先进先出,尾入头出
  • 初始化队列:InitQueue(Q)
  • 判队空:Empty(Q)
  • 入队:EnQueue(Q,x)
  • 出队:DeQueue(Q)
  • 读队头元素:FrontQue(Q)-----顺序存储+链式存储

仅由字符构成的有限序列,是取值范围受限的线性表。

数组

定长线性表在维数上的扩张,一般不做插入删除运算。

矩阵

  • 特殊矩阵:元素分布有一定的规律(对称矩阵、三角矩阵、对角矩阵)
  • 稀疏矩阵:非零元素远少于零元素且分布无规律,用三元组存储(行号,列号,值)

广义表

  • 表中有表
  • 表头:表中第一个元素
  • 表尾:表中除去表头剩下的部分

  • 递归的,元素之间有明显的层次关系。

  • 完全二叉树应采用顺序存储结构,一般二叉树则应采用链式存储结构

  • 二 叉 树 的 链 式 存 储 结 构:

    c 复制代码
    typedef struct BiTnode {
    	 int data; 
    	 struct BiTnode *lchild, *rchild; 
     }BiTnode, *BiTree; 

二叉树的遍历

  • 先序遍历(先访问根节点)
  • 中序遍历(第二访问根节点)
  • 后序遍历(最后访问根节点)
  • 层序遍历(利用队列、每次出同一层的节点时进他们的子节点层)

线索二叉树

加上线索(直接前驱和直接后继)的二叉树。

最优二叉树(哈夫曼树)

一类带权路径长度最短的树。

树的存储结构

  • 双亲表示法:顺序存储
  • 孩子表示:链式存储
  • 孩子兄弟表示:链式存储,两个指针分别为第一个孩子和下一个兄弟

一个节点的前驱节点和后继节点数目没有任何限制。

图的表示

  • G=(V,E);
  • V:顶点的集合;

边带权值的图。

图的相关概念

图的存储结构

  • 邻接矩阵表示法
  • 邻接链表表示法

图的遍历

  • 深度优先搜索
  • 广度优先搜索

生成树

极小连通子图,针对连通图。

最小生成树(权值和最小的生成树)算法

  • 普尼姆算法:在相邻边的基础上求最小,与边数无关,适于边稠密的网。
  • 克鲁斯科尔算法:在不构成环的基础上找最小边直至连通,与顶点数无关,适于边稀疏的网。

AOV 网

有向图中顶点表示活动,有向边表示活动间的优先关系。

拓扑排序

将 AOV 网中所有顶点按优先顺序排成一个线性序列的过程。

AOE 网

有向图中有向边表示活动,边上的权值表示该活动持续的时间。

关键路径

从源点到汇点的路径中长度最长的。

最短路径

从源点到其余各顶点的最短路径-----迪杰斯克拉算法。

平均查找长度

关键字和给定值进行过比较的记录个数的平均值。

静态查找方法

  • 顺序查找
  • 折半查找
  • 分块查找

动态查找

表结构本身在查找过程中是动态生成的。

二叉排序树

左子树上所有节点的值小于根节点的值,右子树上所有节点的值大于根节

点的值。

平衡二叉树(AVL 树)

左子树和右子树高度之差的绝对值不超过1 。

B_树(m 阶)

每个节点子树个数<=m,根节点子树个数=0 或>=2,其他节点子树个数=0

或>=m/2。

哈希表

  • 通过哈希函数(以记录的关键字为自变量)得到记录的存储地址
  • 定长按一定函数规律存放数据
  • 哈希地址+关键字

哈希表的重点

  • 构造哈希函数:直接定址法,数字分析法,平方取中法,折叠法,随机
    数法,除留余数法
    解决冲突:开放定址法,链地址法,再哈希法

简单排序

  • 时间复杂度 O( n 2 n^2 n2),空间复杂度 O( 1 1 1))
  • 直接插入排序:插入第 i 个时,前 i-1 个已经排序好
  • 冒泡排序:相邻两个比较排序,每次循环确定一个极值
  • 简单选择排序:第 i个依次与后面每个元素比较排序,每次循环确定一个极值,不稳定

高端内部排序

  • 希尔排序:先将整个序列分割成若干序列分别进行直接插入排序,再对整个序列进行一次直接插入排序,不稳定
  • 快速排序:将整个记录分割成独立的两部分,两个指针分别指向对应部分的两端,往中间移动比较排序,递归,不稳定
  • 堆排序:建立初始堆输出并删除堆顶关键字,再建立新堆得到新的关键字依次输出,不稳定
  • 归并排序:将若干个有序序列合并为新的有序序列
  • 基数排序:按组成关键字的各个数位的值进行排序
相关推荐
圣保罗的大教堂8 天前
1097 Deduplication on a Linked List (25)
pat考试
圣保罗的大教堂12 天前
1089 Insert or Merge (25)
pat考试
圣保罗的大教堂15 天前
1081 Rational Sum (20)
pat考试
圣保罗的大教堂15 天前
1083 List Grades (25)
pat考试
圣保罗的大教堂19 天前
1074 Reversing Linked List (25)
pat考试
圣保罗的大教堂1 个月前
1052 Linked List Sorting (25)
pat考试
圣保罗的大教堂1 个月前
1047 Student List for Course (25)
pat考试
圣保罗的大教堂2 个月前
1028 List Sorting (25)
pat考试
绯樱殇雪2 个月前
编程题 7-29 删除字符串中的子串【PAT】
c++·pat考试