数据结构
线性表包括顺序表和链表,python的list是顺序表,链表一般在动态语言中不会使用。不过链表还是会出现在各种算法题中。
链表 link list
- 单链表
- 逆转链表: leetcode 206
- 双链表
- 循环单链表
字符串 string
有一个重要的点就是字符串的匹配问题,其中比较重要的是无回溯匹配算法(KMP算法),算法比较复杂,重要的思想在于匹配过程中不回溯。实际复杂度是O(m+n), m和n分别是匹配模式串和目标串,一般m< python3有内置的实现模块 基本概念:路径,长度,层数。都比较好理解。 先根序DFT 广度优先遍历 BFS 小顶堆 大顶堆 heap sort python实现 heap sort c++实现 序列是数组 稳定性 适应性 也就是说,如果本来已经快排序完了,还差一点,那么算法是能够利用这种优势迅速完成剩下的工作,还是推倒重来,按照原本既定的方法重新排序。
栈 stack
队列 queue
二叉树
root的层数为0。
二叉树的性质:
满二叉树:所有分支节点的度数都是2
扩充二叉树:把一个二叉树的所有节点变成度数为2的节点(就是这棵树长了一圈叶子),旧节点叫内部节点,新节点叫外部节点。
完全二叉树:0-(h-1)层的节点都满,并且最后一层的节点都在左边。
完全二叉树到线性结构有自然的双向映射
def preorder(t, proc):
if not t:
return None
proc(t.val)
preorder(t.left)
preorder(t.right)
def levelorder(t, proc_):
q = Queue()
q.put(t)
while not q.empty():
n = q.get()
if not n:
continue
q.put(n.left)
q.put(n.right)
proc_(n.val)
堆:一个完全二叉树,并且,任意一个节点存放的数据先于其子节点的数据
堆和完全二叉树
堆可以用来构建优先队列(py3已经实现了)
由堆实现的优先队列,创建的时间复杂度是O(n),插入和弹出是O(logn)
堆还可以用来排序def heap_sort(nums_):
def siftdown(nums_i, e, begin, end):
i = begin
j = begin*2+1
while j < end:
if j + 1 < end and nums_i[j+1] < nums_i[j]:
j += 1
if e < nums_i[j]:
break
nums_i[i] = nums_i[j]
i = j
j = 2*j+1
nums_i[i] = e
end = len(nums_)
for k in range(end//2, -1, -1):
siftdown(nums_, nums_[k], k, end)
for k in range((end-1), 0, -1):
e = nums_[k]
nums_[k] = nums_[0]
siftdown(nums_, e, 0, k)
return nums_[::-1]
c++堆排序排序算法 sort algorithm
归并是外排序的基础
原地排序算法:空间复杂度为O(1)
就是原序列里有一些Key一样的元素,排序之后能否保持不改变这部分序列的相对顺序。
比如key-value pair,按照key 排序:
(0, 100), (1, 50), (1, 60), (1, 45), (-2, 80)
希望排序之后(1, 50), (1, 60), (1, 45)这三个元素的相对位置不变。
如果一个排序算法对接近有序的序列工作的更快,就称这种算法具有适应性。9.2 简单排序算法
9.3快速排序