数据结构与算法

数据结构(Data Structure)及相关算法

存储数据的方式

结构体(Struct)或 类(class)

结构:具有多个属性的变量

struct 结构名{1 属性1;
	类2 属性2...
}

线性表(List)

结构:n个元素构成的有序序列。有表头、表尾。

直接前驱、直接后继 反映元素之间一对一的邻接逻辑关系

顺序表(Array)

结构:一个结构体类型的变量(一般包括1个数组、有效数据数量max)

struct 结构名1{
	类 s[max];
	int max;
}

链表(Linked List)

结构:(头结点head+)n个变量
特点:变量均为同一结构体类型(包括自生属性、附近变量地址)
分类

  • 有/无 头结点。一般有头结点,仅Next有效
  • 单向/双向。一般单向,即属性中包含下一个的地址Next,但不包含上一个的地址Previous
struct 结构名1{1 属性1;
	类2 属性2...
	*struct 结构名1 Next;
}

栈(Stack)

结构:(链)表
特点:先进后出(尾进头出)
操作

返回类型函数名、方法操作
StackCreateStack生成空堆栈
voidpush入栈
Itempop出栈
boolisEmpty是/否 为空
intsize栈的规模
boolisFull是/否已满

队列(Queue)

结构:(链)表
特点:先进先出(头进头出)
操作

返回类型函数名、方法操作
QueueCreateQueue生成空队列
boolisFull是/否 已满
boolAddQ入队
boolIsEmpty是/否 为空
ItemDeleteQ出队

树(Tree)

结构

  • 数组
  • 结构体的组合(每个结构体包含自生属性、各个子节点地址)

二叉树(BinTree)

包括二叉搜索树完全二叉树,完全二叉树包括
结构(选其一):

  • 数组
  • 结构体的组合(每个结构体包含自生属性、左节点地址Left、右节点地址Right)

操作

返回类型函数名、方法操作
ItemCreateBinTree生成空树
boolIsEmpty是/否 为空
viodTraversal遍历树

遍历分类:
按照是否递归分为:

  • 递归遍历
  • 非递归遍历

按照递归顺序分为:

  • 中序遍历(InoederTraversal)、
  • 先序遍历(PreoederTraversal)、
  • 右序遍历(PostoederTraversal)、
  • 层序遍历(LeveloederTraversal)

其中非递归后序遍历较困难

二叉搜索树(Binary Search Tree)

结构:二叉树
特点:左小右大/左大右小

  • 左小右大:父节点大于左子树上的任何值,小于右子树上的任何值
  • 左大右小:与上面相反
红黑树(Red-Black BST,属于平衡二叉查找树)
完全二叉树(Complete Binary Tree)

结构:二叉树(一般为一个顺序表)
特点:下标连续,即编号与下标相同
包括堆

堆(Heap,优先队列(Priorty Queue))

结构:完全二叉树
特点:小/大 键值优先

  • 小键值优先->最小堆(MinHeap,小顶堆)
  • 大键值优先->最大堆(MaxHeap,大顶堆)

操作

返回类型函数名、方法操作
ItemCreateHeap生成相应的堆
boolIsFull是/否 已满
boolInsert入堆
boolIsEmpty是/否 为空
ItemDelete…删除并返回相应的堆顶
哈夫曼树(Huffman Tree)

结构:堆
特点:叶节点为一个独立的权值,父节点的权值为其两子节点之和

散列(Hash)

结构:线性表
特点:hash函数映射+冲突处理
操作

冲突处理:

  • 开放定址法
  • 线性探测法
  • 平方探测法
  • 双散列探测法
  • 再散列法
  • 分离链接法

图(Graph)

结构邻接矩阵 或 邻接表
分类
操作

ItemCreateHeap生成相应的堆
ItemCreateGraph生成一个无边图
voidInsertEdge增加新边E
voidDeleteEdge删除边E
boolIsEmpty是/否 为空
voidDFS从点V深度优先搜索
voidBFS从点V广度优先搜索
  • DFS(深度优先搜索,到底回头):从V开始同时做标记(保证节点不被二次访问),一直向下访问,直至没有未被访问的邻接点时回头,V找不到其他的邻接点访问时停止。
  • BFS(广度优先搜索,类似于层序遍历):从V开始同时做标记(保证节点不被二次访问),只访问邻接点,访问完毕后再访问他们的邻接点,没有邻接点可访问时停止。

强连通性(Kosaraju)

最小生成树(算法)

DFS、BFS

见上

Prim算法

从指定点出发,每次加入一个最近的点。直至没有满足条件的点

Kruskal算法

每次加入 连接不连通区域的、权值最小的 边。直至没有满足条件的边。(可引入并查集表示是否联通)

单源最短路径(算法)

Dijkstra

Prim+最短路程+来向

Acyclic

拓扑排序

CPM
Floyd算法

矩阵运算(每两个点之间找一遍最短路程,最多边数+1,保留最短路程)max-1次,
path[n+1][i][j]=min(path[n][i][j],path[n][i][k]+path[n][k][j]),1<=j<=max

Bellman-Ford

拓扑排序(有向无环图)

每次添加一个(未输入的入度为0的)点
这里的入度为0指的是与未收录的点之间的关系

B树(B-树)

B+树

跳表

LSM树(Log-Struct-Merge Tree)

参考:https://zhuanlan.zhihu.com/p/181498475

空间树

R-tree

其他

https://www.cnblogs.com/KillerAery/p/10878367.html

算法(Algorithms)

并查集

quick-find
union-find
加权union-find

排序

复杂度

算法平均时间O()最坏时间O()空间O()稳定性
简单选择排序N^2N^21×
简单插入排序N^2N^21
冒泡排序N^2N^21
希尔排序(5,3,1)N^2N^21×
堆排序NlogNNlogN1×
快速排序NlogNN^21×
归并排序NlogNNlogN1
基数排序D(N+R)D(N+R)N+R

选择排序

简单选择排序
堆排序

插入排序

简单插入排序
希尔排序(5,3,1)

交换排序

冒泡排序
快速排序

归并排序

基数排序

桶排序
基数排序(次位优先、主位优先)

△外部排序(归并)

字符串

排序

基础:键索引计数法
分类:低位优先(长度不同),高位优先(长度相同)
高位排序又有 快速排序 和 普通排序

单词查找树(R向 和 3向)

子字符串查找算法

KMP(Kunth-Morris-Pratt)

不同后,匹配位置调整到正确的相应状态

BM(Boyer-Moore)

某字母在子字符串的最后位置

RK(Rabin-Karp)

快速的散列值计算
散列值相同后再比较

压缩算法

RLE(游程编码)

ACGT 0123,每个2bit

Huffman(哈夫曼)

借助哈夫曼树

LZW

当前最长前缀字符串+前瞻

后缀数组

SuffixArray初级实现

每次去掉最前面一位,快排,找子字符串

Manber-Myers

无具体

网络流算法(Ford-Folkerson)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值