
ACM 与数据结构
LaoJiu_
这个作者很懒,什么都没留下…
展开
-
BFPRT算法(TOP-K问题)
一:背景介绍 在一大堆数中求其前K大或前K小的问题,简称TOP-K问题。而目前解决TOK-K问题最有效的算法即是BFPRT算法,又称为中位数的中位数算法,该算法由Blum、Floyd、Pratt、Rivest、Tarjan提出,其最坏时间复杂度为O(n)。 在首次接触TOP-K问题时,我们的第一反应就是可以先对所有数据进行一次排序,然后取其前k即可,但是这么做有两个问题: (1)快速排原创 2017-02-11 20:53:25 · 19451 阅读 · 10 评论 -
算法复杂度分析概要
一:渐近符号1.1 符号的辨析1.1.1 符号OO OO,读作“大O”,非正式来说,O(g(n))O(g(n))是增长次数小于等于g(n)g(n)及其常数倍(nn趋向于无穷大)的函数集合。 定义 如果函数f(n)f(n)包含在O(g(n))O(g(n))中,记作f(n)∈O(g(n))f(n)∈O(g(n))(平时使用为了方便书写,我们通常使用f(n)=O(g(n))f(n)=O(g(n))原创 2017-02-13 15:48:27 · 934 阅读 · 0 评论 -
背包系列第四篇----完全背包(求解最大价值)
一:问题完全背包问题描述:一个容量为V的背包。现在有N种物品,每种物品有无数个,每种物品的体积是C1,C2,…,Cn,对应的每种的价值是W1,W2,…,Wn.。试问,在不超过背包容量的情况下,物品装入背包的最大价值?二:分析理解先来看下完全背包和01背包的区别,我们再来看下什么是01背包?01背包问题描述:一个容量为V的背包。现在有N种物品,每种物品只有一个,每种物品的体积是C1,原创 2016-04-27 19:40:00 · 1894 阅读 · 0 评论 -
背包系列第二篇----01背包(求解最大价值时背包的物品)
一:问题经过第一篇的学习,我们学会求解最大价值,而此篇是在求出最大价值的同时,也要求出背包内有哪么物品?这是一个记录路径问题。二:分析理解我们设置一个path[][]二维数组记录路径。这不是很难,看代码应该能看懂。三:代码#include #include using namespace std;#define N 6 #define V 10原创 2016-04-27 15:43:03 · 2319 阅读 · 0 评论 -
背包系列第六篇----完全背包(求解最大价值的个数)
一:问题完全背包问题描述:一个容量为V的背包。现在有N种物品,每种物品有无数个,每种物品的体积是C1,C2,…,Cn,对应的每种的价值是W1,W2,…,Wn.。试问,在不超过背包容量的情况下,物品装入背包的最大价值?和第三篇一样,我们来求出最大价值的个数。二:分析理解我们设置num[ i ][ j ]二维数组来表示dp[ i ][ j ]的方案数。1.dp[ i ][ j原创 2016-04-30 15:06:18 · 810 阅读 · 0 评论 -
背包系列第五篇----完全背包(求解最大价值时背包的物品)
一:问题完全背包问题描述:一个容量为V的背包。现在有N种物品,每种物品有无数个,每种物品的体积是C1,C2,…,Cn,对应的每种的价值是W1,W2,…,Wn.。试问,在不超过背包容量的情况下,物品装入背包的最大价值?在此基础上,如何求出背包内的物品?二:分析理解和背包系列的第二篇相似,需要设置一个path[ ][ ]保存路径。三:代码#include #include原创 2016-04-30 11:39:53 · 1580 阅读 · 0 评论 -
数据结构与算法系列----平衡二叉树(AVL树)
一:背景平衡二叉树(又称AVL树)是二叉查找树的一个进化体,由于二叉查找树不是严格的O(logN),所以引入一个具有平衡概念的二叉树,它的查找速度是O(logN)。所以在学习平衡二叉树之前,读者需要了解二叉查找树的实现,具体链接:二叉查找树那么平衡是什么意思?我们要求对于一棵二叉查找树 ,它的每一个节点的左右子树高度之差不超过1。(对于树的高度的约定:空节点高度是0;叶子节点高度是1。原创 2016-07-13 17:53:11 · 2242 阅读 · 0 评论 -
数据结构与算法系列----凸包问题
首先介绍下什么是凸包问题?如下图:在一个二维坐标系,有若干点杂乱排列着,将最外层的点连接起来构成的凸多边型,它能包含给定的所有的点,这个多边形就是凸包。寻找凸包的算法有很多种,Graham Scan算法是一种十分简单高效的二维凸包算法,能够在O(nlogn)的时间内找到凸包。在讲解之前,读者需要了解向量叉积正负的几何意义,如不了解,可以参考http://blog.c原创 2016-08-01 10:26:45 · 2194 阅读 · 0 评论 -
扩展KMP算法
前文已经介绍了经典的KMP算法,本文继续介绍KMP算法的扩展,即扩展KMP算法。 问题定义:给定两个字符串S和T(长度分别为n和m),下标从0开始,定义extend[i]等于S[i]…S[n-1]与T的最长公共前缀的长度,求出所有的extend[i]。举个例子,看下表: i 0 1 2 3 4 5 6 7 S a a a a a b原创 2017-03-12 17:23:40 · 633 阅读 · 0 评论 -
Manacher算法
一:背景 给定一个字符串,求出其最长回文子串。例如: (1)s=”abcd”,最长回文长度为 1; (2)s=”ababa”,最长回文长度为 5; (3)s=”abccb”,最长回文长度为 4,即 bccb。 以上问题的传统思路大概是,遍历每一个字符,以该字符为中点向两边查找。其时间复杂度为O(n2)O(n^2),很不高效。而在1975年,一个叫Manacher的人发明了一原创 2017-02-26 11:48:15 · 1182 阅读 · 0 评论 -
单链表的各种操作(面试必备)
一:前言 本篇不会涉及基础知识,我默认来到这里的读者已经掌握何谓链表,何谓链表的头结点等基础概念。 单链表经常为公司面试所提及,先不贬其过于简单,因为单链表确实是数据结构中最简单的一部分,但往往最简单的,人们越无法把握其细节。 本文一共总结了单链表常被提及的八种操作,如下: (1)逆序构造单链表; (2)链表反转; (3)链表排序; (4)合并两个有序链表;原创 2017-02-23 12:15:18 · 1028 阅读 · 0 评论 -
KMP算法(2):其细微之处
系列文章目录 KMP 算法(1):如何理解 KMP KMP算法(2):其细微之处本篇来谈一谈KMP的一些细微之处,直接进入主题。一:起始下标之“争”:0和1/* P为模式串,下标从0开始 */void GetNext(string P, int next[]){ int p_len = P.size(); int i = 0; //P的下标 int j原创 2017-05-14 12:24:54 · 453 阅读 · 0 评论 -
KMP算法(1):如何理解KMP
一:背景 给定一个主字符串(以 S 代替)和模式串(以 P 代替),要求找出 P 在 S 中出现的位置,即串的模式匹配问题。今天来介绍解决这一问题的常用算法之一,Knuth-Morris-Pratt 算法(简称 KMP),这个算法是由高德纳(Donald Ervin Knuth)和沃恩·普拉特在1974年构思,同年詹姆斯·H·莫里斯也独立地设计出该算法,最终由三人于1977年联合发表。 在继原创 2017-03-08 13:28:49 · 741 阅读 · 0 评论 -
二叉树基础
一:前言 本文主要讲解以下二叉树的4个部分: (1)构造二叉树; (2)前,中,后序遍历(递归与非递归)和层次遍历; (3)求节点数; (4)求叶子数。 在此先约定下二叉树的节点结构和类的结构:struct Node { char data; Node *left, *right;};class BiTree{public: Node原创 2017-03-20 13:40:45 · 354 阅读 · 0 评论 -
01背包问题
01背包问题一:问题 有NN件物品和一个容量为VV的背包。第ii件物品的体积是CiC_i,其价值是WiW_i。求解,在不超过背包容量情况下,将哪些物品装入背包可使价值总和最大。二:基本思路 这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。 状态 F[i,v]F[i,v]表示前ii件物品恰放入一个容量为vv的背包可以获得的最大价值。 转移方程 F[i,v]=max{F原创 2017-03-17 12:51:05 · 643 阅读 · 0 评论 -
二分查找(面试必备)
在计算机科学中,二分搜索(binary search),也称折半搜索(half-interval search)、对数搜索(logarithmic search),是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。原创 2017-03-15 10:55:07 · 843 阅读 · 0 评论 -
二叉树操作(面试必备)
本篇针对面试中常见的二叉树操作作个总结: (1)前序遍历,中序遍历,后序遍历; (2)层次遍历; (3)求树的节点数; (4)求树的叶子数; (5)求树的深度; (6)求二叉树第k层的节点个数; (7)判断两棵二叉树是否结构相同; (8)求二叉树的镜像; (9)求两个节点的最低公共祖先节点; (10)求任意两节点距离; (11)找出二原创 2017-03-27 18:28:18 · 863 阅读 · 0 评论 -
表达式求值
一:前言 所谓表达式求值,就是写一个微型计算器。例如输入:(1+9)* 2 / 2 - 1,输出9。对于这样的问题,我们一般利用栈,模拟数学运算来完成。为了简化问题,在继续下面的分析之前,先在此作个约定:本文只讨论+-*/()基本的四则运算,另外不对意外出现的符号(例如^)和不符合规范的数学表达式(例如2*-1)做异常处理。二:思路及分析 我们用一个字符数组(即char s[1000])来存储数原创 2017-02-24 13:18:54 · 837 阅读 · 0 评论 -
数据结构与算法目录
线性表第 1 篇:学习数据结构前你需要知道的第 2 篇:第 3 篇:原创 2016-04-28 11:49:16 · 2440 阅读 · 0 评论 -
数据结构与算法系列----B树、B+树与B*树简介
本文主要介绍各种B树,不对插入、删除做过多的深入了解。1. 引子动态查找树主要有:二叉查找树(Binary Search Tree)平衡二叉查找树(Balanced Binary Search Tree)红黑树(Red-Black Tree )B-treeB+treeB*tree 前三者是典型的二叉查找树结构,其查转载 2016-08-13 17:42:53 · 860 阅读 · 0 评论 -
数据结构与算法系列----Sparse Table算法(RMQ问题)
一:概念Sparse Table算法(简称ST算法)是针对RMQ问题的,什么是RMQ?RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数组arry[],回答若干询问RMQ(A,i,j)(0这两个问题是在实际应用中经常遇到的问题,下面介绍一下解决这两种问题的比较高效的算法。当然,该问题也可以用线段树(也叫区间树)解决,算法原创 2016-03-13 19:53:09 · 1471 阅读 · 0 评论 -
数据结构与算法系列----学习数据结构与算法前你需要知道的
数据结构教科书上开篇就是“什么是数据结构?”,这里我也就不多说了,没意思。我总是把“数据结构”和“算法”这两个词语看做是一样的(个人而言哈),我们倒不如说说算法能干什么,学习数据结构能干什么?不知道大家有没有看过印度大片《三傻大闹宝莱坞》,里边的主人公在上课(应该是机械课之类的)的时候被一位老师叫起回答一个问题,“说下机器的含义”,当时这位主人公就简单的说了句,“能省力的就是机器”。现原创 2016-04-28 11:45:38 · 2547 阅读 · 0 评论 -
数据结构与算法系列----多源最短路径(Floyd-Warshall算法)
任意两点最短路径被称为多源最短路径,即给定任意两个点,一个出发点,一个到达点,求这两个点的之间的最短路径,就是任意两点最短路径问题,多源最短路径,而Floyd-Warshall算法最简单,只有5行代码,即可解决这个问题。上图中有4个城市8条公路,公路上的数字表示这条公路的长短。请注意这些公路是单向的。我们现在需要求任意两个城市之间的最短路程,也就是求任意两个点之间的最短路径。这个问题被原创 2016-03-03 23:56:23 · 6512 阅读 · 0 评论 -
数据结构与算法系列----并查集详解
本文主要介绍解决动态连通性一类问题的一种算法,使用到了一种叫做并查集的数据结构,称为Union-Find。更多的信息可以参考Algorithms 一书的Section 1.5,实际上本文也就是基于它的一篇读后感吧。原文中更多的是给出一些结论,我尝试给出一些思路上的过程,即为什么要使用这个方法,而不是别的什么方法。我觉得这个可能更加有意义一些,相比于记下一些结论。转载 2016-03-01 09:14:02 · 1325 阅读 · 0 评论 -
数据结构与算法系列----直插,快排,堆排,归并排序讲解
一:直接插入排序直接插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止。概念很简单,直接看代码:#include#includeusing namespace std;void InsertSort(int _arry[]);int main(){ int ar原创 2016-03-06 17:56:14 · 1718 阅读 · 0 评论 -
二叉树----第一篇(构造,遍历,求节点,求叶子)
什么是二叉树,这里不会介绍。我主要讲解下它的实现和具体应用函数。一:二叉树结构#include#include#includeusing namespace std;struct BiData//节点结构{ char data; BiData *lChild, *rChild;};class BiTree{public: BiData *root;//原创 2015-12-06 18:20:15 · 4435 阅读 · 0 评论 -
数据结构之图(邻接表存储,DFS和BFS遍历)
以下代码创建的图是无向,无权图,并且使用邻接表表示图。部分代码参考严蔚敏的数据结构。一:main部分#include#includeusing namespace std;struct ArcNode{ int adjvex; //该弧所指向的顶点的位置 ArcNode * next; //指向下一条弧的指针原创 2015-12-23 21:28:35 · 14340 阅读 · 0 评论 -
数据结构与算法系列----哈夫曼树及哈夫曼编码
大家应该还记得谍战剧中经常出现的一个词”密码本“。在消息传递时,往往不会明文发送,而要以另一种加密的形式发送内容。假如现在要发送这样一条信息"lisan is a turncoat"。大家很容易知道内容是"李三是叛徒"。那么这样的一条消息是不会直接这样发送的,往往加密以后,也就是通过密码本,可能这段内容加密后的内容是这样的"111001010010101000001110",当把这样的消息传送出去原创 2015-12-21 08:20:43 · 4628 阅读 · 0 评论 -
数据结构与算法系列----Sunday算法详解
Sunday算法是Daniel M.Sunday于1990年提出的字符串模式匹配。Sunday算法的思想和BM算法中的坏字符思想非常类似。差别只是在于Sunday算法在失配之后,是取目标串中当前和模式串对应的部分后面一个位置的字符来做坏字符匹配。如下:下标数:01234567890目标串:abcdefghijk模式串:bxcdBM算法在b和x失配后,坏字符为b(下标1),在原创 2016-02-29 19:38:25 · 9769 阅读 · 0 评论 -
数据结构与算法系列----最小生成树(Prim算法&Kruskal算法)
Prim算法:用邻接矩阵存储图,设置两个数组lowCost和adjIndex,其中前者代表边的权值,后者代表对应lowCost该边的起点。具体内容参考严蔚敏的数据结构图7.17。#includeusing namespace std;int graph[20][20];//邻接矩阵char * vertex;//保存顶点int Prim(int&);int main(){原创 2015-12-28 08:52:03 · 6259 阅读 · 1 评论 -
数据结构与算法系列----判断线段相交
在讲解之前,先认识下”向量叉积”的概念:如图,对于给定的向量AB与向量AC,我们如何判断AB是在AC顺时针方向还是逆时针方向呢?(如图所示,AB在AC逆时针方向,同时,AC在AB的顺时针方向)假设向量AB坐标为(x1,y1),向量AC坐标为(x2,y2),则规定“向量叉积”为:x1 * y2 - y1 * x2 “向量叉积”的意义是:若为正数,则AB在AC的顺时针方向;原创 2016-07-31 15:53:59 · 1735 阅读 · 0 评论 -
数据结构与算法系列----二叉排序树
一:概念介绍二叉排序树又称“二叉查找树”、“二叉搜索树”。二叉排序树:或者是一棵空树,或者是具有下列性质的二叉树:1. 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;2. 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;3. 它的左、右子树也分别为二叉排序树。例如下图就是一个二叉排序树:二:代码main部分#原创 2016-03-04 20:38:20 · 1057 阅读 · 0 评论 -
数据结构与算法系列----单源最短路径(Dijkstra算法&Bellman_Ford算法)
一:概念介绍单源最短路径问题,即在图中求出给定顶点到其它任一顶点的最短路径。形象点,如下图,假如有4个城镇A,B,C,D,它们之间有道路连通,且有长度。现在给定城镇A,求分别到其他城镇B,C,D的最短距离。正如下图,A到B,C,D的最短路径为:A--B 15A--B--C 25A--B--D 301)最短路径的最优子结构性质 该性质描述为:如果原创 2016-03-02 14:37:07 · 1672 阅读 · 0 评论 -
数据结构与算法系列----字典树
一:概念什么是字典树?假如给出一些单词,and,as,at,cn,com,构建下面的字典树:从上图可以发现,每条路径或是一个单词,或是一个单词的前缀。你可能会想,这有什么用?第一:词频统计。可能有人要说了,词频统计简单啊,一个hash或者一个堆就可以打完收工,但问题来了,如果内存有限呢?还能这么玩吗?所以这里我们就可以用trie树来压缩下空间,因为公共前缀都是用一个原创 2016-03-09 20:51:46 · 2340 阅读 · 1 评论 -
数据结构与算法系列----AC自动机
一:概念首先简要介绍一下AC自动机:Aho-Corasick automation,该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之一。一个常见的例子就是给出n个单词,再给出一段文章(长度是m),让你找出有多少个单词在文章里出现过。要搞懂AC自动机,先得有字典树Trie的基础知识(也有人说需要KMP的知识,我觉得暂且不要理会这个。但是在看这篇文章之前,Trie字典树,你是必须要先搞懂原创 2016-03-11 21:19:24 · 3701 阅读 · 0 评论 -
数据结构与算法系列----基数排序
基数排序与其他的排序方法(http://blog.youkuaiyun.com/laojiu_/article/details/50813637)都不同,它不需要比较关键字的大小。它是根据关键字中各位的值,通过对排序的N个元素进行若干趟“分配”与“收集”来实现排序的。 不妨通过一个具体的实例来展示一下,基数排序是如何进行的。 设有一个初始序列为: R {50, 123, 543, 187,原创 2016-03-12 21:36:59 · 863 阅读 · 0 评论