算法笔记
文章平均质量分 60
天才XLM
这个作者很懒,什么都没留下…
展开
-
《算法导论》BFS和DFS实现
广度优先搜索BFS可以用在最小生成树算法(Prim)和单源最短路径算法(Dijkstra),借助优先队列存放同一深度的待访问结点深度优先搜索DFS,本质是回溯算法,“一条路走到头再回来”参考《算法导论》第六部分图算法的第22章-图的基本算法:图G(V, E)用邻接矩阵G表示用三种颜色标记顶点的状态,记录搜索轨迹(顶点未发现“white”,发现为“gray”,遍历完为“black”)用数组c原创 2017-04-18 22:38:34 · 922 阅读 · 0 评论 -
《算法导论》二叉查找树的实现
二叉查找树(Binary Search Tree,BST)也是一种支持多种动态集合操作(查找、最大最小值、插入、删除)的数据结构,基本操作的时间和树的高度成正比。基于BST的变型如红黑树、平衡AVL树,可以保证各个基本操作的最坏情况下依然能保证好性能。根据定义,二叉查找树的根节点值大于或等于其左子树的根节点值,小于或等于右子树的根节点值。因此,中序遍历BST能得到升序排好序的所有关键字。(参照排序的原创 2017-04-18 22:27:04 · 422 阅读 · 0 评论 -
《算法导论》散列表
散列表(Hash Table)是实现字典操作(查找、插入、删除)的有效数据结构,具有很高的查找效率。一定情况下查找元素的期望时间是O(1),优于链表(O(n)),和直接寻址的数组(查找也是O(1))相当。但当实际存储的关键字数比可能的关键字总数小的时候,散列表比数组有效。直接寻址 vs 散列技术一些记号:关键字的全域U实际存储的关键字集合K(个数n)散列映射的槽数m关键字k散列函数h直接原创 2017-04-18 22:26:13 · 497 阅读 · 0 评论 -
《算法导论》二叉树遍历的递归&非递归实现
二叉树常见的遍历方法有: - 前序遍历(preorder):“根左右” - 中序遍历(inorder):“左根右” - 后序遍历(postorder):“左右根” - 层次遍历(level):逐层从左到右访问节点前三种遍历方法,属于树的深度优先搜索DFS。层次遍历方法则属于广度优先搜索BFS。前三种对应于数学上的前缀、中缀、后缀表达式(波兰/逆波兰表示),方便计算机来计算带括号区分运算优先级原创 2017-04-18 22:25:14 · 684 阅读 · 0 评论 -
《算法导论》选择问题(找第K大的数)
选择问题(Selection Problem),即在n个元素的集合中寻找第K小的元素的问题。原创 2017-04-18 22:24:10 · 6337 阅读 · 0 评论 -
《算法导论》线性时间O(n)排序
基于元素间比较的排序算法中,快速排序、归并排序、堆排序是常见的时间代价为O(nlogn)的排序算法,它们都是《算法导论》第8章给出证明,“对于n个元素的输入序列,任何比较排序在最坏情况下都要用Big Omega(nlogn)次比较进行排序”。因此,归并排序和堆排序都是渐近最优的(下界为nlogn),快速排序最坏情况时间代价为O(n^2)。原创 2017-04-18 22:23:19 · 799 阅读 · 0 评论 -
《算法导论》堆排序和优先队列
堆是一种树形结构,通常基于完全二叉树实现最大堆或最小堆。堆排序最坏的时间复杂度为O(nlogn),和归并排序一样;又和插入排序一样,属于原地排序;堆排序综合了两种算法的优势。堆结构可以用来实现海量数据的Top-N排序,也可以用来实现优先队列(Priority Queue)。原创 2017-04-18 22:22:06 · 541 阅读 · 0 评论 -
《算法导论》排序算法的分析和实现
排序算法分析常见(内)排序算法分类: - 比较排序 - 插入排序/选择排序/冒泡排序 - 归并排序 - 快速排序 - 堆排序 - Shell排序原创 2017-04-18 22:20:20 · 470 阅读 · 0 评论 -
《算法导论》Dijkstra算法实现
所谓单源最短路径(Single-Source-Shortest-Path)问题,就是求解从某个节点出发,到其他节点的最短距离。 求解该问题的常用算法有Bellman-Ford和Dijkstra,前者适用于一般情况如负权值边,后者适用于非负权值边。参考《算法导论》第24章-单源最短路径的方法: 1.设置数组d存储每个节点到源节点的距离,维护一个提取最小d值的优先队列Q,Q初始化时是G的所有节点的集原创 2017-04-18 22:41:12 · 1100 阅读 · 0 评论