【Algorithms】算法基础——读《啊哈!算法》

basic

一些概念与思想

conceptcontent
算法新的数据结构,新的解决方法
算法改进改变数据结构(邻接数组变领接表),改变方法
复杂度循环次数、写入输出次数,讨论的意义在于
在大数据量下时空耗费的飙升
以及增添删除元素后牵动整体的变化幅度
松弛边的权重变低
标记数组 技巧有时为了降低O(时间),只能增加O(空间)
多因子遍历 问题矩阵(图)思想

学习指南

  • 其实很多算法都可以用已有的一些简单结构完成,比如数组和指针的搭配
  • 积累思想,能解决什么问题,基于问题的相似核心迁移算法
  • 将已有的算法,根据实际问题进行修改,即优化
  • 研究新算法常使用自底向上,逐步封装



数据结构

namesave_in_program
队列头指针+尾指针+数组
标记指针+数组
二叉树一维数组,下标即是节点号
堆(优先队列)按大小排列好的二叉树
找最值无须遍历枚举
随意插入值影响并不大,只需要对比其上面的节点即可
邻接数组二维数组,内容为边权重
邻接表五个数组,储存每一条边
第一节点、第二节点、权重
本个节点对应下个节点的位置,下个节点的边的号
邻接表O(时间)更低(乱七八糟看不太懂)



排序问题

alg_namemain_idea
桶排序插旗子,只用于范围不大
冒泡两两比较遍历
快排二分法,哨兵



图遍历问题

深度优先搜索

“不撞南墙不回头”,主要思想是递归,每一个节点变化后都直接往下溯源到底。

广度优先搜索

主要思想是从上一次过找完所有节点,用while语句判断节点队列是否已经找完了。争取一次过直接找到答案。常用于权值相同的图。

Floyd-warshall(动态规划问题,求任意两点最短距离)

主要思想是多层for嵌套,和深度优先相似只是更简单。

Dijkstra(单源最短路径,不能解决负权边)

主要思想是,从起点找最近的点,然后,然后从这个最近点去找离它最近的点(近的近),逐步对照去松弛各个距离。(其实不是很理解。。。)

Bellman-Ford(解决负权边,最完美的最短路径算法)

不同于找最近的点,是全部边都重复地刷,n个点刷n-1遍。
可优化——加入记录数组,只对发生了变化的边松弛。




树相关

并查集算法

判断有多少棵树,查一共多少个祖先节点

  • 割点问题——只需要看其他节点不经过本节点后能到达哪里,如果并不能回到原祖先节点就是可以分割

匈牙利算法(二分图问题)

能够两两匹配的节点如何找出最大匹配量,现实中是任务调度、工作安排。
主要是增广路思想:在剩下的之间找到一个已经匹配的节点,然后依次连锁套下去,反正最坏结果就是不变,不亏。
使用match[u] = v; match[v] = u保存匹配关系。




参考:《啊哈!算法》啊哈磊著

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值