【算法】算法学习八:图解算法书中全部代码总结(含源代码)

一、二分查找

def binary_search(lst, target):
    low = 0
    high = len(lst) - 1
    while low <= high:
        mid = (low + high) // 2
        guess = lst[mid]
        if guess < target:
            low += 1
        elif guess > target:
            high -= 1
        else:
            return mid
    return None

lst = [1, 2, 3, 4, 5, 6]
target = 6
binary_search(lst, target)

输出结果为:

5

二、选择排序

# 获取最小的数字的索引
def get_small_idx(lst):
    small_num = lst[0]
    small_idx = 0
    for i in range(1, len(lst)):
        if lst[i] < small_num:
            small_num = lst[i]
            small_idx = i
    return small_idx

# 选择排序
def selection_sort(lst):
    new_lst = []
    for i in range(len(lst)):
        small_idx = get_small_idx(lst)
        new_lst.append(lst.pop(small_idx))
    return new_lst

lst = [5, 3, 8, 4, 1, 0, 2]
selection_sort(lst)

输出结果为:

[0, 1, 2, 3, 4, 5, 8]

三、递归

def counts(i):
    print(i)
    if i <= 1:
        return
    else:
        counts(i - 1)
counts(5)

输出结果为:

5
4
3
2
1

四、调用栈

def greet2(name):
    print("How are you? " + name + " !")

def bye():
    print("OK, bye!")

def greet(name):
    print("Hello, " + name + " !")
    greet2('Mike')
    bye()
    print('Bye!')

greet('Tom')

输出结果为:

Hello, Tom !
How are you? Mike !
OK, bye!
Bye!

五、递归调用栈

def fact(x):
    if x == 1:
        return 1
    else:
        return x * fact(x - 1)

fact(5)

输出结果为:

120

六、分而治之

# 编写求和的函数
def get_sum(lst):
    if lst == []:
        return 0
    else:
        return lst[0] + get_sum(lst[1:])

get_sum([1, 2, 3, 4, 5])

输出结果为:

15

七、快速排序

def get_quick_sort(lst):
    if len(lst) < 2:
        return lst # 基线条件
    else:
        base_num = lst[0]
        less = [i for i in lst[1:] if i < base_num]
        more = [i for i in lst[1:] if i > base_num]
    return get_quick_sort(less) + [base_num] + get_quick_sort(more)

lst = [5, 3, 8, 4, 1, 0, 2]
get_quick_sort(lst)

输出结果为:

[0, 1, 2, 3, 4, 5, 8]

八、散列表

phone_book = dict()
phone_book['Mike'] = 123456
phone_book['Tom'] = 23456
phone_book

输出:

{'Mike': 123456, 'Tom': 23456}
voted = {}
def check_vote(name):
    if voted.get(name):
        print("Kick him out!")
    else:
        voted[name] = True
        print('Let he vote!')
check_vote('Tom')

输出:

Let he vote!
check_vote('Tom')

输出:

Kick him out!

九、广度优先搜索

from collections import deque

def bfs(graph, start, target):
    queue = deque()  # 创建一个空队列
    visited = set()  # 记录已访问过的节点
    queue.append((start, [start]))  # 初始节点入队

    while queue:
        node, path = queue.popleft()  # 出队一个节点
        visited.add(node)  # 将节点标记为已访问

        if node == target:
            return path  # 找到目标节点,返回路径

        neighbors = graph[node]  # 获取当前节点的邻居节点
        for neighbor in neighbors:
            if neighbor not in visited:
                queue.append((neighbor, path + [neighbor]))  # 邻居节点入队,将路径更新

    return None  # 没有找到路径

# 测试代码
graph = {
    'A': ['B', 'C'],
    'B': ['A', 'D', 'E'],
    'C': ['A', 'F'],
    'D': ['B'],
    'E': ['B', 'F'],
    'F': ['C', 'E']
}

start_node = 'A'
target_node = 'F'
shortest_path = bfs(graph, start_node, target_node)
if shortest_path:
    print(f"Shortest path from {start_node} to {target_node}: {' -> '.join(shortest_path)}")
else:
    print(f"There is no path from {start_node} to {target_node}.")

输出结果为:

Shortest path from A to F: A -> C -> F
from collections import deque

queue = deque()  # 创建一个空队列

# 入队
queue.append(1)
queue.append(2)
queue.append(3)

# 出队
while queue:
    item = queue.popleft()
    print("Dequeued:", item)

输出结果为:

Dequeued: 1
Dequeued: 2
Dequeued: 3

十、深度优先搜索

def dfs(graph, node, visited):
    visited.add(node)  # 将节点标记为已访问
    print("Visited node:", node)

    neighbors = graph[node]  # 获取当前节点的邻居节点
    for neighbor in neighbors:
        if neighbor not in visited:
            dfs(graph, neighbor, visited)  # 递归调用DFS

# 测试代码
graph = {
    'A': ['B', 'C'],
    'B': ['A', 'D', 'E'],
    'C': ['A', 'F'],
    'D': ['B'],
    'E': ['B', 'F'],
    'F': ['C', 'E']
}

visited = set()  # 记录已访问过的节点
dfs(graph, 'A', visited)

输出结果为:

Visited node: A
Visited node: B
Visited node: D
Visited node: E
Visited node: F
Visited node: C

十一、狄克斯特拉

import sys

def dijkstra(graph, source):
    # 初始化距离字典
    dist = {node: sys.maxsize for node in graph}
    dist[source] = 0

    # 初始化访问过的节点集合
    visited = set()

    while len(visited) < len(graph):
        # 选择距离最短的节点
        min_dist = sys.maxsize
        min_node = None
        for node in graph:
            if node not in visited and dist[node] < min_dist:
                min_dist = dist[node]
                min_node = node

        # 将选择的节点标记为已访问
        visited.add(min_node)

        # 更新与选择节点相邻节点的最短距离
        for neighbor, weight in graph[min_node].items():
            new_dist = dist[min_node] + weight
            if new_dist < dist[neighbor]:
                dist[neighbor] = new_dist

    return dist

# 定义图的邻接表表示
graph = {
    1: {2: 5, 4: 4},
    2: {3: 3},
    3: {},
    4: {2: 2, 5: 1},
    5: {3: 6, 6: 4},
    6: {}
}

source_node = 1
distances = dijkstra(graph, source_node)

# 打印最短路径
for node, distance in distances.items():
    if distance == sys.maxsize:
        distance = "无穷大"
    print(f"节点 {source_node} 到节点 {node} 的最短距离为:{distance}")

输出结果为:

节点 1 到节点 1 的最短距离为:0
节点 1 到节点 2 的最短距离为:5
节点 1 到节点 3 的最短距离为:8
节点 1 到节点 4 的最短距离为:4
节点 1 到节点 5 的最短距离为:5
节点 1 到节点 6 的最短距离为:9

十二、贪婪算法

state_needed = set(['mt', 'wa', 'or', 'id', 'nv', 'ut', 'ca', 'az'])
stations = {}
stations['kone'] = set(['id', 'nv', 'ut'])
stations['ktwo'] = set(['wa', 'id', 'mt'])
stations['kthree'] = set(['or', 'nv', 'ca'])
stations['kfour'] = set(['nv', 'ut'])
stations['kfive'] = set(['ca', 'az'])
final_stations = set()
while state_needed:
    best_station = None
    station_covered = set()
    for station, states_for_station in stations.items():
        covered = state_needed & states_for_station
        if len(covered) > len(station_covered):
            best_station = station
            station_covered = covered
    state_needed -= station_covered
    final_stations.add(best_station)
final_stations

输出结果为:

{'kfive', 'kone', 'kthree', 'ktwo'}

十三、动态规划

def knapsack_dynamic_programming(weights, values, capacity):
    n = len(weights)
    dp = [[0] * (capacity + 1) for _ in range(n + 1)]

    for i in range(1, n + 1):
        for j in range(1, capacity + 1):
            if weights[i - 1] <= j:
                dp[i][j] = max(values[i - 1] + dp[i - 1][j - weights[i - 1]], dp[i - 1][j])
            else:
                dp[i][j] = dp[i - 1][j]

    # 构造最优解
    selected_items = []
    i, j = n, capacity
    while i > 0 and j > 0:
        if dp[i][j] != dp[i - 1][j]:
            selected_items.append(i - 1)
            j -= weights[i - 1]
        i -= 1

    return dp[n][capacity], selected_items


# 示例用法
weights = [4, 3, 1]
values = [3000, 2000, 1500]
capacity = 4

max_value, selected_items = knapsack_dynamic_programming(weights, values, capacity)
print("Max Value:", max_value)
print("Selected Items:", selected_items)

输出结果为:

Max Value: 3500
Selected Items: [2, 1]

一个语法的展示:

n = 3
capacity = 4
dp = [[0] * (capacity + 1) for _ in range(n + 1)]
dp
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]

最长公共子串:

def longest_common_substring(str1, str2):
    m = len(str1)
    n = len(str2)
    dp = [[0] * (n + 1) for _ in range(m + 1)]
    max_length = 0
    end_index = 0

    for i in range(1, m + 1):
        for j in range(1, n + 1):
            if str1[i - 1] == str2[j - 1]:
                dp[i][j] = dp[i - 1][j - 1] + 1
                if dp[i][j] > max_length:
                    max_length = dp[i][j]
                    end_index = i

    longest_substring = str1[end_index - max_length:end_index]
    return longest_substring


# 示例用法
str1 = "abcdefg"
str2 = "xyzabcd"
result = longest_common_substring(str1, str2)
print("Longest Common Substring:", result)
Longest Common Substring: abcd

最长公共子序列:

def longest_common_subsequence(str1, str2):
    m = len(str1)
    n = len(str2)
    dp = [[0] * (n + 1) for _ in range(m + 1)]

    for i in range(1, m + 1):
        for j in range(1, n + 1):
            if str1[i - 1] == str2[j - 1]:
                dp[i][j] = dp[i - 1][j - 1] + 1
            else:
                dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])

    # 构造最长公共子序列
    i, j = m, n
    longest_subsequence = ""
    while i > 0 and j > 0:
        if str1[i - 1] == str2[j - 1]:
            longest_subsequence = str1[i - 1] + longest_subsequence
            i -= 1
            j -= 1
        elif dp[i - 1][j] >= dp[i][j - 1]:
            i -= 1
        else:
            j -= 1

    return longest_subsequence


# 示例用法
str1 = "ABCD"
str2 = "ACDF"
result = longest_common_subsequence(str1, str2)
print("Longest Common Subsequence:", result)

输出结果为:

Longest Common Subsequence: ACD
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
第4章: 插值 函数名 功能 Language 求已知数据点的拉格朗日插值多项式 Atken 求已知数据点的艾特肯插值多项式 Newton 求已知数据点的均差形式的牛顿插值多项式 Newtonforward 求已知数据点的前向牛顿差分插值多项式 Newtonback 求已知数据点的后向牛顿差分插值多项式 Gauss 求已知数据点的高斯插值多项式 Hermite 求已知数据点的埃尔米特插值多项式 SubHermite 求已知数据点的分段三次埃尔米特插值多项式及其插值点处的值 SecSample 求已知数据点的二次样条插值多项式及其插值点处的值 ThrSample1 求已知数据点的第一类三次样条插值多项式及其插值点处的值 ThrSample2 求已知数据点的第二类三次样条插值多项式及其插值点处的值 ThrSample3 求已知数据点的第三类三次样条插值多项式及其插值点处的值 BSample 求已知数据点的第一类B样条的插值 DCS 用倒差商算法求已知数据点的有理分式形式的插值分式 Neville 用Neville算法求已知数据点的有理分式形式的插值分式 FCZ 用倒差商算法求已知数据点的有理分式形式的插值分式 DL 用双线性插值求已知点的插值 DTL 用二元三点拉格朗日插值求已知点的插值 DH 用分片双三次埃尔米特插值求插值点的z坐标 第5章: 函数逼近 Chebyshev 用切比雪夫多项式逼近已知函数 Legendre 用勒让德多项式逼近已知函数 Pade 用帕德形式的有理分式逼近已知函数 lmz 用列梅兹算法确定函数的最佳一致逼近多项式 ZJPF 求已知函数的最佳平方逼近多项式 FZZ 用傅立叶级数逼近已知的连续周期函数 DFF 离散周期数据点的傅立叶逼近 SmartBJ 用自适应分段线性法逼近已知函数 SmartBJ 用自适应样条逼近(第一类)已知函数 multifit 离散试验数据点的多项式曲线拟合 LZXEC 离散试验数据点的线性最小二乘拟合 ZJZXEC 离散试验数据点的正交多项式最小二乘拟合 第6章: 矩阵特征值计算 Chapoly 通过求矩阵特征多项式的根来求其特征值 pmethod 幂法求矩阵的主特征值及主特征向量 rpmethod 瑞利商加速幂法求对称矩阵的主特征值及主特征向量 spmethod 收缩法求矩阵全部特征值 ipmethod 收缩法求矩阵全部特征值 dimethod 位移逆幂法求矩阵离某个常数最近的特征值及其对应的特征向量 qrtz QR基本算法求矩阵全部特征值 hessqrtz 海森伯格QR算法求矩阵全部特征值 rqrtz 瑞利商位移QR算法求矩阵全部特征值 第7章: 数值微分 第8章: 数值积分 第9章: 方程求根 .............................. .............. 第17章: 数据统计和分析
目录 目录 1 Graph 图论 3 | DAG 的深度优先搜索标记 3 | 无向图找桥 3 | 无向图连通度(割) 3 | 最大团问题 DP + DFS 3 | 欧拉路径 O(E) 3 | DIJKSTRA 数组实现 O(N^2) 3 | DIJKSTRA O(E * LOG E) 4 | BELLMANFORD 单源最短路 O(VE) 4 | SPFA(SHORTEST PATH FASTER ALGORITHM) 4 | 第 K 短路(DIJKSTRA) 5 | 第 K 短路(A*) 5 | PRIM 求 MST 6 | 次小生成树 O(V^2) 6 | 最小生成森林问题(K 颗树)O(MLOGM). 6 | 有向图最小树形图 6 | MINIMAL STEINER TREE 6 | TARJAN 强连通分量 7 | 弦图判断 7 | 弦图的 PERFECT ELIMINATION 点排列 7 | 稳定婚姻问题 O(N^2) 7 | 拓扑排序 8 | 无向图连通分支(DFS/BFS 邻接阵) 8 | 有向图强连通分支(DFS/BFS 邻接阵)O(N^2) 8 | 有向图最小点基(邻接阵)O(N^2) 9 | FLOYD 求最小环 9 | 2-SAT 问题 9 Network 网络流 11 | 二分图匹配(匈牙利算法 DFS 实现) 11 | 二分图匹配(匈牙利算法 BFS 实现) 11 | 二分图匹配(HOPCROFT-CARP 的算法) 11 | 二分图最佳匹配(KUHN MUNKRAS 算法 O(M*M*N)) 11 | 无向图最小割 O(N^3) 12 | 有上下界的最小(最大)流 12 | DINIC 最大流 O(V^2 * E) 12 | HLPP 最大流 O(V^3) 13 | 最小费用流 O(V * E * F) 13 | 最小费用流 O(V^2 * F) 14 | 最佳边割集 15 | 最佳点割集 15 | 最小边割集 15 | 最小点割集(点连通度) 16 | 最小路径覆盖 O(N^3) 16 | 最小点集覆盖 16 Structure 数据结构 17 | 求某天是星期几 17 | 左偏树 合并复杂度 O(LOG N) 17 | 树状数组 17 | 二维树状数组 17 | TRIE 树(K 叉) 17 | TRIE 树(左儿子又兄弟) 18 | 后缀数组 O(N * LOG N) 18 | 后缀数组 O(N) 18 | RMQ 离线算法 O(N*LOGN)+O(1) 19 | RMQ(RANGE MINIMUM/MAXIMUM QUERY)-ST 算法 (O(NLOGN + Q)) 19 | RMQ 离线算法 O(N*LOGN)+O(1)求解 LCA 19 | LCA 离线算法 O(E)+O(1) 20 | 带权值的并查集 20 | 快速排序 20 | 2 台机器工作调度 20 | 比较高效的大数 20 | 普通的大数运算 21 | 最长公共递增子序列 O(N^2) 22 | 0-1 分数规划 22 | 最长有序子序列(递增/递减/非递增/非递减) 22 | 最长公共子序列 23 | 最少找硬币问题(贪心策略-深搜实现) 23 | 棋盘分割 23 | 汉诺塔 23 | STL 中的 PRIORITY_QUEUE 24 | 堆栈 24 | 区间最大频率 24 | 取第 K 个元素 25 | 归并排序求逆序数 25 | 逆序数推排列数 25 | 二分查找 25 | 二分查找(大于等于 V 的第一个值) 25 | 所有数位相加 25 Number 数论 26 1 |递推求欧拉函数 PHI(I) 26 |单独求欧拉函数 PHI(X) 26 | GCD 最大公约数 26 | 快速 GCD 26 | 扩展 GCD 26 | 模线性方程 A * X = B (% N) 26 | 模线性方程组 26 | 筛素数 [1..N] 26 | 高效求小范围素数 [1..N] 26 | 随机素数测试(伪素数原理) 26 | 组合数学相关 26 | POLYA 计数 27 | 组合数 C(N, R) 27 | 最大 1 矩阵 27 | 约瑟夫环问题(数学方法) 27 | 约瑟夫环问题(数组模拟) 27 | 取石子游戏 1 27 | 集合划分问题 27 | 大数平方根(字符串数组表示) 28 | 大数取模的二进制方法 28 | 线性方程组 A[][]X[]=B[] 28 | 追赶法解周期性方程 28 | 阶乘最后非零位,复杂度 O(NLOGN) 29 递归方法求解排列组合问题 30 | 类循环排列 30 | 全排列 30 | 不重复排列 30 | 全组合 31 | 不重复组合 31 | 应用 31 模式串匹配问题总结 32 | 字符串 HASH 32 | KMP 匹配算法 O(M+N) 32 | KARP-RABIN 字符串匹配 32 | 基于 KARP-RABIN 的字符块匹配 32 | 函数名: STRSTR 32 | BM 算法的改进的算法 SUNDAY ALGORITHM 32 | 最短公共祖先(两个长字符串) 33 | 最短公共祖先(多个短字符串) 33 Geometry 计算几何 34 | GRAHAM 求凸包 O(N * LOGN) 34 | 判断线段相交 34 | 求多边形重心 34 | 三角形几个重要的点 34 | 平面最近点对 O(N * LOGN) 34 | LIUCTIC 的计算几何库 35 | 求平面上两点之间的距离 35 | (P1-P0)*(P2-P0)的叉积 35 | 确定两条线段是否相交 35 | 判断点 P 是否在线段 L 上 35 | 判断两个点是否相等 35 | 线段相交判断函数 35 | 判断点 Q 是否在多边形内 35 | 计算多边形的面积 35 | 解二次方程 AX^2+BX+C=0 36 | 计算直线的一般式 AX+BY+C=0 36 | 点到直线距离 36 | 直线与圆的交点,已知直线与圆相交 36 | 点是否在射线的正向 36 | 射线与圆的第一个交点 36 | 求点 P1 关于直线 LN 的对称点 P2 36 | 两直线夹角(弧度) 36 ACM/ICPC 竞赛之 STL 37 ACM/ICPC 竞赛之 STL 简介 37 ACM/ICPC 竞赛之 STL--PAIR 37 ACM/ICPC 竞赛之 STL--VECTOR 37 ACM/ICPC 竞赛之 STL--ITERATOR 简介 38 ACM/ICPC 竞赛之 STL--STRING 38 ACM/ICPC 竞赛之 STL--STACK/QUEUE 38 ACM/ICPC 竞赛之 STL--MAP 40 ACM/ICPC 竞赛之 STL--ALGORITHM 40 STL IN ACM 41 头文件 42 线段树 43 求矩形并的面积(线段树+离散化+扫描线) 43 求矩形并的周长(线段树+离散化+扫描线) 44
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旅途中的宽~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值