![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法与数据结构
文章平均质量分 64
jokes000
这个作者很懒,什么都没留下…
展开
-
数据结构与算法面试题80道
转自:http://hi.baidu.com/geogre_jsj/blog/item/e4b98fd2aab5aa3611df9b92.html由于这些题,实在太火了。所以,应广大网友建议要求,在此把之前已整理公布的前80题, 现在,一次性分享出来。此也算是前80题第一次集体亮相。 此些题,已有上万人,看到或见识到,若私自据为己有,必定为有知之转载 2011-12-14 15:11:10 · 145107 阅读 · 5 评论 -
八皇后问题
算法分类:回溯算法原理:简单的深搜迭代代码实现(北大百练 2698):/* Author: jokes000 * 北大百练 2698 * 八皇后问题 */#include #include const int N = 8; // 棋盘大小int C[N]; // 存储每个皇后所在位置bool G[N][N]; // 用于输出中转换行列i原创 2012-05-07 10:28:39 · 755 阅读 · 0 评论 -
随机算法
随机算法的定义:它是在接收输入的同时,为了随机选择的目的,还接收一串随机比特流并且在运行过程中使用该比特流的算法分类:Las Vegas算法:它建立的那些随机算法总是或者给出正确的解,或者误解。Monte Carlo算法:它建立的算法总是给出解,但偶尔可能会产生非正确的解。随机化快速排序:由推论得知,QUICKSORT的平均运行时间是O(nlogn),但在许原创 2012-05-07 11:15:42 · 896 阅读 · 0 评论 -
素数性测试(Robin-Miller算法)
算法分类:随机算法算法原理:输入:一个大于3的奇整数n和一个大于等于1的安全参数t(用于确定测试轮数)。输出:返回n是否是素数(概率意义上的,一般误判概率小于((1/2))80)即可)。将n-1表示成2sr对i从1到t做循环做以下操作:选择一个随机整数a(2 ≤ a ≤ n−2)计算y ← ar bmod n如果y≠1并且原创 2012-05-07 19:20:23 · 6090 阅读 · 0 评论 -
最大连续子序列和
算法分类:动态规划代码实现:(HDU1231)#include #include #include #include using namespace std;const int N = 10005;int data[N];int K;int main(){ while (scanf("%d",&K)!=EOF, K) { for (int i = 1原创 2012-05-13 21:08:23 · 886 阅读 · 0 评论 -
凸包
算法分类:计算几何算法时间复杂度:graham,O(nlogn)算法原理:凸包问题 —— Graham扫描法: 找出点集p[]中最下面的点(有多个时取最左边的),以该点为极点,求出其他所有点的极角,显然,极角范围为 [0, 180)度,对这些点按极角的升序排序,也就是按极角的余切值降序排列,先把极点和排序后的第一个点和第二个点入栈,再一次循环(原创 2012-05-31 20:56:47 · 1058 阅读 · 0 评论 -
网络流
预备知识:设G=(V,E)是有两个称为源和汇的特异顶点s,t的有向图,c(u,v)是定义在所有顶点对上上的容量函数,若(u,v)∈E,则c(u,v)>0,否则c(u,v)=0.定义一:一个G上的流是一个顶点对上的实函数f,具有以下4个条件。C1:斜对称:对于所有u,v∈V,f(u,v)= - f(u,v),我们说如果f(u,v)> 0,则存在从u到v的流C2:容量约束:对于所有u,原创 2012-06-03 19:38:35 · 766 阅读 · 0 评论 -
线段树
树结构的基本思想是分割。普通二叉搜索树是按照对象来进行划分,因此效果往往和数据结构内对象有关;而线段树是根据关键码的可能范围来分的,这种技术叫做关键空间分解。 线段树的处理对象是线段(一般意义上的区间也可以看成是线段),它把线段组织成利于检索和统计的形式,它的本质是线段的二叉搜索树。但是线段可以分解和合并,线段树又有一些一般二叉树没有的特殊的操作。另外,线段树操作的是整个区间,它原创 2012-07-07 19:45:34 · 1105 阅读 · 0 评论 -
红黑树
网址:http://dongxicheng.org/structure/red-black-tree/1. 简介红黑树是一种自平衡二叉查找树。它的统计性能要好于平衡二叉树(AVL树),因此,红黑树在很多地方都有应用。在C++ STL中,很多部分(目前包括set, multiset, map, multimap)应用了红黑树的变体(SGI STL中的红黑树有一些变化,这些修改提供了更转载 2012-07-16 14:54:05 · 4649 阅读 · 0 评论 -
RMQ
问题定义:RMQ(Range Maximum/Minimum Query)的缩写,顾名思义是用来求某个区间内的最大值或最小值,通常用在需要多次询问一些区间的最值的问题中。原理:用val[1..N]表示一组数,F[i,j]表示从val[i]到val[i+2^j-1]这个范围内的最大值,也就是以val[i]为起点连续2^j个数的最大值,由于元素个数为2^j个,所以从中间平均分成两部分,每一原创 2012-08-01 18:46:10 · 853 阅读 · 0 评论 -
LCA转RMQ
转自:http://blog.sina.com.cn/s/blog_5ceeb9ea0100kynz.htmlLCA(a,b)转RMQ就是把从节点a到节点b的这条路径记下来(用dfs访问变成一维数组),然后求这条路径上面深度值最小的那个节点,这个节点的编号就是所求的LCA。至于为什么说深度最小的这个节点为所求是因为深度最小这个节点当然在这条路径的最上面,故为所求转载+修转载 2012-08-03 22:47:23 · 1033 阅读 · 0 评论 -
后缀数组(详细)
后缀数组——处理字符串的有力工具作者:罗穗骞2009年1月 【摘要】 后缀数组是处理字符串的有力工具。后缀数组是后缀树的一个非常精巧的替代品,它比后缀树容易编程实现,能够实现后缀树的很多功能而时间复杂度也并不逊色,而且它比后缀树所占用的内存空间小很多。可以说,在信息学竞赛中后缀数组比后缀树要更为实用。本文分两部分。第一部分介绍两种构造后缀数组的方法,重点介绍如何转载 2012-08-07 16:12:39 · 44445 阅读 · 3 评论 -
树状数组
1、概述树状数组(binary indexed tree),是一种设计新颖的数组结构,它能够高效地获取数组中连续n个数的和。概括说,树状数组通常用于解决以下问题:数组{a}中的元素可能不断地被修改,怎样才能快速地获取连续几个数的和?2、树状数组基本操作传统数组(共n个元素)的元素修改和连续元素求和的复杂度分别为O(1)和O(n)。树状数组通过将线性结构转换成伪树状结构(线性转载 2012-07-25 10:25:58 · 740 阅读 · 0 评论 -
后缀树的构造方法
http://blog.163.com/lazy_p/blog/static/13510721620108139476816/ 最近在学习后缀树的构造,在网上找了好久发觉国内详解它的构造的文章胜少,在苦苦寻觅了许久,终于发现了一个网友翻译的一篇文章,很好,于是我转帖出来,希望能有更多的人受益,也希望国内多一些英文高手多翻译一些国外的技术文章,好让我们这些英文很烂的人受益,呵呵!转载 2012-07-25 11:07:41 · 1459 阅读 · 0 评论 -
后缀数组
作者:Dong | 可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址:http://dongxicheng.org/structure/suffix-array/1. 概述后缀数组是一种解决字符串问题的有力工具。相比于后缀树,它更易于实现且占用内存更少。在实际应用中,后缀数组经常用于解决字符串有关的复杂问题。本文大部分内容摘自参考资料[1][2转载 2012-07-26 10:21:02 · 706 阅读 · 0 评论 -
康托展开
转自:http://blog.csdn.net/morgan_xww/article/details/6275460康托展开:X=an*(n-1)!+an-1*(n-2)!+...+ai*(i-1)!+...+a2*1!+a1*0!ai为整数,并且0 应用实例:{1,2,3,4,...,n}的排列总共有n!种,将它们从小到大排序,怎样知道其中一种排列转载 2012-08-10 16:01:07 · 2777 阅读 · 0 评论 -
RMQ与LCA问题
转自:http://www.cnblogs.com/drizzlecrj/archive/2007/10/23/933472.html作者: By danielp转载 2012-08-01 11:50:15 · 1641 阅读 · 0 评论 -
排序算法的重要评价标准
排序算法的评价标准:1.时间复杂度2.空间复杂度(in-place)3.稳定性(是否干扰之前已排序好的数组的顺序)翻译 2012-08-26 21:11:08 · 3185 阅读 · 0 评论 -
图的着色问题
算法分类:回溯算法原理:见《算法设计技巧与分析》 P219算法时间复杂度:最坏时间复杂度(n3^n)代码实现:(POJ1129)/* Author: jokes000 * POJ 1129 * Channel Allocation */#include #include using namespace std;int G[27]原创 2012-05-07 09:25:59 · 1345 阅读 · 0 评论 -
强连通分量
转载地址:http://blog.renren.com/share/267993267/4028505439算法分类:图论问题定义:有向图强连通分量:在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,则称G是一个强连通图。非强连通图有向图的极大强连通子图,成为强连通分转载 2012-05-06 10:45:30 · 32664 阅读 · 12 评论 -
程序员面试、算法研究、编程艺术、红黑树4大系列集锦与总结
http://blog.csdn.net/v_july_v/article/details/6543438转载 2012-02-26 13:10:17 · 1858 阅读 · 0 评论 -
快速排序
算法分类:分治算法原理:类似于合并排序,而其优于合并排序,因为其对数组是在原位上排序,不需额外辅助空间。时空复杂度:O(nlogn) (theta)代码实现:/* * 快速排序 */ #include using namespace std;int split(int data[], int l, int r){ int i原创 2012-04-25 14:56:55 · 669 阅读 · 0 评论 -
STRASSEN算法(矩阵乘法)
算法分类:分治算法原理:时空复杂度:O(n的log7次方),少于传统算法的是空复杂度O(n立方)代码实现:原创 2012-04-26 19:55:04 · 1070 阅读 · 0 评论 -
合并(归并)排序 算法原理与实现
算法分类:分治算法原理:合并排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。 将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表。时空复杂度:时间复杂度O(nlogn)空间复杂度O(n)原创 2012-04-24 16:25:00 · 2675 阅读 · 0 评论 -
第K小元素
算法分类:分治算法原理:每次丢弃一部分数组中元素,则问题规模以几何级数递减。算法步骤:1.对数组进行分组,分成小于data[k]元素,data[k],以及大于data[k]元素3组。2.判断小于data[k]的元素个数num。(1) 若num+1 == k,则返回data[k](获得答案)(2) 若num + 1 (3) 若num + 1 > k原创 2012-04-24 19:07:14 · 1210 阅读 · 3 评论 -
寻找多数元素
算法分类:归纳法,递归算法原理:多数元素定义:有整型数组a[1...n],如果整数x在数组a中出现的次数多于半数,则x称为多数元素算法基于理论:在原序列中去除两个不同的元素后,那么在原序列中的多数元素在新序列中还是多数元素时空复杂度:O(n)代码实现(C):#include int candidate(int a[], int m, i原创 2012-04-24 16:38:31 · 1090 阅读 · 0 评论 -
0/1背包问题
算法类型:动态规划算法原理:V[i, j] = 0 (i=0或j=0) = V[i-1][j] (j = max { V[i-1][j], V[i-1][j-si] + vi }算法时间复杂度:theta(nC) 表的大小最优解可在theta(C)空间内得到。代码实现:hdu2602/* * 0/1背包问题原创 2012-04-29 19:07:13 · 1198 阅读 · 0 评论 -
最短路径问题(Dijkstra解法)
算法分类:贪心算法原理:设置一个顶点的集合s,并不断地扩充这个集合,一个顶点属于集合s当且仅当从源点到该点的路径已求出。开始时s中仅有源点,并且调整非s中点的最短路径长度,找当前最短路径点,将其加入到集合s,直到终点在s中。基本步骤:1、把所有结点分成两组: 第一组:包括已经确定最短路径的结点; 第二组:包括尚未确定最短路径的结点原创 2012-04-29 19:49:17 · 12538 阅读 · 0 评论 -
并查集(按秩合并、路径压缩)
算法分类:数据结构算法原理:通过find函数找出该节点的根节点,通过UNION函数将两棵树合并。加入rank[N]来记录每个节点的秩(即树的高度),并按秩进行合并,可避免合并时的最糟糕情况,(树形为一条直线)通过路径压缩可以减少每次寻找根节点的次数。算法时间复杂度:最坏情况为O(mlogn)一般为O(m)代码实现:(HDU1232-畅原创 2012-04-30 11:15:42 · 12429 阅读 · 1 评论 -
最小生成树(Kruskal)
算法分类:贪心算法原理:先从对权以非降序排列着手。接着从由图的顶点组成而不包含边的森林(V,T)开始,重复下面的这一步,知道(V,T)被换成一棵树:设(V,T)是到现在为止构建的森林,e∈(E-T)为当前考虑的边,如果把e加到T中不生成一个回路,那么将e加入到T,否则丢弃e。这个处理在恰好加完n-1条边后结束。概括如下:1. 对G的边以非降序权重排列;2.原创 2012-04-30 10:32:03 · 1148 阅读 · 0 评论 -
最近点对问题
算法分类:分治算法问题描述:平面上有n个点的集合,在n中找到一对点p和q,使其相互之间的距离最短。(在所有S中点对间最小)算法原理:最近点对问题定义:已知上m个点的集合,找出对接近的一对点。 在二维空间里,可用分治法求解最近点对问题。预处理:分别根据点的x轴和y轴坐标进行排序,得到X和Y,很显然此时X和Y中的点就是S中的点。原创 2012-04-26 19:58:46 · 1197 阅读 · 0 评论 -
最长公共子序列
算法分类:动态规划算法原理:如果i和j都大于0,那么若ai=bj,L[i, j] = L[i-1][j-1] + 1;若ai算法时空复杂度:时间复杂度:(theta)(mn) 习题地址:hdu1159代码实现:/* * HDU 1159 Common Subsequence * 最长公共子序列问题: 动态规划 *原创 2012-04-29 10:43:22 · 2323 阅读 · 0 评论 -
堆排序
算法分类:数据结构算法原理:对于非降序排列而言:(升序同理)利用最大最小堆的性质,每次对数组生成最大堆后即将根节点放置到数组末尾,并对剩余数组继续生成最大堆。算法时间复杂度:时间复杂度:O(nlogn)空间复杂度:O(1)代码实现:hdu1040#include using namespace std;int data[1005];原创 2012-05-01 20:26:36 · 834 阅读 · 0 评论 -
直线分割平面 与 平面分割区域 问题
这类问题一般都有固定的公式,告诉大家一个技巧:二维的一般是an^2+bn+c,三维的一般是an^3+bn^2+cn+d.用待定系数法求出各个系数就OK了,不用想破脑筋找规律。。。。。。 0rz…..此乃神人(1) n条直线最多分平面问题题目大致如:n条直线,最多可以把平面分为多少个区域。析:可能你以前就见过这题目,这充其量是一道初中的思考题。但一转载 2012-04-18 16:37:51 · 1524 阅读 · 0 评论 -
寻找多数元素 算法
定义: 整型数组a[1...n],如果整数x在数组a中出现的次数多于半数,则x称为多数元素应用概念:观察结论5.1:在原序列中去除两个不同的元素后,那么在原序列中的多数元素在新序列中还是多数元素。例1: 1,2,2,3,2,2,3 显然2是多数元素去除1,2,在2,3,2,2,3中2仍是多数元素去除1,3,在2,3,2,2,3中2更是多数元素例2: 1,3,2,3,2原创 2012-04-20 19:29:44 · 5535 阅读 · 1 评论 -
Dijkstra + 堆优化
Dijkstra算法原理请见:最短路径问题(Dijkstra解法)该算法对于稠密图更加有效:对于给出具有非负权重的边和源顶点S的图G,算法可在O(mlogn)时间内找出从s点到其他每一个顶点的距离。如果图是稠密的,即对于某个ε>0,m>=n^(1+ε),可以被改善在O(m/ε)内执行。(m为图的边数,n为图的定点数)最小堆模板:struct HeapElemen原创 2012-05-04 11:27:09 · 15476 阅读 · 3 评论 -
Prim算法
算法分类:贪心算法原理:1. 在图G=(V, E) (V表示顶点 ,E表示边)中,从集合V中任取一个顶点(例如取顶点v0)放入集合 U中,这时 U={v0},集合T(E)为空。2. 从v0出发寻找与U中顶点相邻(另一顶点在V中)权值最小的边的另一顶点v1,并使v1加入U。即U={v0,v1 },同时将该边加入集合T(E)中。3. 重复2,直到U=V为止。这时T(E)原创 2012-05-04 09:39:42 · 861 阅读 · 0 评论 -
栈和队列的问题
1. 有两个栈的队列:用两个栈来实现一个队列,从而使每个队列操作(enqueue(), dequeue()...)使用一个平均情况下的O(C)操作内完成。 English version: Implement a queue with two stacks so that each queue operations takes a constant amortized number of翻译 2012-08-23 16:57:04 · 1292 阅读 · 0 评论