随笔分类 -  算法笔记

考研复试准备
摘要:本节主要讨论字符串的匹配问题,也就是说,如果给出两个字符串 text 和 pattern,需要判断字符串 pattern 是否是字符串 text 的子串。 一、next 数组 next[i] 表示使子串 s[0...i] 的前缀 s[0...k] 等于后缀 s[i-k...i] 的最大的 k;如果找 阅读全文
posted @ 2018-02-13 10:53 Just_for_Myself 阅读(312) 评论(0) 推荐(0)
摘要:一、图的存储 一般来说,图的存储方式有两种:邻接矩阵和邻接表。本节只讲解邻接矩阵的形式。 设图 G(V,E) 的顶点标号为 0,1,……,N-1,那么可以令二维数组 G[N][N] 的两维分别表示图的顶点标号,即如果 G[i][j] 为 1,则说明顶点 i 和顶点 j 之间有边;如果 G[i][j] 阅读全文
posted @ 2018-02-12 16:43 Just_for_Myself 阅读(695) 评论(0) 推荐(0)
摘要:先把前面介绍的动态规划模型列举如下: (1)最大连续子序列和 令 dp[i] 表示以 A[i] 作为结尾的连续序列的最大和。 (2)最长不下降子序列(LIS) 令 dp[i] 表示以 A[i] 作为结尾的最长不下降子序列长度。 (3)最长公共子序列(LCS) 令 dp[i][j] 表示字符串 A 的 阅读全文
posted @ 2018-02-10 19:09 Just_for_Myself 阅读(333) 评论(0) 推荐(0)
摘要:背包问题是一类经典的动态规划问题,本节只介绍两类最简单的背包问题:01 背包问题和完全背包问题。 一、多阶段动态规划问题 有一类动态规划可解的问题,它可以描述成若干个有序的阶段,且每个阶段的状态只和上一阶段的状态有关,一般把这类问题称为多阶段动态规划问题。如下图所示,该问题被分为 5 个阶段,其中状 阅读全文
posted @ 2018-02-10 11:46 Just_for_Myself 阅读(1112) 评论(0) 推荐(0)
摘要:最长回文子串的问题描述: 下面介绍动态规划的方法,使用动态规划可以达到最优的 O(n2) 复杂度。 令 dp[i][j] 表示 S[i] 至 S[j] 所表示的子串是否是回文子串,是则为 1,不是则为 0。这样根据 S[i] 是否等于 S[j] ,可以把转移情况分为两类: 由此可以写出状态转移方程: 阅读全文
posted @ 2018-02-10 09:51 Just_for_Myself 阅读(14522) 评论(0) 推荐(1)
摘要:最长公共子序列的问题描述为: 下面介绍动态规划的做法。 令 dp[i][j] 表示字符串 A 的 i 号位与字符串 B 的 j 号位之前的 LCS 长度(下标从 1 开始),如 dp[4][5] 表示 "sads" 与 “admin" 的 LCS 长度。那么可以根据 A[i] 和 B[j] 的情况, 阅读全文
posted @ 2018-02-09 11:22 Just_for_Myself 阅读(492) 评论(0) 推荐(0)
摘要:最长不降子序列是这样一个问题: 下面介绍动态规划的做法。 令 dp[i] 表示以 A[i] 结尾的最长不下降序列长度。这样对 A[i] 来说就会有两种可能: 由此可以写出状态转移方程: dp[i] = max{1, dp[j]+1} (j=1,2,....,i-1&&A[j]<A[i]) 上面的状态 阅读全文
posted @ 2018-02-09 10:27 Just_for_Myself 阅读(1485) 评论(0) 推荐(0)
摘要:最大连续子序列和问题如下: 下面介绍动态规划的做法,复杂度为 O(n)。 步骤 1:令状态 dp[i] 表示以 A[i] 作为末尾的连续序列的最大和(这里是说 A[i] 必须作为连续序列的末尾)。 步骤 2:做如下考虑:因为 dp[i] 要求是必须以 A[i] 结尾的连续序列,那么只有两种情况: 对 阅读全文
posted @ 2018-02-09 09:51 Just_for_Myself 阅读(38465) 评论(0) 推荐(3)
摘要:一、什么是动态规划 动态规划(DP)是一种用来解决一类最优化问题的算法思想。简单来说,动态规划将一个复杂的问题分解成若干个子问题,通过综合子问题的最优解来得到原问题的最优解。 二、动态规划的递归写法 以斐波那契(Fibonacci) 数列为例,斐波那契数列的定义为 F0=1,F1=1,Fn=Fn-1 阅读全文
posted @ 2018-02-08 19:42 Just_for_Myself 阅读(2587) 评论(0) 推荐(0)
摘要:一、堆的定义与基本操作 堆是一棵完全二叉树,树中每个结点的值都不小于(或不大于)其左右孩子结点的值。其中,如果父亲结点的值大于或等于孩子结点的值,那么称这样的堆为大顶堆,这时候每个结点的值都是以它为根结点的子树的最大值;如果父亲结点的值小于或等于孩子结点的值,那么称这样的堆为小顶堆,这时候每个结点的 阅读全文
posted @ 2018-02-08 10:31 Just_for_Myself 阅读(291) 评论(0) 推荐(0)
摘要:一、并查集的定义 并查集是一种维护集合的数据结构,它的名字中“并”“查”“集”分别取自 Union(合并)、Find(查找)、Set(集合)这 3 个单词。也就是说,并查集支持下面两个操纵: 并查集的实现就是用一个数组: 例如 father[1]=2 就表示元素 1 的父亲结点是元素 2。另外,如果 阅读全文
posted @ 2018-02-07 11:08 Just_for_Myself 阅读(553) 评论(0) 推荐(0)
摘要:一、平衡二叉树的定义 平衡二叉树(AVL 树)仍然是一棵二叉查找树,只是在其基础上增加了“平衡”的要求。所谓平衡是指,对 AVL 树的任意结点来说,其左子树与右子树的高度之差的绝对值不超过 1,其中左子树与右子树的高度之差称为该结点的平衡因子。 由于需要对每个结点都得到平衡因子,因此需要在树的结构中 阅读全文
posted @ 2018-02-06 15:24 Just_for_Myself 阅读(561) 评论(0) 推荐(0)
摘要:一、二叉查找树的定义 二叉查找树是一种特殊的二叉树,又称为排序二叉树、二叉搜索树、二叉排序树。递归定义如下: 要么二叉查找树是一棵空树 要么二叉查找树由根结点、左子树、右子树组成,其中左子树和右子树都是二叉查找树,且左子树上所有结点的数据域均小于或等于根结点的数据域,右子树上所有结点的数据域均大于根 阅读全文
posted @ 2018-02-05 15:17 Just_for_Myself 阅读(440) 评论(0) 推荐(0)
摘要:二叉树的遍历是指通过一定顺序访问二叉树的所有结点。遍历方法一般有四种:先序遍历、中序遍历、后序遍历及层次遍历。 一、先序遍历 对先序遍历来说,总是先访问根结点 root,然后才去访问左子树和右子树,因此先序遍历的遍历顺序是根结点 -> 左子树 -> 右子树。代码如下: 对一棵二叉树的先序遍历序列,序 阅读全文
posted @ 2018-01-26 11:07 Just_for_Myself 阅读(503) 评论(0) 推荐(0)
摘要:一、二叉树的递归定义 二、二叉树的存储结构 一般来说,二叉树使用链表来定义。二叉树每个结点有两条出边,因此指针域有两个——分别指向左子树和右子树的根结点地址,因此右把这种链表叫做二叉链表。其定义方式如下: 如果需要新建结点,可以使用下面的函数: 三、二叉树的基本操作 二叉树的常用操作有以下几个:二叉 阅读全文
posted @ 2018-01-25 17:00 Just_for_Myself 阅读(548) 评论(0) 推荐(0)
摘要:设想我们现在身处一个巨大的迷宫中,我们只能自己想办法走出去,下面是一种看上去很盲目但实际上会很有效的方法。 以当前所在位置为起点,沿着一条路向前走,当碰到岔道口时,选择其中一个岔路前进。如果选择的这个岔路前方是一条死路,就退回到这个岔道口,选择另一个岔路前进。如果岔路口存在新的岔道口,那么仍然按上面 阅读全文
posted @ 2018-01-25 11:49 Just_for_Myself 阅读(3517) 评论(0) 推荐(2)
摘要:一、链表的概念 链表是由若干个结点组成,且结点在内存中的存储位置通常是不连续的。除此之外,链表的两个结点之间一般通过一个指针来从一个结点指向另一个结点。定义如下: 二、使用 malloc 函数为链表结点分配内存空间 1. malloc 函数 malloc 函数是 C 语言中 stdlib.h 头文件 阅读全文
posted @ 2018-01-24 10:39 Just_for_Myself 阅读(742) 评论(0) 推荐(0)
摘要:一、关于 n!的一个问题 n! 表示 n 的阶乘,我们讨论一下关于它的一个问题:求 n! 中有多少个质因子 p。 举个例子,6! = 1*2*3*4*5*6 ,于是 6! 中有 4 个质因子 2,两个质因子 3。 对这个问题,直观的想法是计算 1~n 的每个数各有多少个质因子 p,然后将结果累加,时 阅读全文
posted @ 2018-01-22 16:53 Just_for_Myself 阅读(685) 评论(0) 推荐(0)
摘要:一、拓展欧几里得算法 该算法用来解决这样一个问题:给定两个非零整数 a 和 b,求一组整数解 (x,y) ,使得 ax + by = gcd(a,b) 成立,其中 gcd(a,b) 表示 a 和 b 的最大公约数。 递归边界:当 b 为 0 时,此时的 a 就等于 gcd,显然有 a*1+b*0=g 阅读全文
posted @ 2018-01-20 15:25 Just_for_Myself 阅读(625) 评论(0) 推荐(0)
摘要:大整数又称为高精度整数,其含义就是用基本数据类型无法储存其精度的整数。 一、大整数的存储 很简单,使用数组即可。例如定义 int 型数组 d[1000],那么这个数组的每一位代表了存放整数的每一位。整数的高位储存在数组的高位,整数的低位储存在数组的低位。 而为了方便随时获取大整数的长度,一般都会定义 阅读全文
posted @ 2018-01-20 10:24 Just_for_Myself 阅读(1393) 评论(0) 推荐(0)