【Algorithms】算法基础——读《啊哈!算法》
basic
一些概念与思想
concept | content |
---|---|
算法 | 新的数据结构,新的解决方法 |
算法改进 | 改变数据结构(邻接数组变领接表),改变方法 |
复杂度 | 循环次数、写入输出次数,讨论的意义在于 在大数据量下时空耗费的飙升, 以及增添删除元素后牵动整体的变化幅度 |
松弛 | 边的权重变低 |
标记数组 技巧 | 有时为了降低O(时间),只能增加O(空间) |
多因子遍历 问题 | 矩阵(图)思想 |
学习指南
- 其实很多算法都可以用已有的一些简单结构完成,比如数组和指针的搭配
- 积累思想,能解决什么问题,基于问题的相似核心迁移算法
- 将已有的算法,根据实际问题进行修改,即优化
- 研究新算法常使用自底向上,逐步封装
数据结构
name | save_in_program |
---|---|
队列 | 头指针+尾指针+数组 |
栈 | 标记指针+数组 |
二叉树 | 一维数组,下标即是节点号 |
堆(优先队列) | 按大小排列好的二叉树 找最值无须遍历枚举 随意插入值影响并不大,只需要对比其上面的节点即可 |
邻接数组 | 二维数组,内容为边权重 |
邻接表 | 五个数组,储存每一条边 第一节点、第二节点、权重 本个节点对应下个节点的位置,下个节点的边的号 邻接表O(时间)更低(乱七八糟看不太懂) |
排序问题
alg_name | main_idea |
---|---|
桶排序 | 插旗子,只用于范围不大 |
冒泡 | 两两比较遍历 |
快排 | 二分法,哨兵 |
图遍历问题
深度优先搜索
“不撞南墙不回头”,主要思想是递归,每一个节点变化后都直接往下溯源到底。
广度优先搜索
主要思想是从上一次过找完所有节点,用while语句判断节点队列是否已经找完了。争取一次过直接找到答案。常用于权值相同的图。
Floyd-warshall(动态规划问题,求任意两点最短距离)
主要思想是多层for嵌套,和深度优先相似只是更简单。
Dijkstra(单源最短路径,不能解决负权边)
主要思想是,从起点找最近的点,然后,然后从这个最近点去找离它最近的点(近的近),逐步对照去松弛各个距离。(其实不是很理解。。。)
Bellman-Ford(解决负权边,最完美的最短路径算法)
不同于找最近的点,是全部边都重复地刷,n个点刷n-1遍。
可优化——加入记录数组,只对发生了变化的边松弛。
树相关
并查集算法
判断有多少棵树,查一共多少个祖先节点
- 割点问题——只需要看其他节点不经过本节点后能到达哪里,如果并不能回到原祖先节点就是可以分割
匈牙利算法(二分图问题)
能够两两匹配的节点如何找出最大匹配量,现实中是任务调度、工作安排。
主要是增广路思想:在剩下的之间找到一个已经匹配的节点,然后依次连锁套下去,反正最坏结果就是不变,不亏。
使用match[u] = v; match[v] = u保存匹配关系。
参考:《啊哈!算法》啊哈磊著