基础数据结构
基础查找算法
如果列表有序:二分查找,时间复杂度O(logn)
二分查找
def binary_search(l, item):
low = 0
high = len(l)-1
while low<=high:
mid = (low+high)//2
if l[mid]==item:
return mid
if l[mid]<item:
high = mid-1
else:
low = mid + 1
return None
排序
冒泡排序
def bubble(l):
for i in range(len(l)):
for j in range(i):
if l[i]<l[j]:
l[i],l[j] = l[j],l[i]
return l
插入排序,时间复杂度是O(n2)
选择排序
快速排序
def quick_sort(nums):
if len(nums) <= 1:
return nums
# 随意选取一个基准数,比如选取列表第一个数
base = nums[0]
# left列表为nums中比基准数base小或等于base的数组成的列表
left = [x for x in nums[1:] if x <= base]
# right列表为nums中比基准数base大的数组成的列表
right = [x for x in nums[1:] if x > base]
# 对left和right列表递归排序
return quick_sort(left) + [base] + quick_sort(right)
堆排序
链表的算法
链表的反转
链表的排序
链表的合并
树的基础知识
满二叉树
如果二叉树中除了叶子结点,每个结点的度都为 2,则此二叉树称为满二叉树。
完全二叉树
如果二叉树中除去最后一层节点为满二叉树,且最后一层的结点依次从左到右分布,则此二叉树被称为完全二叉树。
树的遍历
前序遍历
中序遍历
后序遍历
哈夫曼编码
结点的带权路径长度:指的是从根结点到该结点之间的路径长度与该结点的权的乘积。 当用 n 个结点(都做叶子结点且都有各自的权值)试图构建一棵树时,如果构建的这棵树的带权路径长度最小,称这棵树为“最优二叉树”,有时也叫“赫夫曼树”或者“哈夫曼树”。 构建哈夫曼树的办法:每次把两个最小的拿出来,合并,再丢回去。
图的遍历
图的遍历:按照某种次序访问图的每一顶点一次仅且一次。有两种方法,分别是BFS(广度优先搜索算法)和DFS(深度优先搜索算法)。通过遍历得到了一棵图的生成树
BFS:队列实现
实现方法:通过队列来实现的,找到一个起点A,并将A相邻的点放入队列中,这时将队首元素B取出,并将B相邻且没有访问过的点放入队列中,不断重复这个操作,直至队列清空,这时候,依次访问的顶点就是遍历的顺序。
graph = {
"A":["B", "C"], # 与A相连的节点是B,C
"B":["A", "C", "D"], # 与B相连的节点是A,C,D
"C":["A", "B", "D", "E"],
"D":["B", "C", "E", "F"],
"E":["C", "D"],
"F":["D"]
}
def BFS(graph, s):
queue = [] # 初始化一个空队列
queue.append(s) # 将所有节点入队列
seen = set()
seen.add(s)
parent = {s : None}
while(len(queue) > 0):
vertex = queue.pop(0)
nodes = graph[vertex]
for w in nodes:
if w not in seen:
queue.append(w)
seen.add(w)
parent[w] = vertex
print(vertex)
return parent
parent = BFS(graph, "E")
for key in parent:
print(key, parent[key])
DFS:栈实现
实现方法:通过栈来实现的,找到一个起点A,并将A相邻的点放入栈中,将栈顶元素B取出,并将B相邻且没有访问过的点放入栈中,不断重复这个操作,直至栈清空,这时候,依次访问的顶点就是遍历的顺序。
graph = {
"A":["B", "C"],
"B":["A", "C", "D"],
"C":["A", "B", "D", "E"],
"D":["B", "C", "E", "F"],
"E":["C", "D"],
"F":["D"]
}
def DFS(graph, s):
stack = []
stack.append(s)
seen = set()
seen.add(s)
while(len(stack) > 0):
vertex = stack.pop()
nodes = graph[vertex]
for w in nodes:
if w not in seen:
stack.append(w)
seen.add(w)
print(vertex)
DFS(graph, "A")
最小生成树
最小生成树:在连通图的所有生成树中,所有边的代价和最小的生成树,称为最小生成树。