algorithm
文章平均质量分 84
继续微笑lsj
眼界决定未来
展开
-
素数和分解
歌德巴赫猜想说任何一个不小于6的偶数都可以分解为两个奇素数之和。对此问题扩展,如果一个整数能够表示成两个或多个素数之和,则得到一个素数和分解式。对于一个给定的整数,输出所有这种素数和分解式。注意,对于同构的分解只输出一次(比如5只有一个分解2 + 3,而3 + 2是2 + 3的同构分解式)。例如,对于整数8,可以作为如下三种分解:(1) 8 = 2 + 2 +原创 2013-09-20 17:13:28 · 2804 阅读 · 1 评论 -
在数组找到和为给定值的多个数
(1)如果是两个数,则可以先排序再用“夹逼”#include#include#includeusing namespace std;typedef pairIndex;Index findSum(int arr[],int len,int sum){ sort(arr,arr+len); int start = 0; int end = len -1原创 2013-04-03 09:52:23 · 4017 阅读 · 0 评论 -
数据结构笔记之查找算法
查找的同时对表做修改运算(如插入和删除),则相应的表称为动态查找表,否则称为静态查找表。 和排序一样,查找分为内查找(查找的表在内存中)和外查找(查找的表在外存中,需要访问外存)。 查找运算的主要运算是关键字的比较,所以通常评价查找的方式是平均查找长度:线性表查找 线性表组织方式是最简单的。 (1)顺序查找:这是最简单的一种,不要求你表中数据原创 2013-09-21 21:13:25 · 1669 阅读 · 0 评论 -
伸展树
伸展树(Splay Tree)是一种二叉排序树,它能在O(log n)内完成插入、查找和删除操作。它由Daniel Sleator和Robert Tarjan创造。它的优势在于不需要记录用于平衡树的冗余信息。在伸展树上的一般操作都基于伸展操作。 为什么需要伸展树(Splay Tree) 各种查找树存在不足。比如:对于一个有n个节点的平衡树,虽然最坏情况下每次查找的时间复杂度不会超过O(转载 2013-09-30 12:56:50 · 1071 阅读 · 0 评论 -
锦标赛排序(胜者树,记录胜者)
百度一道面试题说起,题目是这样的: 给出一个长度是N的数组,现在要找出最小的两个元素,最少要多少次比较。 分析: 如果找出1个最小的,比较次数无疑是 n - 1, ;如果用选择排序,再取选择第二个最小的又得比较n-2次。这种寻找的办法,其实是可以优化的,在第一次寻找最小元素过程中,其实我们已经比较了很多元素了,那么为什么不利用前面比较的结果来寻找第二个最小的呢。 这用到锦标原创 2013-09-15 04:13:50 · 9755 阅读 · 2 评论 -
散列表查找
哈希表(hash)又称散列表,是除顺序表存储结构、链表存储结构和索引表存储结构之外的又一种存储线性表的存储结构。设要存储的对象为n个,在内存中长度为m的连续存储单元,对象的关键字key为索引,通过hash函数hash(key)映射到相应的存储空间存储。 hash的两个主要问题:(1)设计好的hash函数;(2)设计好的冲突解决办法。散列函数的构造方法 那么怎么样才是好的h原创 2013-09-21 19:49:53 · 1557 阅读 · 0 评论 -
二项堆
原文:http://blog.csdn.net/acceptedxukai/article/details/6951922二项堆是可合并堆的数据结构,应该功能应该类似左偏树。二项树二项树Bk是一种递归定义的有序树,如下图所示。a)二项树Bk的递归定义,三角形表示有根的子树,b)二项树B0至B4,B4中显示出了各节点的深度,c)以另一种方式来看二项转载 2013-10-08 13:30:55 · 1166 阅读 · 0 评论 -
编程之美区间重合判断
一,问题: 1. 给定一个源区间[x,y]和N个无序的目标区间[x1,y1] [x2,y2] ... [xn,yn],判断源区间[x,y]是不是在目标区间内。 2. 给定一个窗口区域和系统界面上的N个窗口,判断这个窗口区域是否被已有的窗口覆盖。编程之美的解法:首先利用快排没,将区间按照从小到大排序,[2,3][1,2][3,9]-》[1,2][2,3][3,9原创 2013-09-19 14:13:57 · 2236 阅读 · 0 评论 -
串或序列的rotate操作
这里的rotate操作,也就是指循环移位。比如将串“ABCDEFG”以D为中心旋转,就相当将该串向左循环移位,直到第一个元素为D为止,最后得到新串“DEFGABC”。要想方便的完成rotate操作,一个常见的技巧是这样的:先将前半部分反转,再将后半部分反转,最后再将整个串反转即可(这里的前半部分与后半部分是以旋转中心来划分的)。还是以串“ABCDEFG”以D为中心旋转为例,以D为分割点,将先半部分转载 2013-09-19 09:43:14 · 969 阅读 · 0 评论 -
高精度加法
高精度整数加法 问题描述: 在计算机中,由于处理器位宽限制,只能处理有限精度的十进制整数加减法,比如在32位宽处理器计算机中, 参与运算的操作数和结果必须在-231~231-1之间。如果需要进行更大范围的十进制整数加法,需要使用特殊 的方式实现,比如使用字符串保存操作数和结果,采取逐位运算的方式。如下:9876543210 + 1234567890 = ?让字符串 num转载 2013-08-07 09:34:43 · 1412 阅读 · 0 评论 -
一道笔试题:捞鱼问题
题目:20个桶,每个桶中有10条鱼,用网从每个桶中抓鱼,每次可以抓住的条数随机,每个桶只能抓一次,问一共抓到180条的排列有多少种 (也可求概率)。来自与:http://www.ahathinking.com/archives/112.html,跟着这位前辈学的。分析一下 这道题其实可以这样理解,假设我已经抓到了180条鱼,而这180条鱼来自20个桶中,反过来就是我们将原创 2013-09-14 16:26:41 · 2528 阅读 · 1 评论 -
等概率随机函数的实现
题目:已知有个rand7()的函数,返回1到7随机自然数,让利用这个rand7()构造rand10() 随机1~10。分析:要保证rand10()在整数1-10的均匀分布,可以构造一个1-10*n的均匀分布的随机整数区间(n为任何正整数)。假设x是这个1-10*n区间上的一个随机整数,那么x%10+1就是均匀分布在1-10区间上的整数。由于(rand7()-1)*7+rand7()可以构造转载 2013-09-08 00:07:16 · 976 阅读 · 0 评论 -
高精度算法集锦
任意长度的高精度大整数和浮点数的加法和乘法一. 任意长度的高精度大整数加法方法:这里用了数据结构栈,实际上栈更方便实现高精度加法。步骤:1、第一个数据加数按输入顺序(高位到低位)入栈1。此时栈顶为最低位 2、第二个数据加数按输入顺序(高位到低位)入栈2。此时栈顶为最低位 3、将栈1、栈2均pop出栈顶做加法,并考转载 2013-09-20 19:11:54 · 1207 阅读 · 0 评论 -
原地归并排序
普通的归并排序,如果不了解可以参考本博客:http://blog.csdn.net/lsjseu/article/details/9771203了解的话请看下文。 对于归并排序的归并操作,我们通过创建额外的数组来进行归并,那么可不可以不需要创建额外数组进行归并呢?答案是肯定的。 初始条件:我们知道归并的时候,设立了需要两个指针i = low,j = mid + 1。这里原创 2013-09-16 14:30:03 · 1502 阅读 · 0 评论 -
最长重复字串
首先这是一个单字符串问题。子字符串R 在字符串L 中至少出现两次,则称R 是L 的重复子串。重复子串又分为可重叠重复子串和不可重叠重复子串,这里只是简单讨论最长可重叠的重复子串,给出基本算法和基于后缀数组的算法;关于后缀数组,这里也只是用最简单的形式实现,对于后缀数组的倍增算法和DC3算法的实现以及不可重叠重复子串的问题可参见算法合集之《后缀数组——处理字符串的有力工具》,以后再整理这几个问题。转载 2013-09-13 15:22:08 · 1488 阅读 · 0 评论 -
面试题:从给定的N个正数中选取若干个数之和最接近M
这道题跟捞鱼问题一样,都是刚进实验室新生培训那会儿做过的题目,不过这个是一师姐当时找工作的面试题。如题,并输出该子序列测试用例:2,9,5,7,4,11,10分别输出最接近33、40、47、60的子序列分析:N个数之和接近M,将M看做一个容量的背包,这个题目就变成了典型的01背包,M容量下求最优解并输出最优方案,这在01背包中都整理过,上代码:#incl转载 2013-09-13 20:45:54 · 6706 阅读 · 4 评论 -
最长公共子序列(Longest-Common-Subsequence,LCS)
一个字符串S,去掉零个或者多个元素所剩下的子串称为S的子序列。最长公共子序列就是寻找两个给定序列的子序列,该子序列在两个序列中以相同的顺序出现,但是不必要是连续的。例如序列X=ABCBDAB,Y=BDCABA。序列BCA是X和Y的一个公共子序列,但是不是X和Y的最长公共子序列,子序列BCBA是X和Y的一个LCS,序列BDAB也是。寻找LCS的一种方法是枚举X所有的子序列,然后注意检转载 2013-09-21 00:14:36 · 1751 阅读 · 0 评论 -
最长不重复子串
题:从一个字符串中找到一个连续子串,该子串中任何两个字符不能相同,求子串的最大长度并输出一条最长不重复子串。本节从最直接的方法逐步优化,渐进探索了四种实现方式,并最终找到时间复杂度为O(N),辅助空间为常数的方案,内容如下:==基本算法 使用Hash====DP方案====DP + Hash 方案====DP + Hash 优化方案=========转载 2013-09-13 16:33:36 · 1346 阅读 · 0 评论 -
LCS(子串必须连续)
这个LCS跟前面说的最长公共子序列的LCS不一样,不过也算是LCS的一个变体,在LCS中,子序列是不必要求连续的,而子串则是“连续”的。即:题:给定两个字符串X,Y,求二者最长的公共子串,例如X=[aaaba],Y=[abaa]。二者的最长公共子串为[aba],长度为3。本节给出三种不同的实现方式,并对比分析每种方法的复杂度,内容如下:==基本算法====DP方案=转载 2013-09-13 14:30:16 · 1236 阅读 · 0 评论 -
栈和队列的一些算法
看本文之前,推荐本博客的http://blog.csdn.net/lsjseu/article/details/9351141,熟悉一下STL中序列容器的借口以及内部实现结构。 本文搜集了一下关于栈和队列的一些算法。(1)用两个栈构成一个队列。 算法很简单,一个栈负责“插入”,一个栈负责“弹出”。当弹出的栈没有元素的时候,要从插入的栈把元素全部搬过来。c原创 2013-10-01 17:18:23 · 2553 阅读 · 0 评论 -
k路归并(败者树,记录败者)
败者树在外排序中用到,每加入一个数字时,调整树需要o(lgk),比较快。外排序过程主要分为两个阶段:(1)初始化各归并段写入硬盘,初识化的方法,可利用内排序方法还可以一种叫置换选择排序的方法(参考数据结构--李春葆)。为什么需要败者树 外排序过程考虑时间代价时,主要考虑访问磁盘的次数。那么基于两路归并排序的确定在哪里呢?主要是访问磁盘的次数太多了?请看下图:原创 2013-09-15 08:33:05 · 9038 阅读 · 0 评论 -
找出字符串中连续出现次数最多的子串
微软的一道面试题:如:abcbcbcabc,这个连续出现次数最多的字串是bc一,考虑边界问题。二,实现优化笛卡尔积组合,总体我是这样想的:就是纵向切出字符串的连续组合集合,在横向一对一跳跃比较集合元素。例如:abcbcabc 一,纵向切:得到所有字符串组合,注意:这里要求的是最多连续子字符串,其实就是优化笛卡尔积的原则,也是边界。 字符串共8位,以子串的长转载 2013-09-21 10:15:50 · 2046 阅读 · 0 评论 -
求解1-n之间的素数
转自:http://blog.csdn.net/left_la/article/details/88070401、简陋的算法:[cpp] view plaincopyvoid prime(int n) { for (int i = 2; i { int j;转载 2013-09-16 12:12:56 · 2471 阅读 · 0 评论 -
抽屉原理
贴一道抽屉原理的程序题目:http://blog.csdn.net/pi9nc/article/details/9278195 桌上有十个苹果,要把这十个苹果放到九个抽屉里,无论怎样放,我们会发现至少会有一个抽屉里面放两个苹果。这一现象就是我们所说的“抽屉原理”。 抽屉原理的一般含义为:“如果每个抽屉代表一个集合,每一个苹果就可以代表一个元素,假如有n+1或多转载 2013-09-26 01:02:48 · 1660 阅读 · 0 评论 -
八皇后问题[算法]
题目:在8×8的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后不得处在同一行、同一列或者同一对角斜线上。下图中的每个黑色格子表示一个皇后,这就是一种符合条件的摆放方法。请求出总共有多少种摆法。转载 2013-06-30 22:14:13 · 1241 阅读 · 0 评论 -
排序数组中重复最多的数字长度
题目:在 1,2,2,3,3,3,4,5,5,6中1,2.2,3.3.3,4,5.5,6都是平台。试编写一个程序,接受一个数组,把这个数组中最长的平台找出来。在上面的例子中就是3.3.3就是该数组中最长的平台。 分析:排序给我们带来的好处是在o(n)的时间复杂度就能解决这个问题。下面看代码:#include #include using namespace std;int Fi原创 2013-10-09 12:39:14 · 1347 阅读 · 0 评论 -
常见Hash算法
散列表,它是基于快速存取的角度设计的,也是一种典型的“空间换时间”的做法。顾名思义,该数据结构可以理解为一个线性表,但是其中的元素不是紧密排列的,而是可能存在空隙。散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列转载 2013-09-27 20:48:36 · 1348 阅读 · 0 评论 -
线性时间排序
夜深人静的时候,最好写代码,趁着大家熟睡之际,复习一下这几种排序方法。原理再算法导论上都有。计数排序 计数排序算法的基本思想是对于给定的输入序列中的每一个元素x,确定该序列中值小于x的元素的个数。一旦有了这个信息,就可以将x直接存放到最终的输出序列的正确位置上。 当然,如果有多个元素具有相同的值时,我们不能将这些元素放在输出序列的同一个位置上,因此,上述方案还要作适当的修改。原创 2013-10-09 01:01:58 · 1489 阅读 · 0 评论 -
MD5算法
MD5(单向散列算法)的全称是Message-Digest Algorithm 5(信息-摘要算法),经MD2、MD3和MD4发展而来。MD5算法的使用不需要支付任何版权费用。 MD5功能: 输入任意长度的信息,经过处理,输出为128位的信息(数字指纹); 不同的输入得到的不同的结果(唯一性); 根据128位的输出结果不可能反推出输入的信息(不可逆);转载 2013-11-06 00:38:40 · 1367 阅读 · 0 评论 -
simhash算法
第一次听说google的simhash算法[1]时,我感到很神奇。传统的hash算法只负责将原始内容尽量均匀随机地映射为一个签名值,原理上相当于伪随机数产生算法。传统hash算法产生的两个签名,如果相等,说明原始内容在一定概率下是相等的;如果不相等,除了说明原始内容不相等外,不再提供任何信息,因为即使原始内容只相差一个字节,所产生的签名也很可能差别极大。从这个意义上来说,要设计一个hash算法,对转载 2013-12-30 23:09:48 · 1356 阅读 · 0 评论 -
LRU Cache设计
如何设计一个LRU Cache?Google和百度的面试题都出现了设计一个Cache的题目,什么是Cache,如何设计简单的Cache,通过搜集资料,本文给出个总结。 通常的问题描述可以是这样:Question:[1] Design a layer in front of a system which cache the last n requests and th转载 2014-09-06 08:20:36 · 1003 阅读 · 0 评论 -
数组中任意n个数的全排列(DFS)以及任意n个数的组合
今天做了poj1270这道题,采用了深度优先搜索,确实启发了我,无意中想了一个这么一个问题:求数组中任意n个数的全排列是不是也可以用深度优先去搜索(我理解这是一种深度搜索,不知道对不对)。代码如下:#include#includeusing namespace std;#define MAX 20vectorindex;int visited[MAX]={0};void原创 2013-05-02 22:51:26 · 4915 阅读 · 0 评论 -
快速排序算法及其改进算法实现
快速排序算法不稳定。 快速排序算法在大多数的计算机上运行得都比其他排序算法快,而且排序算法消耗资源少。就平均时间而言快排是所有内部排序中最好的一个。对于已经排好的数组,最速排序有最坏时间复杂度为o(n^2)。当数组长度很小时,快排往往比其他排序方法要慢。 快排的代码,关键是parition算法。void QuickSort(int arr[],int low,i原创 2013-08-04 21:04:00 · 4826 阅读 · 1 评论 -
AC自动机
首先简要介绍一下AC自动机:Aho-Corasick automation,该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之一。一个常见的例子就是给出n个单词,再给出一段包含m个字符的文章,让你找出有多少个单词在文章里出现过。要搞懂AC自动机,先得有模式树(字典树)Trie和KMP模式匹配算法的基础知识。AC自动机算法分为3步:构造一棵Trie树,构造失败指针和模式匹配过程。转载 2013-06-15 15:29:07 · 889 阅读 · 0 评论 -
归并排序
归并排序求逆序对 将里面reverseCount删除就可以作为归并排序代码#include using namespace std;#define MAX_VALUE 0X7FFFFFFFint Merge(int arr[],int start,int mid,int high){ int i = start; int j = mid + 1; int原创 2013-08-05 20:29:04 · 1509 阅读 · 0 评论 -
从B 树、B+ 树、B* 树谈到R 树
第一节、B树、B+树、B*树1.前言:动态查找树主要有:二叉查找树(Binary Search Tree),平衡二叉查找树(Balanced Binary Search Tree),红黑树(Red-Black Tree ),B-tree/B+-tree/ B*-tree (B~Tree)。前三者是典型的二叉查找树结构,其查找的时间复杂度O(log2N)与树的深度相关,那么降低树的深度自转载 2013-09-24 06:25:26 · 1134 阅读 · 0 评论 -
字符串hash函数
本文搜集了一些字符串的常用hash函数。范例1:判断两个单词是否含有相同的字母,此时我们可以用hash做。例如,“aaabb”与"aabb"含有相同的单词。#include using namespace std; int hash(const char* a) //hash函数设计到位,节约了空间,当然我们也可以用bitset{ int tmp=0; w原创 2013-10-09 13:12:04 · 1505 阅读 · 0 评论 -
带通配符的字符串比较
字符串中含有“*”和“?”如何实现匹配。算法不用解释,看代码就明白了。#include #include #include using namespace std;//顺边贴一个任意类型转string的代码templatestring ToString(T flag){ stringstream ret; ret<<flag; return ret.str();}原创 2013-10-09 15:19:25 · 3254 阅读 · 0 评论 -
打印1到最大的n位数
解法1:按照何老师的思路,这道题用字符串解,需要模拟一个字符串加1的操作,打印的时候注意不能把前面的0打印出来。bool Increment(char *str){ bool isOverFlow = false; int nTakeOver = 0; int nLength = strlen(str); for(int i=nLength-1;i>=0;--i){//在一个循环里原创 2013-08-15 10:11:14 · 1329 阅读 · 0 评论 -
搜索关键词智能提示suggestion
搜索关键词智能提示suggestion题目详情:百度搜索框中,输入“北京”,搜索框下面会以北京为前缀,展示“北京爱情故事”、“北京公交”、“北京医院”等等搜索词,输入“结构之”,会提示“结构之法”,“结构之法 算法之道”等搜索词。请问,如何设计此系统,使得空间和时间复杂度尽量低。题目分析:本题来源于去年2012年百度的一套实习生笔试题中的系统转载 2013-09-23 17:56:49 · 2316 阅读 · 0 评论