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

数据结构与算法
摘要:斐波那契数列的例子严格来说不算动态规划,以上旨在演示算法设计螺旋上升的过程。当问题中要求求一个最优解或在代码中看到循环和 max、min 等函数时,十有八九,需要动态规划大显身手。 动态规划遵循一套固定的流程:递归的暴力解法 → 带备忘录的递归解法(剪支) → 非递归的动态规划解法。这个过程是层层递 阅读全文
posted @ 2020-08-25 15:54 程序员曾奈斯 阅读(140) 评论(0) 推荐(0) 编辑
摘要:如何量化两个字符串之间的相似程度呢?有一个非常著名的量化方法,那就是编辑距离(Edit Distance)。 编辑距离指的就是,将一个字符串转化成另一个字符串,需要的最少编辑操作次数(比如增加一个字符、删除一个字符、替换一个字符)。编辑距离越大,说明两个字符串的相似程度越小;相反,编辑距离就越小,说 阅读全文
posted @ 2020-08-16 11:37 程序员曾奈斯 阅读(467) 评论(0) 推荐(0) 编辑
摘要:动态规划两种思想 1 状态转移(分状态一步一步走到最后) 2 方程转移(填表) 0-1背包基础问题 0-1背包升级版 女朋友的购物车 三角形中的最短路径 矩阵中的最短路径 硬币找零问题 莱温斯特距离 最长公共子串 最长递增子序列 动态规划的当前状态,就是来自上(多)个状态的max,或者min的一个。 阅读全文
posted @ 2020-08-16 10:48 程序员曾奈斯 阅读(162) 评论(0) 推荐(0) 编辑
摘要:1 题目描述 淘宝的“双十一”购物节有各种促销活动,比如“满 200 元减 50 元”。假设你女朋友的购物车中有 n 个(n>100)想买的商品,她希望从里面选几个,在凑够满减条件的前提下,让选出来的商品价格总和最大程度地接近满减条件(200 元),这样就可以极大限度地“薅羊毛”。作为程序员的你,能 阅读全文
posted @ 2020-08-14 22:30 程序员曾奈斯 阅读(890) 评论(0) 推荐(0) 编辑
摘要:1 题目描述 对于一组不同重量、不可分割的物品,我们需要选择一些装入背包,在满足背包最大重量限制的前提下,背包中物品总重量的最大值是多少呢? 刚刚讲的背包问题,只涉及背包重量和物品重量。我们现在引入物品价值这一变量。对于一组不同重量、不同价值、不可分割的物品,我们选择将某些物品装入背包,在满足背包最 阅读全文
posted @ 2020-08-14 19:12 程序员曾奈斯 阅读(425) 评论(0) 推荐(0) 编辑
摘要:动态规划(1)——0-1背包问题 1 题目描述 对于一组不同重量、不可分割的物品,我们需要选择一些装入背包,在满足背包最大重量限制的前提下,背包中物品总重量的最大值是多少呢? 2 输入 第一行是物品的个数n(1≤n≤100000),背包容量w(1≤w≤1000000); 第二行是n个物品的重量。 3 阅读全文
posted @ 2020-08-13 12:15 程序员曾奈斯 阅读(1543) 评论(0) 推荐(0) 编辑
摘要:1 题目描述 给定无向连通图G=(V, E)和m种不同的颜色,用这些颜色为图G的各顶点着色,每个顶点着一种颜色。是否有一种着色法使G中相邻的两个顶点有不同的颜色? 这个问题是图的m可着色判定问题。若一个图最少需要m种颜色才能使图中每条边连接的两个顶点着不同颜色,则称这个数m为该图的色数。求一个图的色 阅读全文
posted @ 2020-08-12 12:44 程序员曾奈斯 阅读(3126) 评论(0) 推荐(0) 编辑
摘要:遇到特殊字符的时候,我们就有多种处理方式了,也就是所谓的岔路口: “*”有多种匹配方案,可以匹配任意个文本串中的字符,我们就先随意的选择一种匹配方案,然后继续考察剩下的字符。如果中途发现无法继续匹配下去了,我们就回到这个岔路口,重新选择一种匹配方案,然后再继续匹配剩下的字符。 "?"有两种匹配方案, 阅读全文
posted @ 2020-08-12 10:46 程序员曾奈斯 阅读(328) 评论(0) 推荐(1) 编辑
摘要:回溯法其实就是暴力,这个题目就是暴力的n层for(2次)循环。 问题1、给定背包容量w,物品数量n,以及每个物品的重量wi,求背包最多能装多少多重的物品。 问题2、给定背包容量w,物品数量n,以及每个物品的重量wi、价值vi,求背包最多能装多少价值的物品。 这是一个基本的0-1背包问题,每个物品有两 阅读全文
posted @ 2020-08-11 20:59 程序员曾奈斯 阅读(642) 评论(0) 推荐(0) 编辑
摘要:回溯算法就是个多叉树的遍历问题, 关键就是在前序遍历和后序遍历的位置做⼀些操作, 算法框架如下: void backTrack(...){ if(满足结束条件){ 将路径加入到结果集 return ; } for(选择 in 选择列表){ 判断选择是否合法,如果不合法则进入一下此循环(continu 阅读全文
posted @ 2020-08-11 16:51 程序员曾奈斯 阅读(264) 评论(0) 推荐(0) 编辑
摘要:C++版本代码如下 #include <iostream> #include <math.h> #include <cstring> using namespace std; #define MAXSIZE 256 int num = 0; // 全局变量或者成员变量 void merge(int 阅读全文
posted @ 2020-08-11 15:25 程序员曾奈斯 阅读(194) 评论(0) 推荐(0) 编辑
摘要:我们前面几节讲了好几种字符串匹配算法,有 BF 算法、RK 算法、BM 算法、KMP 算法,还有 Trie 树。前面四种算法都是单模式串匹配算法,只有 Trie 树是多模式串匹配算法。 单模式串匹配算法,是在一个模式串和一个主串之间进行匹配,也就是说,在一个主串中查找一个模式串。多模式串匹配算法,就 阅读全文
posted @ 2020-08-10 20:15 程序员曾奈斯 阅读(316) 评论(0) 推荐(0) 编辑
摘要:Trie 树,也叫“字典树”。顾名思义,它是一个树形结构。它是一种专门处理字符串匹配的数据结构,用来解决在一组字符串集合中快速查找某个字符串的问题。它并不是二叉树,而是“多叉树”。 class TrieNode { char data; TrieNode children[26]; } 刚刚我们在讲 阅读全文
posted @ 2020-08-10 19:53 程序员曾奈斯 阅读(322) 评论(0) 推荐(0) 编辑
摘要:KMP 算法是根据三位作者(D.E.Knuth,J.H.Morris 和 V.R.Pratt)的名字来命名的,算法的全称是 Knuth Morris Pratt 算法,简称为 KMP 算法。 KMP 算法的核心思想,跟上一节讲的BM算法非常相近。我们假设主串是 a,模式串是 b。在模式串与主串匹配的 阅读全文
posted @ 2020-08-09 22:24 程序员曾奈斯 阅读(318) 评论(0) 推荐(0) 编辑
摘要:1 BM(Boyer-Moore)算法 它是一种非常高效的字符串匹配算法,有实验统计,它的性能是著名的KMP算法的 3 到 4 倍。BM 算法核心思想是,利用模式串本身的特点,在模式串中某个字符与主串不能匹配的时候,将模式串往后多滑动几位,以此来减少不必要的字符比较,提高匹配的效率。BM 算法构建的 阅读全文
posted @ 2020-08-09 14:52 程序员曾奈斯 阅读(577) 评论(0) 推荐(0) 编辑
摘要:1 在有数组作为参数的函数里,这个时候的参数已经不是数组,而是“指针” 总所周知,在C++中我们通过sizeof(arr)/sizeof(arr[0])来获取数组arr的长度。但是当数组作为函数参数时,不能再使用sizeof(arr)来获取数组的总大小,或者使用sizeof(arr)/sizeof( 阅读全文
posted @ 2020-08-09 14:41 程序员曾奈斯 阅读(678) 评论(0) 推荐(0) 编辑
摘要:素数(质数):一个大于1的自然数,除了1和它自身以外,不能整除其它的自然数。 合数:一个大于1的自然数,除了1和它自身以外,还能整除其它的自然数。 其实大于1的自然数中,如果不是素数(质数),那么它就是合数 扩展: 所有大于2的偶数都是合数 所有大于5的奇数中,个位为5的都是合数 最小的(耦)合数为 阅读全文
posted @ 2020-08-09 09:45 程序员曾奈斯 阅读(10612) 评论(0) 推荐(0) 编辑
摘要:1 深度优先搜索(DFS) 深度优先搜索(Depth-First-Search),简称 DFS。最直观的例子就是“走迷宫”。假设你站在迷宫的某个岔路口,然后想找到出口。你随意选择一个岔路口来走,走着走着发现走不通的时候,你就回退到上一个岔路口,重新选择一条路继续走,直到最终找到出口。这种走法就是一种 阅读全文
posted @ 2020-08-07 17:03 程序员曾奈斯 阅读(617) 评论(0) 推荐(0) 编辑
摘要:1 邻接矩阵存储方法(Adjacency Matrix) 邻接矩阵的底层依赖一个二维数组。对于无向图来说,如果顶点 i 与顶点 j 之间有边,我们就将 A[i][j]和 A[j][i]标记为 1;对于有向图来说,如果顶点 i 到顶点 j 之间,有一条箭头从顶点 i 指向顶点 j 的边,那我们就将 A 阅读全文
posted @ 2020-08-07 15:01 程序员曾奈斯 阅读(686) 评论(0) 推荐(0) 编辑
摘要:1 如何理解堆? 堆是一种特殊的树。只要满足以下两点,它就是一个堆: 堆是一个完全二叉树; 堆中每一个节点的值都必须大于等于(或小于等于)其子树中每个节点的值。 第一点,堆必须是一个完全二叉树。还记得我们之前讲的完全二叉树的定义吗?完全二叉树要求,除了最后一层,其他层的节点个数都是满的,最后一层的节 阅读全文
posted @ 2020-08-06 17:05 程序员曾奈斯 阅读(580) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示