随笔分类 -  数据结构与算法

摘要:汉诺塔问题的非递归实现及其思考 [toc] 有关问题的递归实现和非递归实现其实是我们理解计算机,或者说编程语言中关于函数调用的方式最好的方式之一,它让我们知道了某种编程语言在实现函数调用的方式,也是计算机进程切换的一种思想的体现。 我们先来说说汉诺塔问题: 汉诺塔问题是一个经典的问题。 汉诺塔(Ha 阅读全文
posted @ 2020-04-01 17:14 南风sa 阅读(2061) 评论(0) 推荐(0)
摘要:算法中常见的数学问题 在计算机世界里,我们通常还是要解决一些数学问题,这里对一些常见数学问题的算法进行总结,希望能够减慢遗忘的速度。 [TOC] 最大公约数和最小公倍数 最大公约数 正整数 a 与 b 的最大公约数是指 a 与 b 的所有公约数中最大的那个公约数,一般用 来表示 a 和 b 的最大公 阅读全文
posted @ 2020-03-24 19:42 南风sa 阅读(684) 评论(0) 推荐(1)
摘要:并查集 [TOC] 定义 并查集是一种维护集合的数据结构,并: ,查: ,集: 。 并查集支持下面两种操作: 1. 合并:合并两个集合 2. 查找:判断两个元素是否在一个集合 并查集使用一个数组实现 其中 father[i] 代表元素 i 的父亲节点,而父亲节点本身也是这个集合内的元素。 如果 说明 阅读全文
posted @ 2020-03-23 11:25 南风sa 阅读(450) 评论(0) 推荐(1)
摘要:堆 [TOC] 堆是一棵完全二叉树,每个节点的值都不小于(不大于)其左右孩子结点的值。 如果父亲结点的值大于等于孩子结点的值,那么称这样的堆为大顶堆,这时每个节点的值都是以它为根结点的子树的最大值;反之为小顶堆。 堆的实现 由于堆是一棵完全二叉树,所以我们可以用数组来实现一棵完全二叉树,也就能实现堆 阅读全文
posted @ 2020-03-23 11:24 南风sa 阅读(203) 评论(1) 推荐(0)
摘要:哈夫曼树 Huffman Tree [TOC] 定义 在一个果园里,小明已经将所有的水果打了下来,并按水果的不同种类分成了若干堆,小明决定把所有的水果合成一堆。 每一次合并,小明可以把两堆水果合并到一起,消耗的体力等于两堆水果的重量之和。 当然经过 n‐1 次合并之后,就变成一堆了。小明在合并水果时 阅读全文
posted @ 2020-03-23 11:23 南风sa 阅读(795) 评论(0) 推荐(0)
摘要:背包问题 多阶段动态规划问题 有一类动态规划可解的问题,它可以描述称为若干有序的阶段,且每个阶段的状态只和上一个阶段的状态有关,一般把这类问题称为多阶段规划问题。 01 背包问题 01背包问题描述如下: 有 n 件物品,每件物品的重量为 w[i],价值为 c[i]。现有一个容量为 V 的背包,问如何 阅读全文
posted @ 2020-03-23 10:54 南风sa 阅读(216) 评论(0) 推荐(0)
摘要:最长回文子串 最长回文子串的问题描述: 给出一个字符串 S,求 S 的最长回文子串的长度 例子: 字符串 "PATZJUJZTACCBCC" 的最长回文子串为 "ATZJUJZTA",长度为 9 还是先看暴力解法,枚举子串的两个端点 i 和 j,需要判断在 内的子串是否回文,从复杂度上看,枚举端点需 阅读全文
posted @ 2020-03-22 21:30 南风sa 阅读(128) 评论(0) 推荐(0)
摘要:最长公共子序列 最长公共子序列(Longest Common SubSequence)的问题描述为: 给定两个字符串A和B,求一个字符串,使得这个字符串是 A 和 B 的最长公共部分 例如:"sadstory" 和 "adminsorry" 的最长公共子序列为 "adsory",长度为 6 如果是暴 阅读全文
posted @ 2020-03-22 20:58 南风sa 阅读(166) 评论(0) 推荐(0)
摘要:最长不下降子序列(LIS) 最长不下降子序列(Longest Increasing Subsequence)是动态规划中的一个非常经典的问题: 在一个数字序列中,找到一个最长的子序列(可以不连续),使得这个子序列是不下降(非递减)的 例如 ,它的最长不下降子序列是 ,长度为 5。 对于这个问题,最简 阅读全文
posted @ 2020-03-22 20:23 南风sa 阅读(5103) 评论(0) 推荐(1)
摘要:动态规划 最大连续子序列和 最大连续子序列问题如下: 给定一个数字序列,A1,A2,A3,......,An,求 i,j ( 1i+......+Aj 最大,输出这个最大和。 这个问题如果使用暴力法,枚举左端点 i 和右端点 j ,需要 O(n2)的时间复杂度,再计算 A[i] + ... + A[ 阅读全文
posted @ 2020-03-22 16:24 南风sa 阅读(559) 评论(2) 推荐(0)
摘要:动态规划 [TOC] 动态规划(Dynamic Programming, DP)是一种用来解决一类 最优化问题 的算法思想。 简单来说,动态规划是将一个复杂的问题分解成若干个子问题,通过综合子问题的最优解来得到原问题的最优解。动态规划会把每个求解过的子问题的解记录下来,这样当下一次碰到同样的子问题时 阅读全文
posted @ 2020-03-22 15:49 南风sa 阅读(767) 评论(0) 推荐(0)
摘要:最小生成树 [TOC] 最小生成树(Minimum Spanning Tree,MST)是在一个给定的无向图G(V,E)中求一棵树 T,使得这棵树拥有图 G中的所有顶点,且所有边都是来自图 G 中的边,并且满足整棵树的边权之和最小。 最小生成树有三个性质需要掌握: 最小生成树是树,因此其边数等于顶点 阅读全文
posted @ 2020-03-22 14:09 南风sa 阅读(555) 评论(0) 推荐(0)
摘要:拓扑排序 [TOC] 有向无环图 如果一个有向图的任意顶点都无法通过一些有向边回到自身,那么称这个图为有向无环图(Directed Acyclic Graph, DAG)。 拓扑排序 拓扑排序是将有向无环图 G 的所有顶点排序成一个线性序列,使得对图 G 中的任意两个顶点 u,v,如果存在边 u v 阅读全文
posted @ 2020-03-22 14:08 南风sa 阅读(259) 评论(0) 推荐(0)
摘要:最短路径 [TOC] 最短路径问题: 给定任意的图 和起点 S,终点 T,如何求从 S 到 T 的最短路径。 解决最短路径的常用方法有 Dijkstra 算法 Bellman Ford 算法 SPFA 算法 Floyd 算法 这里主要对 Dijkstra 算法及其变种进行总结。 Dijkstra 算 阅读全文
posted @ 2020-03-22 00:39 南风sa 阅读(907) 评论(0) 推荐(0)