摘要:1.最长回文子字符串(Manacher!) 给定一个字符串S=A1A2...An,要求找出其最长回文子串(Longest Palindromic Substring)。所谓回文子串就是S的某个子串Ai...Aj为回文。例如,对字符串S=abcdcbeba,它的回文子串有:bcdcb,cdc,beb,满足题目要求的最长回文子串为bcdcb。 分析: *回文可能由奇数个字符组成,也可能由偶数个字符组成。 解决方案:在字符边界添加特殊符号。例如,对字符串aba,预处理后变成#a#b#a#;对字符串abba,预处理后变成#a#b#b#a#。可以看出,不管是奇数回文,还是偶数回文,在与处理后都变...
阅读全文
摘要:1.给定任意一个正整数,求比这个数大且最小的“不重复数”,“不重复数”的含义是相邻两位不相同,例如1101是重复数,而1201是不重复数。 1 package number; 2 3 /** 4 * 给定任意一个正整数,求比这个数大且最小的“不重复数”,“不重复数”的含义是相邻两位不相同,例如1101是重复数,而1201是不重复数。 5 * @author hasee 6 * 7 */ 8 public class repeatBit { 9 public static void main(String[] args) {10 int NumGived = 9...
阅读全文
摘要:参考:http://blog.csdn.net/morewindows/article/details/6709644 数组的堆化 把一个无序数组,原地变成堆的结构。 上图是堆化成最小堆的结构。 可以看到,它是按照由小树 -> 到大树的逐步堆化。这样做是为了避免使用第二个数组。 假如是大树 到 小树 的堆化,在大树的堆化时,它并不能保证父节点的一次堆化能取到最小(大)的元素。而小树到大树的结构,可以保证小树的根节点肯定是小树的最小元素,从而保证大树只需判断左儿子和右儿子就能取到最小值。 1 package algorithm; 2 //堆排序 3 public class Hea...
阅读全文
摘要:KMP算法(3个人的名字的头字母,Knuth与Pratt和Morris),主要就是应用有限自动机的原理。 KMP算法的核心思想是利用已经得到的部分匹配信息来进行后面的匹配过程。 在S=”abcabcabdabba”中查找T=”abcabd”,如果使用KMP匹配算法,当第一次搜索到S[5]和T[5]不等后,S下标不是回溯到1,T下标也不是回溯到开始,而是根据T中T[5]==’d’的模式函数值(next[5]=2),直接比较S[5]和T[2]是否相等(换到状态2中去),因为相等,S和T的下标同时增加。 一.模式值next[n]的计算,也就是状态转移 一定要想成状态转移,eg: st...
阅读全文
摘要:1.数组中的数分为两组,让给出一个算法,使得两个组的和的差的绝对值最小 数组中的数的取值范围是0=arr[k] && isOK[i-1][v-arr[k]]) 15 * isOK[i][v] = true; 16 */ 17 static boolean isOK[][]; 18 static int sum; 19 static{ 20 isOK = new boolean[20][100]; 21 isOK[0][0] = true; 22 for (boolean[] bs : isO...
阅读全文
摘要:1.给定一个数组,其值先从小到大递增后从大到小递减,找出最大的值。eg:{1,2,5,6,4,2,1} -> 6 2.“轮转后的有序数组(Rotated Sorted Array)”,现有一特殊数组A[],它是循环递增的,eg:如A[]={ 17 19 20 25 1 4 7 9},试在这样的数组中找一元素x,看看是否存在。 3.找到轮转后的有序数组中第K小的数 4.整数的求平方根函数 其实这个问题用数学的表达方式就是:对于非负整数x,找出另一个非负整数n,其中n满足 n^2 <= x < (n+1)^2。 5.有两个已排好序的数组A和B,长度分别为n,m,找出两个有序数组中
阅读全文
摘要:转自:http://www.cnblogs.com/yanlingyin/一条鱼、尹雁铃@ 博客园 2012-4-16E-mail:yanlingyin@yeah.net在实际的过程中,总需要对一些数据进行排序,在众多的排序算法中,快速排序是较为常用的排序算法之一。而网上对于快速排序的中文资料还不是很全。写这篇博文主要记录一些自己对于快速排序的了解,以及对快速排序的性能的分析。我将在这里记录下我对快速排序的认识和学习过程 ,用尽可能简单明了的叙述来阐述我的理解。快速排序基于算法中很重要的思想是 分治。所以会先介绍一下分治思想,然后对算法原理进行介绍,接着会分析算法的性能并对算法作进一步的讨论。
阅读全文
摘要:转自:http://blog.csdn.net/andyelvis/article/details/1728378 有两种常用的方法可用来搜索图:即深度优先搜索和广度优先搜索。它们最终都会到达所有连通的顶点。深度优先搜索通过栈来实现,而广度优先搜索通过队列来实现。 深度优先搜索: 下面图中的数字显示了深度优先搜索顶点被访问的顺序。 为了实现深度优先搜索,首先选择一个起始顶点并需要遵守三个规则: (1) 如果可能,访问一个邻接的未访问顶点,标记它,并把它放入栈中。 (2) 当不能执行规则1时,如果栈不空,就从栈中弹出一个顶点。 (3) 如果不能执行规则1和规则2,就完成了整个搜索过...
阅读全文
摘要:转自:http://www.cnblogs.com/shuaiwhu/archive/2012/04/22/2464583.html 线段树在一些acm题目中经常见到,这种数据结构主要应用在计算几何和地理信息系统中。下图就为一个线段树: (PS:可能你见过线段树的不同表示方式,但是都大同小异,根据自己的需要来建就行。)1.线段树基本性质和操作 线段树是一棵二叉树,记为T(a, b),参数a,b表示区间[a,b],其中b-a称为区间的长度,记为L。 线段树T(a,b)也可递归定义为:若L>1 : [a, (a+b) div 2]为 T的左儿子; [(a+b) d...
阅读全文
摘要:转自:http://blog.csdn.net/sparkliang/article/details/52793931基本场景 比如你有N个cache服务器(后面简称cache),那么如何将一个对象object映射到N个cache上呢,你很可能会采用类似下面的通用方法计算object的hash值,然后均匀的映射到到N个cache; hash(object)%N 一切都运行正常,再考虑如下的两种情况; 1. 一个cache服务器m down掉了(在实际应用中必须要考虑这种情况),这样所有映射到cache m的对象都会失效,怎么办,需要把cache m从cache中移除,这时候cache是...
阅读全文
摘要:参考题:http://www.cnblogs.com/v-July-v/archive/2011/10/17/3125425.html *私网IP地址:10.0.0.0- 10.255.255.255;172.16.0.0- 172.31.255.255;192.168.0.0-192.168.255.255。 *Hash处理冲突: 1.开放寻址法;Hi=(H(key) + di) MOD m,i=1,2,…,k(k127 -128->-1 *所谓守护线程,是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺...
阅读全文
摘要:作者:July、yansha。出处:http://blog.csdn.net/v_JULY_v。 1.Trie树 1)简述 又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。 3个基本性质:根节点不包含字符,除根节点外每一个节点都只包含一个字符。从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。每个节点的所有子节点包含的字符都不相同。 假设有b,abc...
阅读全文
摘要:转自:http://www.cnblogs.com/v-July-v/archive/2012/03/22/2413055.html作者:July出处:结构之法算法之道blog何谓海量数据处理? 所谓海量数据处理,其实很简单,海量,海量,何谓海量,就是数据量太大,所以导致要么是无法在较短时间内迅速解决,要么是数据太大,导致无法一次性装入内存。 那解决办法呢?针对时间,我们可以采用巧妙的算法搭配合适的数据结构,如Bloom filter/Hash/bit-map/堆/数据库或倒排索引/trie/(时间),针对空间,无非就一个办法:大而化小:分而治之/hash映射(空间),你不是说规模太大嘛,那.
阅读全文
摘要:插入排序冒泡排序选择排序快速排序堆排序归并排序希尔排序 假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的;否则称为不稳定的。 快速排序 两种方法,1.指针两边往中间走。2.指针都在开头 往后走。 1 public static void quickSort(int[] arr, int start, int end) { 2 if (start>=end) 3 return; 4 ...
阅读全文
摘要:1.鸡蛋篮子 有N个鸡蛋和M个篮子,把鸡蛋放到M个篮子里,每个篮子都不能为空。另外,需要满足:任意一个小于N的正整数,都能由某几个篮子内蛋的数量相加的和得到。写出程序,使得输入一个(N,M),输出所有可能的分配情况。 思路: 1.规定篮子鸡蛋数量从小到大递增枚举。 basket[M]:M个篮子中的鸡蛋数量 current_sum:当前所有篮子鸡蛋的总和, basket_id:当前篮子的序号, current_num:将要放到当前篮子去的鸡蛋数量, 2.由题意:任意一个小于N的正整数,都能由某几个篮子内蛋的数量相加的和得到 对于这M个篮子中的鸡蛋数量,我们用数组basket[M...
阅读全文
摘要:一.贪心 贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解。 它采用自顶向下,以迭代的方法做出相继的贪心选择,每做一次贪心选择就将所求问题简化为一个规模更小的子问题,通过每一步贪心选择,可得到问题的一个最优解,虽然每一步上都要保证能获得局部最优解,但由此产生的全局解有时不一定是最优的,所以贪婪法不要回溯。 贪婪算法是一种改进了的分级处理方法。其核心是根据题意选取一种量度标准...
阅读全文
摘要:1.复杂度与规模 时间复杂度并不是表示一个程序解决问题需要花多少时间,而是当问题规模扩大后,程序需要的时间长度增长得有多快。看当这个数据的规模变大到数百倍后,程序运行时间是否还是一样,或者也跟着慢了数百倍,或者变慢了数万倍。 多项式级的复杂度:如O(1),O(log(n)),O(n^a)等——注意它的规模n出现在底数的位置! 非多项式级的复杂度:如:O(a^n)和O(n!)等。 一个问题的规模指的是输入的总位数,比如一个n个数的排序问题,输入规模就是n。注意,在某些时候,输入规模是要值得注意的,比如判定一个数n是否是一个质数这个问题,它的输入规模并不是n,而是log(n),因为一个...
阅读全文
摘要:一、子集生成 给定一个集合,枚举它所有可能的子集,eg:{0,1,2} 解: {0} {1} {2} {0,1} {1,2} {0,2} {0,1,2} 子集是无序的1.增量构造法public static void subsetIncre(int n,int[] A,int cur){ for (int i = 0; i >=1; } System.out.println(); }4.集合的所有子集是2的n次方证明 一个集合中的元素个数一共有n个,这个集合称为n元集。 n 元集的子集,按子集中元素个数来分类,可以是0个元素,1个元素,2个元素……n个元...
阅读全文
摘要:在大规模数据存储中,实现索引查询这样一个实际背景下,树节点存储的元素数量是有限的(如果元素数量非常多的话,查找就退化成节点内部的线性查找了),这样导致二叉查找树结构由于树的深度过大而造成磁盘I/O读写过于频繁,进而导致查询效率低下,那么如何减少树的深度(当然是不能减少查询的数据量),一个基本的想法就是:采用多叉树结构(由于树节点元素数量是有限的,自然该节点的子树数量也就是有限的)。 为了更有效的减少树的深度,新的查找树结构——多路查找树。根据平衡二叉树的启发,自然就想到平衡多路查找树结构。即B树结构。 磁盘读取数据是以盘块(block)为基本单位的。位于同一盘块中的所有数据都能被一次性...
阅读全文
摘要:1.Dijskra最短路径算法 1)所需数据结构 节点结构:邻居列表adjacency list、是否已访问过known、起点到此节点的长度distance、路径上一个节点。 优先队列:保存节点长度,以此选出最小的节点长度的节点来进行访问。 2)松弛技术RELAX的介绍 Dijkstra 算法使用了松弛技术,对每个顶点v d[u] + w(u, v) 2 then d[v] ← d[u] + w(u, v) 3 π[v] ← u//O(E)2.A*算法 1)需要数据结构 创建两个表,OPEN表保存所有已生成而未考察的节点,CLOSED表中记录已访问过的节点。 节点的 g(n...
阅读全文