基础算法

205 阅读3分钟

基础数据结构

基础查找算法

如果列表有序:二分查找,时间复杂度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

排序

冒泡排序

时间复杂度是O(n2)

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")

最小生成树

最小生成树:在连通图的所有生成树中,所有边的代价和最小的生成树,称为最小生成树。

Kruskal算法:加边法

Prim 算法:加点法

最短路径算法

Dijkstra 算法