算法知识积累
文章平均质量分 82
即为君子
忍把浮名,换了低斟浅唱。
展开
-
KMP算法详解
本文由简单的字符串匹配算法开始,经Rabin-Karp算法,最后到KMP算法,教你从头到尾彻底理解KMP算法。来看算法导论一书上关于此字符串问题的定义:假设文本是一个长度为n的数组T[1...n],模式是一个长度为m进一步假设P和T的元素都是属于有限字母表Σ.中的字符。依据上图,再来解释下字符串匹配问题。目标是找出所有在文本T=abcabaabcaabac中的模式P转载 2017-07-27 10:50:22 · 251 阅读 · 0 评论 -
[kmp]kmp求字符串中子串的个数
OulipoTime Limit: 1000MS Memory Limit: 65536K DescriptionThe French author Georges Perec (1936–1982) once wrote a book, La disparition, without the letter 'e'.原创 2017-08-19 14:07:50 · 1294 阅读 · 0 评论 -
线段树笔记
最近做题碰到了线段树的问题 却发现自己对线段树并不懂 所以顺手做了点线段树的笔记以作知识积累目录一、概述二、从一个例子理解线段树 创建线段树 线段树区间查询 单节点更新 区间更新三、线段树实战--------------------------一 概述线段树,类似区间树,它在各个节点保存一条线段(数组中原创 2017-08-07 10:57:23 · 224 阅读 · 0 评论 -
数据结构之最短路问题
假如你有一张地图,地图上给出了每一对相邻城市的距离,从一个地点到另外一个地点,如何找到一条最短的路? 最短路算法要解决的就是这类问题。定义:给定一个有(无)向图,每一条边有一个权值 w,给定一个起始点 S 和终止点 T ,求从 S 出发走到 T 的权值最小路径,即为最短路径。最短路算法依赖一种性质:一条两顶点间的最短路径包含路径上其他最短路径。简单的说就是:最短路径的子路径是最短路径。这个用反转载 2017-08-30 19:08:27 · 1207 阅读 · 0 评论 -
哈夫曼树的基本构建与操作
1、基本概念a、路径和路径长度若在一棵树中存在着一个结点序列 k1,k2,……,kj, 使得 ki是ki+1 的双亲(1<=i<j),则称此结点序列是从 k1 到 kj 的路径。从 k1 到 kj 所经过的分支数称为这两点之间的路径长度,它等于路径上的结点数减1.b、结点的权和带权路径长度在许多应用中,常常将树中的结点赋予转载 2017-11-13 20:23:56 · 9915 阅读 · 0 评论 -
图的基本操作(基于邻接表):图的构造,深搜(DFS),广搜(BFS)
[cpp] view plain copy#include #include #include using namespace std; //表结点 typedef struct ArcNode{ int adjvex;//该弧所指向的顶点的位置 ArcNode *nextarc;//指向下一条转载 2017-11-13 21:43:20 · 588 阅读 · 0 评论 -
弗洛伊德最短路算法
暑假,小哼准备去一些城市旅游。有些城市之间有公路,有些城市之间则没有,如下图。为了节省经费以及方便计划旅程,小哼希望在出发之前知道任意两个城市之前的最短路程。上图中有4个城市8条公路,公路上的数字表示这条公路的长短。请注意这些公路是单向的。我们现在需要求任意两个城市之间的最短路程,也就是求任意两个点之间的最短路径。这个问题这也被称为“多源最短路径”问题。现在需要一个数据结构转载 2017-12-04 00:18:07 · 1425 阅读 · 1 评论 -
最短路算法详解(Dijkstra/SPFA/Floyd)
一、DijkstraDijkstra单源最短路算法,即计算从起点出发到每个点的最短路。所以Dijkstra常常作为其他算法的预处理。 使用邻接矩阵的时间复杂度为O(n^2),用优先队列的复杂度为O((m+n)logn)近似为O(mlogn)(一) 过程每次选择一个未访问过的到已经访问过(标记为Known)的所有点的集合的最短边,并用这个点进行更新,过程如下转载 2017-12-04 00:24:17 · 521 阅读 · 0 评论 -
简易计算器(c++,c#,Java,Python四语言)
c++版:#includeusing namespace std;double jia(double a,double b){ double c; return c=a+b;}double jian(double a,double b){ double c; return c=a-b;}double cheng(doubl原创 2018-01-22 18:40:15 · 332 阅读 · 1 评论 -
ACM博弈典型例题
1:简单博弈(可以通过对胜负规律的推导解出的简单博弈)HDU 1847Good Luck in CET-4 Everybody!Good Luck in CET-4 Everybody!Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 121...原创 2018-04-26 20:46:24 · 984 阅读 · 0 评论 -
最小生成树
数据结构课本上图的难点在深搜和广搜之后的就是最小生成树了 主要涉及到两种算法 1普里姆算法 2克鲁斯卡尔算法这里以hdu的1863为例 通过多种算法的代码实现畅通工程Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Problem Descript原创 2017-08-15 20:54:54 · 310 阅读 · 0 评论 -
并查集
在上篇关于详解图的最小生成树的计算中的克鲁斯卡尔算法中用到了运用到了并查集(地址:http://blog.csdn.net/wumingkeqi/article/details/77199795) 但是只是一笔带过了 后来百度各种解析 下面用hdu的1232为例子 具体解释一下并查集畅通工程Time Limit: 4000/2000 MS (Java/Others) Memo原创 2017-08-18 10:08:22 · 224 阅读 · 0 评论 -
HDU 1728 逃离迷宫 + HDU 1072 Nightmare
逃离迷宫Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有转载 2017-08-09 20:03:22 · 228 阅读 · 0 评论 -
acm博弈论讲解
序:博弈是信息学和数学试题中常会出现的一种类型,算法灵活多变是其最大特点,而其中有一类试题更是完全无法用常见的博弈树来进行解答。 寻找必败态即为针对此类试题给出一种解题思路。此类问题一般有如下特点:1、博弈模型为两人轮流决策的非合作博弈。即两人轮流进行决策,并且两人都使用最优策略来获取胜利。2、博弈是有限的。即无论两人怎样决策,都会在有限步后决出胜负。转载 2017-04-23 23:15:04 · 315 阅读 · 0 评论 -
八大排序不完全版
算法一直是编程的基础,而排序算法是学习算法的开始,排序也是数据处理的重要内容。所谓排序是指将一个无序列整理成按非递减顺序排列的有序序列。排列的方法有很多,根据待排序序列的规模以及对数据的处理的要求,可以采用不同的排序方法。那么就整理下网上搜索的资料,按自己的理解,把C语言的8大排序算法列出来。普通意义上,排序算法可以分为三大类:1 交换类排序法2 插入类排序法3 选择类排序转载 2017-03-08 20:18:50 · 650 阅读 · 0 评论 -
大素数分解与素数判定
1.Miller-rabin算法:Miller-rabin算法是一个用来快速判断一个正整数是否为素数的算法。根据费马小定理,如果p是素数,则a^(p-1)≡1(mod p)对所有的a∈[1,n-1]成立。所以如果在[1,n-1]中随机取出一个a,发现不满足费马小定理,则证明n必为合数。【但是每次尝试过程中还做了一个优化操作,以提高用少量的a检测出p不是素数的概率。这个优化叫做二次探转载 2017-03-18 20:28:44 · 2537 阅读 · 0 评论 -
八大排序
概述排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。我们这里说说八大排序就是内部排序。 当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序序。 快速排序:是目前基于比较的内部排序中被认为是最好的方转载 2017-03-08 20:15:46 · 233 阅读 · 0 评论 -
素数的判定
素数判定的演化过程:判定一个数字p是不是质数:拿1 ~p 的所有数字来试除。bool divisibiity_test(int n){ for (int i=2; i if (n % i == 0) return false; // 不是质数 return true; // 是质数}改进b原创 2017-03-07 19:04:37 · 294 阅读 · 0 评论 -
数据离散化
有些数据本身很大, 自身无法作为数组的下标保存对应的属性。如果这时只是需要这堆数据的相对属性, 那么可以对其进行离散化处理!离散化:当数据只与它们之间的相对大小有关,而与具体是多少无关时,可以进行离散化。例如9 1 0 5 4 与 5 2 1 4 3 的逆序对个数相同。设有4个数:1234567、123456789、12345678、123456排序转载 2017-03-05 21:23:53 · 381 阅读 · 0 评论 -
最长上升子数列
1 LIS什么是最长递增子序列呢? 2 问题描述如下: 3 设L=是n个不同的实数的序列,L的递增子序列是这样一个子序列Lin=, 4 其中k1akm。求最大的m值。 5 对于这个问题有以下几种解决思路: 6 1、把a1,a2,...,an排序,假设得到a'1,a'2,...,a'n,然后求a的a'的最长公共子串,这样总的时间复杂度为o(nlg(n))+o(n^2)转载 2017-03-05 21:21:33 · 406 阅读 · 0 评论 -
map的用法
C++ map的基本操作和使用1、map简介map是一类关联式容器。它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响。对于迭代器来说,可以修改实值,而不能修改key。2、map的功能自动建立Key - value的对应。key 和 value可以是任意你需要的类型。 根据key值快速查找记录,查找的复杂度基本是Log(N)转载 2017-03-05 21:20:17 · 192 阅读 · 0 评论 -
快速傅立叶变换(FFT)
学习算法中偶尔看到了有关傅里叶变换的题目 然后找了一些整理一下当作储备知识本文是从最基础的知识开始讲解,力求用最通俗易懂的文字将问题将的通俗易懂,大神勿喷,多多指教啊,虽然说是从零学习FFT,但是基本的数学知识还是要有的,sin,cos,等。 FFT(快速傅里叶变换)其本质就是DFT,只不过可以快速的计算出DFT结果,要弄懂FFT,必须先弄懂DFT,DFT(Discr原创 2017-08-01 20:48:04 · 1565 阅读 · 0 评论 -
NIMK博弈
普通的NIM游戏是在n堆石子中每次选一堆,取任意个石子,而NIMK游戏是在n堆石子中每次选择k堆,1<=k<=n,从这k堆中每堆里都取出任意数目的石子,取的石子数可以不同,其他规则相同。对于普通的NIM游戏,我们采取的是对每堆的SG值进行异或,异或其实就是对每一个SG值二进制位上的数求和然后模2,比如说3^5就是011+101=112,然后对每一位都模2就变成了110,所以3^5=6。...转载 2018-04-29 21:21:12 · 725 阅读 · 0 评论