数据结构和算法
文章平均质量分 75
chuanwang66
软件工程专业
展开
-
回文算法(递归+从数字串拼凑N进制数)
回文是指正读反读均相同的字符序列,如“abba”,和“abdba”均是回文,但“good”不是回文,试写一个算法判定给定的字符向量是否为回文。字符串回文public static boolean check(String str) { if (str.length() > 1) { if (str.charAt(0) != str.charAt(str.le...原创 2011-07-10 10:25:23 · 181 阅读 · 0 评论 -
搜索(一)——剪枝
参考文档:《搜索方法中的剪枝优化》——南开中学 齐鑫(见附件《剪枝》) 一、剪枝优化的核心问题是设计剪枝判断方法,即确定哪些枝条应当舍弃,哪些枝条应当保留的方法。 二、剪枝的原则:1. 正确性:即必须保证不丢失正确的结果,这是剪枝优化的前提。为了满足这个原则,我们就应当利用“必要条件”来进行剪枝判断。也就是说,通过解所必须具备的特征、必须满足的条件等方面来考察...原创 2012-03-24 11:46:54 · 170 阅读 · 0 评论 -
搜索(二)——双向BFS
参考这篇文章,以下前部分为转载:http://www.cppblog.com/Yuan/archive/2011/02/23/140553.aspx大牛,谢谢!不是你,我还在用交替节点搜索呢:{ ——应该用交替层次搜索 如果目标也已知的话,用双向BFS能很大提高速度。单向时,是 b^len的扩展。双向的话,2*b^(len/2) 快了很多,特别是分支因子b较大时至于实现上,...原创 2012-03-24 17:18:37 · 307 阅读 · 0 评论 -
双指针策略(《编程之美》3.5 最短摘要生成)
本文源自《编程之美》3.5 最短摘要生成一课。 题意:在一个字符串中,找一些目标字符串集合,找到包含所有目标字符串的最小连续子串。题目虽然叫做“最短摘要生成”,但和实际上的搜索snippet的计算还有较大差距。 解法:采用了“双指针”策略,其思想在很多算法设计中都有价值。思想是:开始两个指针都指向缓冲区头部,尾指针向后扫描,直到头指针和尾指针中间包含了全部的关键字;...原创 2013-03-26 15:17:51 · 180 阅读 · 0 评论 -
关键路径(AOE)
前面这段话是引用别人的,后面代码是自己写的,有待完善: 求关键路径的关键如下:1、每个顶点所代表的事件的最早和最迟发生时间2、每条弧所代表的活动的最早和最迟开始时间事件的最早发生时间:ve[源点]=0,ve[k]=MAX{ve[j]+dut(<j,k>)},即在k前面的事件的最早发生时间加上那些事件到k所需要的时间所得的值中取最大值。事件的最迟发生时间:vl[汇...原创 2012-04-10 08:05:57 · 240 阅读 · 0 评论 -
单向链表相关
单向链表是微软笔试常考的,参考这里:http://www.cnblogs.com/tdyizhen1314/archive/2012/04/03/2431124.html #include<iostream>using namespace std;struct node{ int data; struct node* next;...原创 2012-04-10 16:42:41 · 77 阅读 · 0 评论 -
大整数运算(部分转载)
待补充:“浮点数高精度运算” 参见这里==>大整数四则运算各举例: http://www.cnblogs.com/vongang/archive/2011/08/17/2143303.html大整数出发还可以参考这里的解释:http://blog.sina.com.cn/s/blog_7393daaf0100sutp.html 当对很大的数(比如10...原创 2012-04-12 21:36:19 · 190 阅读 · 0 评论 -
后缀数组
一、后缀数组 及其对应的名次数组举例:S=" B A C $ " , 后缀数组长度为n-1=3, 假定'$'<字符集Σ中的任意字符 1 2 3 41. 后缀数组SA=[4 2 1 3] , 对应所有后缀的一个字典序从小到大的序列SA[1]=4 --> 对应 "$"...原创 2012-04-16 09:49:48 · 98 阅读 · 0 评论 -
状态压缩DP
引例、 例1、 例2、 例3、 例4、POJ2411:Mondriaan's Dream 多米诺骨牌完美覆盖问题 本质上还是“dp[]——下标为状态,值为方案数”的状态压缩DP 注:DP中的状态转换不一定是“公式表示”,可能是“DFS搜索出来的”,也可以是“人工列举出来的所有情况(i.e. 列数m很小的情况,如m=4)”/*...原创 2012-11-14 20:27:47 · 86 阅读 · 0 评论 -
哈希Hash
要点一:哈希表长度的确定是个两难的问题:太短则容易造成冲突(POJ->TLE);太长则浪费存储空间(POJ->MLE)。另外,有兴趣看一下“最小完美哈希函数” 要点二:哈希冲突是必须解决的问题,主要有一下几种解决方案 (1)开放定址法:当冲突发生时,使用某种探查(亦称探测)技术在散列表中形成一个探查(测)序列。沿此序列...原创 2012-11-21 14:42:39 · 103 阅读 · 0 评论 -
搜索(三)——回溯
一、回溯 和 深度搜索 是什么关系 对于某一个搜索树来说(搜索树是起记录路径和状态判断的作用),回溯和DFS,其主要的区别是,回溯法在求解过程中不保留完整的树结构,而深度优先搜索则记下完整的搜索树。 二、递归回溯 和 迭代回溯 题目一:在n个数字中,任意找k个数字(k<=n),打印所有的可能的情况。#include <iostream>#include...原创 2012-11-23 15:23:27 · 84 阅读 · 0 评论 -
K-MEDOIDS聚类算法
k-medoids聚类算法(wiki上讲得很清楚啊:) ): http://en.wikipedia.org/wiki/K-medoids 有空再看下其他方法:http://blog.csdn.net/abcjennifer/article/details/8170687原创 2012-12-04 21:18:19 · 444 阅读 · 0 评论 -
RMQ(Range Minimum/Maximum Query)区间最值查询
一、RMQ问题描述 和 几种解题思路RMQ问题 (Range Minimum/Maximum Query),首先给出一个序列,然后不断询问某个区间内的最大值和最小值。显然,我们在回答所有询问之前,需要根据序列进行一定的预处理。 (1)最笨的算法显然是朴素的直接查询,回答每个问题是O(n)的。(2)一种算法是采用线段树,即在线段树的每个节点保存该区间的最大值与最小值,O(...原创 2012-04-18 20:47:14 · 155 阅读 · 0 评论 -
二叉树相关
本节主要是为了写二叉树类型题目练手的代码,重点培养运用“指针”。 《编程之美》3.9重建二叉树 : 已知前序和中序,重建二叉树#include <iostream>using namespace std;#define TREELEN 6struct NODE{ NODE* pLeft; NODE* pRight; char chValue;...原创 2013-10-04 17:40:28 · 72 阅读 · 0 评论 -
LRU简单实现C++
页面置换算法: 在地址映射过程中,若在页面中发现所要访问的页面不再内存中,则产生缺页中断。当发生缺页中断时操作系统必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。而用来选择淘汰哪一页的规则叫做页面置换算法。下面是LRU简单实现:双向链表,时间复杂度O(n)#include <iostream>#include <assert.h>using ...原创 2013-10-17 10:52:56 · 313 阅读 · 0 评论 -
滚动数组
转载:http://blog.csdn.net/niushuai666/article/details/6677982 滚动数组的作用在于优化空间,主要应用在递推或动态规划中(如01背包问题)。因为DP题目是一个自底向上的扩展过程,我们常常需要用到的是连续的解,前面的解往往可以舍去。所以用滚动数组优化是很有效的。利用滚动数组的话在N很大的情况下可以达到压缩存储的作用。一个简单的例子:...原创 2012-03-24 10:35:52 · 85 阅读 · 0 评论 -
模拟退火
引用:http://www.cnblogs.com/heaad/archive/2010/12/20/1911614.html 一. 爬山算法 ( Hill Climbing ) 介绍模拟退火前,先介绍爬山算法。爬山算法是一种简单的贪心搜索算法,该算法每次从当前解的临近解空间中选择一个最优解作为当前解,直到达到一个局部最优解。 ...原创 2012-10-28 16:34:52 · 216 阅读 · 0 评论 -
K-MEANS聚类算法
K-MEANS算法 输入聚类个数k,以及包含 n个数据对象的数据库,输出满足方差最小标准的k个聚类。 k-means 算法接受输入量 k ;然后将n个数据对象划分为 k个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小。聚类相似度是利用各聚类中对象的均值所获...原创 2011-10-06 22:20:54 · 147 阅读 · 0 评论 -
P问题、NP问题和NPC问题
这篇文章转自这里:http://www.matrix67.com/blog/archives/105 以前我老老实实看过算法导论上关于NP问题的那一节,当时细节都弄得很清楚了,但是时隔2、3年就彻底忘完了,今天看到这篇文章,觉得真正从感性上认识了P问题、NP问题、NPC问题,分享一下。并附上我自己对本文的总结,以便以后略略一翻就知道文章思路:) 一、总结 ...原创 2012-04-25 16:36:50 · 93 阅读 · 0 评论 -
深入理解二分查找(二、二分答案)
二分答案 如果已知候选答案的范围[min,max],有时候我们不必通过计算得到答案,只需在此范围内应用“二分”的过程,逐渐靠近答案(最后,得到答案)!一、何时可以使用“二分答案” 不是任何题目都适合使用“二分答案”的,我Sam观察到一般有以下的一些特征: A. 候选答案必须是离散的,且已知答案的范围是:[最小值min, 最大值max](连续区间...原创 2012-04-29 16:24:51 · 342 阅读 · 0 评论 -
气泡滚大——剔除线性数据中的杂质
这是一道Java的面试题,但是我总结了除了一种自称为“气泡滚大”的方法。适用场景—— 剔除线性数据中的杂质:O(n)时间从前到后扫描数据,杂质如同上升的气泡越滚越大,最终都浮出水面(被清理掉)。/** * Java面试题:一个很大的字符串如下a,空格,b,空格,c,空格,d.....如何去掉空格 不能用复制的方式,机子的内存已基本被字符串所占<br/>...原创 2012-06-18 09:43:27 · 137 阅读 · 0 评论 -
深入理解二分查找(一、二分查找及其变体)
《编程之美》 2.19 解法二需要在一个数组 arr[] 中找到最后一个≤ value 的值,可以顺序查找,也可以使用二分查找。但标准的二分查找用来查找 =value 的值,因此这里需要改造一下: 1. 标准二分查找: 注意:退出原因有两个——“ arr[mid]==value ,即找到” 或者 “ l==r 且仍未找到” (这个版本代码根...原创 2012-02-22 10:40:20 · 197 阅读 · 0 评论 -
并查集及举例
一、 并查集:(union-find sets) 一种简单的用途广泛的集合. 并查集是若干个不相交集合,能够实现较快的合并和判断元素所在集合的操作,应用很多,如其求无向图的连通分量个数等。最完美的应用当属:实现Kruskar算法求最小生成树。 并查集的三种操作:1、Make_Set(x) 把每一个元素初始化为一个集合初始化后...原创 2012-02-22 19:28:10 · 129 阅读 · 0 评论 -
线段树(一)——概念和应用
一、线段树概念从简单说起,线段树其实可以理解成一种特殊的二叉树。但是这种二叉树较为平衡,和静态二叉树一样,都是提前已经建立好的树形结构。针对性强,所以效率要高。这里又想到了一句题外话:动态和静态的差别。动态结构较为灵活,但是速度较慢;静态结构节省内存,速度较快。线段树有三种基本操作: build(), update(), query(). 前两个会改变数据结构,后一个不影响数据...原创 2012-02-22 21:02:32 · 126 阅读 · 0 评论 -
线段树(二)——时间、空间复杂度
参考文章:《在一维数组中以完全二叉树方式存储线段树的空间分析》 http://comzyh.tk/blog/archives/479/《线段树简介与简单应用》http://hi.baidu.com/etwge/blog/item/c6c2dff887d2eb909f514664.html 我们大家存储线段树的方式无非两种:二叉链表一维数组完全二叉树二叉链表优点是节省...原创 2012-02-28 09:36:25 · 2549 阅读 · 0 评论 -
单源最短路径
一、最短路径概念: 1、最短路路径树 在最短路径算法结束时,Gπ为最短路径树Gπ=(Vπ,Eπ) Vπ={v∈V: π[v]≠NIL}∪{s} Eπ={(π[v],v)∈E: v∈Vπ-{s}} 最短路径不一定唯一,∴最短路路径树也不一定唯一 2、松弛技术——逼近及最终达到最短路径 (基础) 引理25.1:最短路径的子路径也是最短路径 (不等式:逼近最短路径) 引理25.3:所有有向边都“...原创 2012-03-04 15:48:02 · 274 阅读 · 0 评论 -
每对结点间的最短路径
Floyd-Warshall算法: 前提:可以有负权边,但不能有负权回路 时间复杂度: O(V^3) 思路:动态规划/子问题结构/递归http://chuanwang66.iteye.com/admin/blogs/1439730/edit 例子:Silver Cow Party --> http://poj.org/problem?...原创 2012-03-04 19:41:42 · 728 阅读 · 0 评论 -
最大流(一)——各种思路
思考顺序: 先有容量限制c[] --> 有多种可能的网络流f[] --> 找最大流(流值|f|最大的流) 一、网络流 G=<V,E>为有向图 1. 容量为非负: 如果有向边(u,v) 存在,c(u,v)≥0; 如果有向边(u,v)不存在,c(u,v)=0 2. 网络流: (1)容量限...原创 2012-03-08 19:12:11 · 461 阅读 · 0 评论 -
计算几何(二)——平面最近点对
参考资料:为何这个问题采用分治法 http://blog.csdn.net/midgard/article/details/4199043主方法 《算法导论》P38~ 第4章 递归式具体的代码模板 http://www.cnblogs.com/zhaoguanqin/archive/2012/03/23/2414031.html ...原创 2012-07-12 10:54:36 · 85 阅读 · 0 评论 -
计算几何(一)——基础算法
待续 《计算几何资料》为提纲1. (1)有向线段: 如果一条线段的端点有次序之分,我们把这种线段称为有向线段(directed segment)。(2)矢量:如果有向线段p1p2的起点p1在坐标原点,则称之为矢量(vector) p2(3)(二维)矢量叉乘: P=(x1,y1), Q=(x2,y2) ==> P×Q 随便的定义: 大小|x1...原创 2012-07-12 21:07:18 · 111 阅读 · 0 评论 -
最大流(二)——SAP算法
找了半天,“百度百科”上这篇文章还能比较直观地帮我理解SAP算法: 求最大流有一种经典的算法,就是每次找增广路时用BFS找,保证找到的增广路是弧数最少的(即边权都为1时的最短路径),也就是所谓的Edmonds-Karp算法。可以证明的是在使用最短路增广时增广过程不超过|V|*|E|次,每次BFS的时间都是O(|E|),所以Edmonds-Karp的时间复杂度就是O(|V|*|E|^2)。...原创 2012-03-12 13:40:44 · 335 阅读 · 0 评论 -
快排备忘
http://hi.baidu.com/pluto455988971/item/c66f4031fff863c61a969660原创 2013-10-26 11:27:38 · 81 阅读 · 0 评论