数据结构与算法

常用数据结构

Posted by Zhao Zihao on December 23, 2020

介绍数据结构中的栈,队列,二叉树(完全二叉树,满二叉树,完美二叉树),二叉查找树,堆,哈希表以及算法中的一些排序算法和简单搜索算法

1 栈(stack)

特点:先进后出

push(S,x):将x推入S中

pop(S):取出一个栈顶元素

top():返回栈顶元素

isEmpty(S):栈为空返回true

操作 时间复杂度
push O(1)
pop O(1)
top/peek O(1)
search O(n)

应用:括号匹配问题,前中后序表达式prefix,Infix,Postfix

2 队列(Queue)

特点:先进先出

Enqueue(Q,x):元素x进入Q的队尾

Dequeue(Q):取出队头元素

注意:循环队列的情况,enqueue()和dequeue()的时间复杂度都是O(1)

3 二叉树 (Binary Tree)

定义:

高度(height):从最底层叶子节点为0开始计算

深度(depth):从根节点为0开始计算

节点(node)

完全二叉树(Complete BT):深度为(d-1)的节点全部为满,深度为d的节点从左往右没有空

满二叉树(Full BT):孩子节点为0或2个

完美二叉树(Perfect BT):节点全部为满

对于完美二叉树,我们有高度(深度)和节点的关系表达:n=2^(h+1)-1

树的遍历(Tree traversal)

深度优先遍历(depth-first traversal)

前序遍历(Preorder):父节点,左孩子,右孩子

中序遍历(Inorder):左孩子,父节点,右孩子

后序遍历(Postorder):左孩子,右孩子,父节点

宽度优先遍历(Breadth-first traversal)

二叉查找树(Binary Search Tree)

  Average Worst
Insert O(logn) O(n)
Delete O(logn) O(n)
Search O(logn) O(n)

最坏情况就是变成了一个有序的单链表

Q:在BST中寻找某一个节点n的successor,也就是唯一比这个节点n大的节点

应用:删除BST中的某一个节点,得到新的BST

4 堆(Heap)

大顶堆(Max heap):父节点比孩子节点大

小顶堆(Min heap):父节点比孩子节点小

以Max heap为例,不同操作的时间复杂度如下

操作 时间复杂度
Find max element O(1)
Remove max element O(logn)
Insert an element O(logn)

堆的高度(深度)与节点的关系表达:n>=2^h

5 哈希表(Hash Table)

目的:避免冲突(Collision)

几种方式:

Chaining:类似于链表,同一余数可以使用链表链接

Open Addressing

Linear probing:同一余数index+1

h(k,i)=(h0(k)+i) mod m,h0(k)=k mod m

Quadratic probing:同一余数继续计算

h(k,i)=(h0(k)+ai+bi^2) mod m,h0(k)=k mod m

了解影响因子(Load Factor)

6 排序算法(Sorting Algorithms)

7 搜索算法(Searching Algorithms)

查找方式 时间复杂度
线性查找(Linear search) O(n)
二分查找(Binary search) O(logn)