Python 基础算法
1. 排序算法
- 冒泡排序:从左到右不断交换相邻逆序的元素,在一轮的操作中至少可以让一个元素移动到它应该在的位置,因此需要进行 n 轮的操作。时间复杂度 O(n^2)。
得的多音字组词语有哪些- 选择排序:从未排序部分选一个最小的元素放到已排序部分末尾,直到所有元素都被排序。时间复杂度 O(n^2)。
- 插入排序:将数组分为已排序和未排序两部分,每次取未排序部分的第一个元素并插入到已排序部分合适的位置上。时间复杂度 O(n^2)。
- 快速排序:通过递归地将待排序数组分割成两部分来实现排序,每一轮将数组划分成两个子数组,一部分小于基准数,另一部分大于等于基准数,然后分别对这两个子数组进行快速排序。时间复杂度平均 O(nlogn),最坏情况下退化成 O(n^2)。
- 归并排序:采用分治思想,将待排序数组不断二分为两个子数组,对于每个子数组采用递归方式进行排序,最后将排序好的子数组再合并起来。时间复杂度 O(nlogn)。
2. 查算法
- 线性查:遍历整个数组或列表,查目标元素。时间复杂度 O(n)。
- 二分查:针对有序数组或列表,每次将待查区间缩小一半,直到到目标元素或区间为空。时间复杂度 O(logn)。
3. 字符串匹配算法
- 暴力匹配算法:从主串起始位置和模式串起始位置开始比较,每次比较移动一位,直到到匹配的字符串或者主串结束。时间复杂度 O(m*n)。
- KMP算法:通过部分匹配表,减少了在不匹配时,模式串的滑动距离。时间复杂度 O(m+n)。
4. 图论算法
- 最短路径算法:Dijkstra算法、Bellman-Ford算法、Floyd算法。
- 最小生成树算法:Prim算法、Kruskal算法。
- 深度优先搜索(DFS):递归地搜索图的所有节点,遍历子节点后回溯到父节点继续搜索。时间复杂度 O(n+m)。
- 广度优先搜索(BFS):从起点开始向外扩展,先访问邻居节点,再访问邻居的邻居节点,以此类推。时间复杂度 O(n+m)。
5. 动态规划
- 最长公共子序列(LCS):给定两个字符串,到两个字符串中都出现过的最长子序列。时间复杂度 O(n^2)。
- 背包问题:给定一组物品和一个大小为 W 的背包,选择一些物品放入背包中,使得它们的总价值最大。时间复杂度 O(nW)。
6. 数学算法
- 欧几里得算法求最大公约数(GCD):对于两个整数,它们的最大公约数等于其中较小的数和两数相除余数的最大公约数。时间复杂度 O(logn)。
-
htmlinput中radio无法切换 线性筛法求质数:借助欧拉筛法的思想,使用线性时间复杂度,求解出某一范围内的所有质数。
以上是常见的Python基础算法,当然还有很多经典算法,如二叉树遍历、堆排序、哈希表等,但掌握以上算法已经足够应对大部分编程问题。
举例说明:
好的,以下是对以上算法的一些简单例子:
1. 排序算法:
- 冒泡排序:对于数组 [4, 1, 6, 2, 8],冒泡排序的操作过程如下:
```
第一轮:[1, 4, 6, 2, 8]
第二轮:[1, 4, 2, 6, 8]
第三轮:[1, 2, 4, 6, 8]
```
- 选择排序:对于数组 [4, 1, 6, 2, 8],选择排序的操作过程如下:
```
第一轮:[1, 4, 6, 2, 8]
第二轮:[1, 2, 6, 4, 8]
小程序怎么关闭不让小孩玩第三轮:[1, 2, 4, 6, 8]
```
- 插入排序:对于数组 [4, 1, 6, 2, 8],插入排序的操作过程如下:
```
第一轮:[1, 4, 6, 2, 8]
第二轮:[1, 4, 6, 2, 8]
第三轮:[1, 2, 4, 6, 8]
```
- 快速排序:对于数组 [3, 1, 6, 2, 8, 5],快速排序的操作过程如下:
```
第一轮:[1, 2, 3, 6, 8, 5]
第二轮:[1, 2, 3, 6, 5, 8]
第三轮:[1, 2, 3, 5, 6, 8]
```
- 归并排序:对于数组 [3, 1, 6, 2, 8, 5],归并排序的操作过程如下:
hothead```
第一轮:[1, 3] [2, 6] [5, 8]
第二轮:[1, 2, 3, 6] [5, 8]
第三轮:[1, 2, 3, 5, 6, 8]
```
2. 查算法:
- 线性查:对于数组 [1, 3, 5, 7, 9],查元素 5 的过程如下:
```
比较 1, 不符合条件
比较 3, 不符合条件
比较 5, 符合条件,返回下标 2
```
- 二分查:对于有序数组 [1, 3, 5, 7, 9],查元素 5 的过程如下:
```
左指针为 0,右指针为 4,中间指针为 2,比较 array[2] 和 5,大于 5,因此令右指针为 1
左指针为 0,右指针为 1,中间指针为 0,比较 array[0] 和 5,小于 5,因此令左指针为 1
左指针为 1,右指针为 1,中间指针为 1,比较 array[1] 和 5,不符合条件,返回 -1
```
3. 字符串匹配算法:
- 暴力匹配算法:对于主串 "abcdbd" 和模式串 "bd",暴力匹配的过程如下:
```
比较 abc 和 bd,不符合条件
比较 bcd 和 bd,符合条件,返回下标 3
```
- KMP算法:对于主串 "abcdbd" 和模式串 "bd",KMP算法的过程如下:
```
模式串的部分匹配表为 [-1, 0, 0],i 指向主串,j 指向模式串
比较 a 和 b,不符合条件,j 回溯到前一位,即 j = 0
比较 b 和 b,符合条件,j 增加 1,i 增加 1
比较 c 和 d,不符合条件,j 回溯到前一位,即 j = 0
比较 d 和 b,符合条件,j 增加 1,i 增加 1,返回下标 3
```
4. 图论算法:
-
最短路径算法:对于有向图 G(V, E),起点 s,终点 t,其中 V 表示节点集合,E 表示边集合,权重为 w,邻接矩阵为 M,Dijkstra算法的过程如下:
```
设置集合 S 为空,集合 U 包含所有节点
设置起点 s 的距离为 0,其他节点的距离为无穷大
while (U 不为空):
python基础代码大全下载 选取距离最短的节点 x,将其加入 S
更新与 x 相邻的节点的距离,如果能够得到更短的距离,则更新距离
```
- 最小生成树算法:对于无向图 G(V, E),Prim算法的过程如下:
```
选取一个起始节点 s,加入集合 U 中,其它节点加入集合 V-U 中
while (V-U 不为空):
对于 V-U 中的每个节点 v,计算 v 到 U 的最小距离
选取最小距离的节点 x,将其加入 U 中,x 与 U 的边加入树的边集中
```
- DFS算法:对于无向图 G(V, E),从节点 v 开始进行深度优先搜索,算法的过程如下:
```
访问节点 v,并将节点标记为已访问
遍历节点 v 所有相邻的节点 w,若 w 未被访问,则递归调用 DFS(w)
```
- BFS算法:对于无向图 G(V, E),从节点 v 开始进行广度优先搜索,算法的过程如下:
```
使用队列 Q,将起点 v 入队
while (Q 不为空):
取出队首节点 x,并将 x 标记为已访问
遍历所有与 x 相邻的节点 w,若 w 未被访问,则将 w 入队
```
5. 动态规划:
- 最长公共子序列(LCS):对于字符串 "ABCDABD" 和 "BDCABA",LCS 的过程如下:
```
A B C D A B D
0 0 0 0 0 0 0 0
B 0 1 1 1 1 1 1 1
D 0 1 1 1 2 2 2 2
C 0 1 2 2 2 2 2 2
A 0 1 2 2 3 3 3 3
B 0 1 2 2 3 4 4 4
A 0 1 2 2 3 4 4 5
```
其中每个格子代表两个子串的 LCS 长度,如第一行第二列的元素为 1,代表第一个子串 "A" 和第二个子串 "B" 的 LCS 长度为 1。
- 背包问题:对于一组物品和一个大小为 W 的背包,物品 i 的重量为 w[i],价值为 v[i],背包最多能装下的物品总重量为 W,求背包能够装下的最大价值。动态规划的状态转移方程为:
head shoulders knees and toes```
dp[i][j] 表示在只考虑前 i 个物品、容量为 j 的情况下可以获得的最大价值
dp[i][0] = 0 # 背包容量为 0,无法装任何东西,价值为 0
dp[0][j
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论