python算法集合
数据结构
栈
两种操作:压入/插入、弹出/删除并读取
特征:后进先出
!!调用另一个函数时,当前函数暂停并处于未完成状态
队列
两种操作:入队、出队
特征:先进先出
数组
python中的list
所有数据在内存中紧靠在一起,必须储存在一起,要是空间不够,要重新分配内存
可以直接读取某个元素
性能:读取速度快
链表
元素可以储存在任何地方
每个元素都储存了下个元素的地址,只要有足够的内存空间,就能为链表分配内存
必须从第一个元素访问起,从中获取下一个的地址
性能:插入和删除速度快
散列表/hash table
python中的dict
内部机制:实现、冲突、散列函数
数组、链表被直接映射到内存;散列表使用散列函数来确定元素的储存位置
作用:1. 防止重复dict.get()
2. 缓存/记住数据 3. 仿真映射关系
冲突:两个key被映射到同个位置
性能:读取、插入、删除都很快
二分法
1 | def binary_search(list,item): |
排序算法
min
1 | def findsmall(arr): |
排序
1 | def selection(arr): |
递归算法
简介
- base case(基线条件):函数不再调用自己
- recursive case(递归条件):函数调用自己
1 | #x! |
D&C
即divide and conquer,分而治之,一种思想方法
工作原理:
- 找出简单的基线条件
- 确定如何缩小问题规模,使其符合基线条件
eg1:sum(list)
1 | #遍历 |
思考:
- 最简单的数组?
- 空列表:sum=0
- 一个元素a:sum=a
- 每次递归调用,都必须离空数组更进一步。
1 | #递归 |
sg2:quicksort
1 | def quicksort(array): |
广度优先搜索
适用于非加权图
找出两样东西之间的最短距离
图:1.仿真一组连线,由节点和边组成 2.与节点直接相邻的节点被称为邻居
1 | #找出seller |
狄克斯特拉算法
适用于加权的有向无环图,不能有负边权
非加权图:不带权重的图;加权图:带权重的图;环:带圈的;边上的数字:权重
算法:
- 找出“最便宜”的节点
- 更新该节点的邻居开销
- 重复1,2直到对每个节点都这样做了
- 计算最终路径
1 | # 用散列表实现图的关系 |
近似算法
用于解决NP完全问题
每步都选择局部最优解,最终得到的就是全局最优解(并不是任何情况下成立)
1 | # 首先,创建一个列表,其中包含要覆盖的州 |
动态规划
网格,单元格中的值通常是要优化的值
要确定:
- 单元格的值是什么
- 如何将这个问题划分为子问题
- 网格的坐标轴是什么
k最邻近算法
k-nearest-neighbours,KNN
基本工作
- 分类(边组)
- 回归(预测数值)
- 特征抽取(将物品转换成一系列可比较的数字)
应用:机器学习(OCR)