算法图解
1. 算法简介
1.1 二分
Why: 复杂度O(n)—>O(logn)
使用限制:有序数组
1.2 大O表示
指出算法运行时间的增速,算法需要做的就是把O(n^2)优化到O(n)等
2. 选择排序
2.1 数组 链表
数组:连续物理空间,可随机访问,增删数据复杂度高
链表:分散无力空间,不可随机访问(只能顺序),增删数据复杂度低
数组 | 链表 | |
---|---|---|
读改 | O(1) | O(n) |
增删 | O(n) | O(1) |
根据互相特性,选择合适的方式,如频繁增删用链表,反之用数组
2.2 选择排序
复杂度:O(n^2)
遍历n 个元素选择 最小/大的,遍历n-1个元素选择 最小/大的
3. 递归
类比:套娃 :call_me_hand:
性能和易读不可兼得
避免死循环!
尾递归可以解决部分性能问题
递归调用栈是性能降低的原因,遵循FIFO
4. 快排
核心:分而治之divide and conquer,快排只是其中的一个应用
思想:递归的一种应用
快排(递归)是一种函数式编程
快排通过基准值(可以选第一个元素)进行分而治之
5. 散列表
实现方式:数组,非链表,检索值key类似数组的下表,可直接访问value
应用:DNS,阻止重复数据(类set集),作缓存(服务器端)
复杂度 | 散列平均 | 散列最糟 | 数组 | 链表 |
---|---|---|---|---|
查找 | 1 | n | 1 | n |
插入删除 | 1 | n | n | 1 |
装填因子(0.4)=散列元素(4)/位置总数(10)
避免冲突:1.良好的散列函数(均匀分布) 2.较低的装填因子(<0.7)
将满时候:1.申请两倍于原来的 新空间 2.hash所有元素到新空间
冲突解决:
- 开放地址(最简单就是冲突顺延下一位,直到为空)
- 拉链发(指在某个位子上再拉一条链表,非👖拉链)
6.BFS
广度优先搜索breadth first search,解决无加权最短路径问题之一
应用:国际跳棋,拼写检查,人际关系网络
7. Dijkstra
正加权有向无环图的解决算法
- 最短时间内到达的节点
- 更新该节点临接节点的开销
- 重复
- 计算最终路径
解决环:
负加权:bellman ford algorithm
8. Greedy
每步最优–>全局最优,得到近似正确的结果
9.DP
列出所有可能
10. K最邻近算法
11.next
树解决了二分查找中,插入删除O(n)降低到O(log n),但是降低了随机访问能力
树包括:二叉树,平衡二叉树,B树 B+树,,红黑树
反向索引:散列表,用于创建搜索引擎—>应用:傅里叶变换
并行算法,单机并行or分布式,应用:mapreduce,map->映射 ,reduce->归并
布隆过滤器:庞大的散列表(如谷歌的上亿条),通常使用redis实现,是一种概率型数据结构(偶尔出错),使用理由,存储空间少
hyperLogLog:类似布隆,是个日志
SHA算法
- 散列的一种应用
- 判断两个(超大)文件是否相同(散列值相同)
- SHA(用户输入密码)?== 数据库存储的SHA值,且拖库后无法还原密码
- SHA是一系列算法的统称,包括SHA-0 ,SHA-1 SHA-2 SHA-3 bcrypt etc
- SHA全局敏感(改动局部,整体全变),SIMhash局部敏感(局部改变,散列值局部改变),后者用于判断网页是否已经搜集,作业是否抄袭,相似度查询
- diffie-hellman密钥交换
- 双方无需知道加密算法,破解难度大
- 公钥与私钥,client获取公钥后,1.使用公钥加密 2.服务器端使用私钥解密
线性规划:simplex算法