随笔分类 -  Theory

STL的堆操作 [转]
摘要:STL里面的堆操作一般用到的只有4个:make_heap();、pop_heap();、push_heap();、sort_heap(); 他们的头文件函数是#include <algorithm> 首先是make_heap(); 他的函数原型是:void make_heap(first_pointer,end_pointer,compare_function); 一个参数是数组或向量的头指针,第二个向量是尾指针。第三个参数是比较函数的名字。在缺省的时候,默认是大跟堆。(下面的参数都一样就不解释了) 作用:把这一段的数组或向量做成一个堆的结构。范围是[first,last) 然后是 阅读全文

posted @ 2011-11-20 13:30 龙豆 阅读(292) 评论(0) 推荐(0) 编辑

Sharp-P(#P)和NP计算复杂度[转]
摘要:今天主要研究 Sharp-P (#P)和 NP 的计算复杂度的问题。 NP 计算复杂度大多数人都听说过, 即非定常多项式(英语:non-deterministic polynomial,缩写NP) 时间复杂性类,或称非确定性多项式时间复杂性类, 包含了可以在多项式时间内验证其解是否正确的那些问题。 注意:NP的定义没有谈到任何 关于求解的问题,只是所说:多项式时间内验证其解是否正确。比如: 我们给一个0-1背包的解,就可以在多项式时间内验证是否满足条件。至于是否能找到 满足条件的解,这在NP复杂度里没有规定。 Sharp-P (#P)的定义主要指NP问题中对应的满足条件的实例或路径的个数... 阅读全文

posted @ 2011-11-03 23:02 龙豆 阅读(2560) 评论(0) 推荐(0) 编辑

C++ 随机数生成 [转]
摘要:C++ 随机数生成 标准库<cstdlib>(被包含于<iostream>中)提供两个帮助生成伪随机数的函数:函数一:int rand(void);从srand (seed)中指定的seed开始,返回一个[seed, RAND_MAX(0x7fff))间的随机整数。函数二:void srand(unsigned seed);参数seed是rand()的种子,用来初始化rand()的起始值。可以认为rand()在每次被调用的时候,它会查看:1) 如果用户在此之前调用过srand(seed),给seed指定了一个值,那么它会自动调用srand(seed)一次来初始化它的起始 阅读全文

posted @ 2011-10-15 23:22 龙豆 阅读(309) 评论(0) 推荐(0) 编辑

RMQ+1/-1算法 [转]
摘要:[转] http://blog.csdn.net/ljsspace/article/details/6659517 RMQ+1/-1问题要求数列中相邻两个元素相差+1或-1。利用这个限定条件可以使该算法复杂度总体上达到<O(n),O(1)>。具体做法是:1) 设数列A的大小为n,先对数列A分组,每组大小为b=1/2.logn (之所以这样分是为了将预处理复杂度从O(nlogn)降为O(n)),共分为n/b个组;以下第2到第4步完成RMQ+1/-1问题的预处理阶段(参考以下实现中的preprocess方法)。2)生成O(sqrt(n))个LU表P[][]和一个block类型数组T[] 阅读全文

posted @ 2011-10-14 22:08 龙豆 阅读(1445) 评论(0) 推荐(0) 编辑

二维模式(矩阵)匹配(Rabin-Karp算法推广到二维)[转]
摘要:本文着重讨论由Rabin-Karp算法推广到二维来解决二维模式匹配问题的算法。问题: 在一个n1*n2的二维字符组成中搜寻一个给定的m1*m2的模式。参考《算法导论》习题32.2-3.分析: 1. 首先简单介绍一下Rabin-Karp算法 Rabin-Karp算法是一种字符串匹配算法,它的主要思想是预先计算出模式串的hash值,匹配时再计算出待匹配子串的hash值,直接比较模式串和当前子串的hash值是否相等即可判断是否匹配。为了便于说明,以下以数字串为例(字符串的每个字符都是一个十进制的数字,比如字符串31415)。已知一个模式P[1..m],设p表示其相应的 十进制数的值。类似的,对于给定 阅读全文

posted @ 2011-10-05 10:33 龙豆 阅读(4213) 评论(0) 推荐(0) 编辑

Matroid[转]
摘要:【矩阵胚(拟阵)的定义】 矩阵胚(拟阵)是一个满足遗传性质与交换性质的序对M=(S, I),其中S是一个非空有限集,I是S的一个非空子集族。 【遗传性质的定义】 若X∈I,则X的任意子集∈I(X是遗传的)。 【交换性质的定义】 若A∈I,B∈I,且|A|>|B|,则∃x∈A-B,使B∪{x}∈I。 【独立子集的定义与性质】 定义:若X∈I,则X是S的独立子集。 性质:独立子集的任意子集都是独立子集。 【矩阵胚(拟阵)的性质】 ①S有至少一个独立子集——空集。 ②独立子集是遗传的。 【加权矩阵胚的定义与性质】 定义:把S中的元素加正的权,可以得到一个加权矩阵胚。 性质... 阅读全文

posted @ 2011-10-03 11:21 龙豆 阅读(437) 评论(0) 推荐(0) 编辑

KMP 算法并非字符串查找的优化 [转]
摘要:算法书和数据结构书对KMP算法多有介绍,称只需对字符串扫描一遍不需回溯云云.然而,它恐怕只应该作为一种思想存在;用于实际的字符串查找并不理想.要费劲心血实现和优化它,才能在特定的字符串上略微超过(也可能略微逊过)std::search. KMP算法的基本思想,是利用需要匹配字符串的自身信息来避免回溯.(这里讨论的算法是以C/C++为编程语言,因此下标索引以0开始) 例如:字符串PAT=”abcabcde”,里面第二段的abc和PAT开头的字符是匹配的. 假如我们有个要查找的字符串TEXT=”abcabD...”,在比较到TEXT的'D'处(TEXT[5])也即到了PAT的第二个 阅读全文

posted @ 2011-09-25 23:36 龙豆 阅读(1996) 评论(0) 推荐(0) 编辑

精确字符串匹配(BM算法) [转]
摘要:Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE ... 阅读全文

posted @ 2011-09-25 23:26 龙豆 阅读(1873) 评论(0) 推荐(0) 编辑

字符串模式匹配——Shift-And和Shift-OR算法[转]
摘要:Shift-And算法思想较之KMP算法很简单,设模式字符串为P,它主要通过保存一个集合D(D中记录了P中所有与当前已读text的某个后缀相匹配的前缀),每当text有新的字符读入,算法利用位并行机制来更新这个集合D。 设P长度为m,则集合D可表示为D=dm…d1而用D[j]代表dj D[j]=1当且仅当p1…pj是t1…ti的某个后缀,当D[m]=1时,就认为P已经于text匹配。 当读入下一个字符ti+1,需要计算新的集合D′.当且仅当D[j]=1并且ti+1等于pj+1时D'[j+1]=1.这是因为D[j]=1时有p1…pj是t1…ti的一个后缀,而当ti+1等于pj+1可推出. 阅读全文

posted @ 2011-09-25 22:49 龙豆 阅读(4570) 评论(1) 推荐(0) 编辑

将WIN8装入U盘和移动硬盘教程【转】
摘要:将WIN8装入U盘和移动硬盘教程 在前面得文章里我们向大家先容了Windows 8(以下简称Win8)各种新特性,其中一个显著的特性就是:Win8开始支持在USB设备上启动。这就意味着以后我们可以将Win8随身携带。固然Win8还没有正式发布,但我们也可以提前体验Win8这个新特性。 移动Win8原理解析 本文的方法是通过启动移动硬盘里装有Win8系统的VHD文件,从而实现移动系统的效果。首先,我们要了解从VHD启动系统的一些知识,它的启动流程以及我们需要进行DIY的步骤如图1所示。 最新XP系统下载地址:http://www.xitongzhijia.net/xp/ 最新Win7系统下载地址 阅读全文

posted @ 2011-09-15 23:13 龙豆 阅读(2232) 评论(0) 推荐(0) 编辑

并行排序算法【转】
摘要:一、谁能把这个程序的性能提升一倍?---并行排序算法http://www.cnblogs.com/onlytiancai/archive/2009/04/21/1440829.html如下,一组4元矢量的排序,如何把排序时间缩减一半?可以用并行算法。using System;using System.Collections.Generic;using System.Diagnostics;namespace Vector4Test{ public class Vector { public double W; public double X; ... 阅读全文

posted @ 2011-09-04 23:31 龙豆 阅读(723) 评论(1) 推荐(1) 编辑

sap算法详解与模板 [转]
摘要:链接:1. Maximum Flow: Augmenting Path Algorithms Comparison http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=maxFlowRevisited2. 刘汝佳《算法艺术与信息学竞赛》 P321 ( 注: 上面的代码似乎有误,retreat()部分未回退< 详见下文or 链接1. > )---------------------------------------------关键概念与性质:距离函数(distance function),我们 阅读全文

posted @ 2011-09-04 14:55 龙豆 阅读(3127) 评论(0) 推荐(1) 编辑

最大流的算法小结 Algorithm for Maximum Flow
摘要:【转】————————————————————————————算法名称 复杂度概要增广路方法 Augmenting path method (Ford Fulkerson method)一般增广路算法Labeling algorithmO(nmU)在残留网络中,每次任意找一条增广路径增广。容量缩放增广路算法 Capacity scaling algorithmO(nm logU)在残留网络中,每次找一条有最大可增广容量和的增广路径增广,即残留网络中源到汇的最长路。最短增广路算法 Shortest augmenting path algorithm (Edmonds Karp algorithm 阅读全文

posted @ 2011-08-14 16:47 龙豆 阅读(1089) 评论(0) 推荐(0) 编辑

关于最小生成树的一些理解
摘要:Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE 【转】(1) 定义在一棵树里添加一条边,并在产生的圈里删除一条边叫做一次操作。(也就是说换掉一条边并且保证结果是树),则树A和B是无向图的两个生成树,则A可以通过若干次操作变成B。 证:把树看作边的集合,如果B中有一条A没有的边,则把这条边加到A上,A产生一个圈中至少有一条是B中没有的边,把这条边删掉,则A仍然是生成树,A,B集合相同的边多了一条,重复这个过程直到A B包含的边相同。注:这个命题比较容易证,它告诉我们任何两棵生成树都可以通过不断换边得到。(重要的是换边的过程中始终保. 阅读全文

posted @ 2011-08-09 21:05 龙豆 阅读(1504) 评论(0) 推荐(0) 编辑

Splay树简介
摘要:【转】计算机算法和数据结构中,有各种多样的树,比如AVL树,红黑树,B+树等等,这几种树主要的主要目的是尽量保持平衡,保证即使在最坏情况下,时间复杂度是O(logN),也就是说,从根节点到最底层的叶子节点,路径不会相差太远。比如B+树,它通过节点的分裂来保持尽量平衡,而且这种树比较散,高度不高,访问路径都比较短,比较适合在数据库中作索引。但是今天我要说一说splay树,我不知道中文叫什么名字,也许该叫它“变根树”。Splay树与众不同的是:它并不一味追求平衡,而是追求整体的效率。当一个节点被访问以后,通过树的旋转,这个节点被移动到最上层,成为新的根节点。旋转以后,这棵树有可能变得很不平衡。但是 阅读全文

posted @ 2011-07-20 21:24 龙豆 阅读(1845) 评论(0) 推荐(1) 编辑

AVL树
摘要:ZhangFei 12.00 Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE MicrosoftInternetExplorer4 【转】数据结构学习(C++)——平衡二叉树(AVL树)这个恐怕是整个《数据结构》教科书里面最难的和最“没用”的数据结构了(现在的教科书还有部分算法内容)。说它没用,恰恰是因为它太有用——有着和普通的二 叉搜索树完全一样的接口界面,绝大多数情况下比普通的二叉搜索树效率高(很多)。因此,通常情况下,人们都是一劳永逸的——写完后就重用,而不会再写了。 所以说,你虽然学完了平衡二叉树,但很可能你永远也不会亲. 阅读全文

posted @ 2011-07-20 20:59 龙豆 阅读(1387) 评论(0) 推荐(1) 编辑

红黑树(red-black tree)算法,附AVL树的比较
摘要:【转】【经典】导读: linux内核中的用户态地址空间管理使用了红黑树(red-black tree)这种数据结构,我想一定有许多人在这种数据结构上感到困惑,我也曾经为此查阅了许多资料以便了解红黑树的原理。最近我在一个外国网站上看到一篇讲解红黑树的文章,觉得相当不错,不敢独享,于是翻译成中文供所有内核版的弟兄们参考。由于本人水平有限,难免有出错之处,欢迎大家指正。 原文网址:http://sage.mc.yu.edu/kbeen/teaching/algorithms/resources/red-black-tree.html 加两个链结地址: 红黑树的实地使用 http://www.linu 阅读全文

posted @ 2011-07-20 20:55 龙豆 阅读(7498) 评论(0) 推荐(0) 编辑

非递归遍历二叉树[转]
摘要:【转】http://blog.csdn.net/kofsky/article/details/28864531.先序遍历从递归说起voidpreOrder(TNode*root){if(root!=NULL){Visit(root);preOrder(root->left);preOrder(root->right);}}递归算法非常的简单。先访问跟节点,然后访问左节点,再访问右节点。如果不用递归,那该怎么做呢?仔细看一下递归程序,就会发现,其实每次都是走树的左分支(left),直到左子树为空,然后开始从递归的最深处返回,然后开始恢复递归现场,访问右子树。其实过程很简单:一直往左走 阅读全文

posted @ 2011-07-16 19:43 龙豆 阅读(583) 评论(0) 推荐(0) 编辑

树状数组[转]
摘要:先看比较基础的讲解:【转】今天先来讨论一下树状数组.问题提出:已知数组a[],元素个数为n,现在更改a中的元素,要求得新的a数组中i到j区间内的和(1<=i<=j<=n).思考:对于这个问题,我们可以暴力地来解决,从a[i]一直累加到a[j],最坏的情况下复杂度为O(n),对于m次change&querry,合起来的复杂度为O(m*n),在n或m很大的情况下,这样的复杂度是让人无法忍受的.另外,如果没有元素的变更,我们完全可以存储sum[1,k](k=1,2,……),然后对任意给定的查找区间[i,j],都可以方便的用ans=sum[1,j]-sum[1,i-1],当然 阅读全文

posted @ 2011-07-06 18:28 龙豆 阅读(311) 评论(0) 推荐(0) 编辑

导航