
算法分析
文章平均质量分 72
怎么连话都说不清楚
这个作者很懒,什么都没留下…
展开
-
几个有意思的算法题
1.题目标题: 高斯日记 大数学家高斯有个好习惯:无论如何都要记日记。 他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210 后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢? 高斯出生于:1777年4月30日。转载 2013-11-27 21:45:29 · 965 阅读 · 0 评论 -
最长回文子串
题目描述给定一个字符串,找出该字符串的最长回文子串。回文字符串指的就是从左右两边看都一样的字符串,如aba,cddc都是回文字符串。字符串abbacdc存在的回文子串有abba和cdc,因此它的最长回文子串为abba。一个容易犯的错误初看这个问题可能想到这样的方法:对字符串S逆序得到新的字符串S',再求S和S'的最长公共子串,这样求出的就是最长回文子串。转载 2014-04-27 22:51:41 · 554 阅读 · 0 评论 -
算法分析-时间复杂度分析
关键概念 要分析算法的复杂度,通常需要分析循环的运行.一,假如,某个循环体的复杂度是O(1),那么这个循环的时间复杂度就是O(n). for(int i = 0; i //一些列复杂度为O(1)的步骤.... }通常,如果某个循环结构以线性方式运行n次,并且循环体的时间复杂度都是O(1),那么该循环的复杂度就是O(n).即使,该循环跳过某些常数部分,只转载 2014-04-25 17:05:19 · 713 阅读 · 0 评论 -
字符串翻转集合, case1, hello world->world hello; case2, hello world->olleh dlrow
Case1: 从hello world 翻转成 world hello/*大概的理念是先把所有字符串都翻转了,所以hello world 编程dlrow olleh. 然后再每个字符之间翻转,变成world hello(以空位为分界点)*/Case2: 从hello world翻转成olleh dlrow/*大概的理念是以空格为分界点,每个字符串之间翻转*/转载 2014-05-01 16:37:45 · 2117 阅读 · 0 评论 -
斐波那契数列
[1]递归法转载 2014-05-01 09:54:46 · 929 阅读 · 0 评论 -
最大最小值:给n个实数,求它们之中的最大值和最小值,要求比较次数尽量小。
最大最小值给n个实数,求它们之中的最大值和最小值,要求比较次数尽量小。用递归的方法可以做。假设需要T(n)的时间求n个数的最大值和最小值,显然T(2) = 1。我们按照分治三步法进行算法设计。划分把n个数均分为两半。递归求解求左半的最小值minL 和最大值maxL以及右半最小值minR和最大值maxR。合并所有数的最大值为maxfmaxL; maxRg,最小值为minfminL转载 2014-04-15 12:14:11 · 2327 阅读 · 0 评论 -
不简单的URL去重
所谓的Url去重(我一直没找到对应的英文,URL Filtering ?),就是爬虫将重复抓取的URL去除,避免多次抓取同一网页。爬虫一般会将待抓取的URL放在一个队列中,从抓取后的网页中提取到新的URL,在他们被放入队列之前,首先要确定这些新的URL没有被抓取过,如果之前已经抓取过了,就不再放入队列。最直观的做法 – hash表为了尽快把整个爬虫搭建起来,最开始的URL去重采转载 2014-03-29 09:28:10 · 3086 阅读 · 0 评论 -
整数反转的递归算法
题目:把整数反转,结果保存到一个整数数组,如:输入:12345输出:[5,4,3,2,1] #include "stdafx.h"#include using namespace std;#define INT_LENGTH 20///反转整数///n 输入的待反转的整数///result 保存结果的数组指针///int 型的返回值 表示递归的深度,也就是整转载 2014-04-28 20:03:17 · 3186 阅读 · 0 评论 -
链表反转的递归和非递归算法
struct node{int data;node *next;};递归算法:原创 2014-04-28 20:05:37 · 775 阅读 · 0 评论 -
二分法查找与排序
二分法排序代码:void QuickSort(int array[],int left,int right){ int last; if (left>=right) return; int rand = (left+right)/2; Swap(array, left, rand); last = left; for (int i = left + 1; i <= right原创 2012-11-25 11:23:05 · 550 阅读 · 0 评论 -
康托展开和康托展开的逆运算
八数码问题不用康托展开判断重复8s,用康托展开判断重复30MS。康托展开最大最明显的作用就是在判断状态是否重复方面了,其实属于hash的一个技巧。 一、康托展开【问题背景】对于一个有n个不同元素的集合{1,2,3,4,...,n}的从小到大排序(从大到小 同理)的全排列 显然它有n!项。如n=4,那么就有4!=4×3×2×1=24项。与自然数1,2,3,4,-----n!与之一一对转载 2012-11-09 16:12:27 · 1014 阅读 · 0 评论 -
排序算法
/* 冒泡排序 算法: 核心思想是扫描数据清单,寻找出现乱序的两个相邻的项目。当找到这两个项目后 交换项目的位置然后继续扫描。重复上面的操作直到所有的项目都按顺序排好 时间复杂度n*n (n-1)*n/2 */void BubblueSortDate(int SortDate[] , int Length){ int tempDate = 0; bool swapFlag =原创 2012-11-09 16:32:10 · 391 阅读 · 0 评论 -
递归算法的描述与实现
递归算法在C/C++程序设计巾硇描述与实现[摘要]递归是函数实现的一个很重要的环节,对许多复杂的问题,递归能提供简单、自然的解法。本文在对递归的概念进行介绍的基础上,重点讨论了递归的程序设计方法,并分析了递归函数的调用和回溯过程。[关键词]递归 函数调用 C/C++1.引言递归是计算机科学中一种强有力的问题求解方法,用递归算法编写的程序结构清晰,具有很好的可读性,正确性容易转载 2012-11-09 16:52:02 · 1824 阅读 · 0 评论 -
字符串比较
字符串相等的条件:1、不区分大小写2、不区分顺序比如“aBc”=“ABC”“abc”=“bac”要求:要有自己的算法思想。======一个方法:1、先把两个字符串都转化为大写或小写2、把字符串转化为char数组,然后使用冒泡或比较或其他排序算法实现排序3、使用equals来判断排序后的连个字符串是否相等这个方法可行,但是没有体现出做题人自己的原创 2012-11-10 09:02:49 · 748 阅读 · 0 评论 -
RMQ问题
RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j主要方法及复杂度(处理复杂度和查询复杂度)如下: 1.朴素(即搜索) O(n)-O(n) 2.线段树(segment tree) O(n)-O(qlogn) 3.ST(实质是动态规划) O(nlogn)-O(1) 线段树方法: 线转载 2012-11-09 16:00:24 · 532 阅读 · 0 评论 -
克鲁斯卡尔算法&普里姆算法
克鲁斯卡尔算法 假设 WN=(V,{E}) 是一个含有 n 个顶点的连通网,则按照克鲁斯卡尔算法构造最小生成树的过程为:先构造一个只含 n 个顶点,而边集为空的子图,若将该子图中各个顶点看成是各棵树上的根结点,则它是一个含有 n 棵树的一个森林。之后,从网的边集 E 中选取一条权值最小的边,若该条边的两个顶点分属不同的树,则将其加入子图,也就是说,将这两个顶点分别所在的两转载 2012-11-19 13:06:09 · 1119 阅读 · 0 评论 -
大数问题
1,思想类似于大数的加减乘法. 数组的每个元素维护一个4位数. 类似的大数问题都可以考虑这种思想2,实例代码:#includeusing namespace std;int a[10000];//保存结果int m=0;//保存位数void factorial(int n){ memset(a,0,sizeof(a)); a[0]=1; for原创 2012-11-09 15:56:32 · 465 阅读 · 0 评论 -
必备的几种排序算法
/* (一).快速排序 是对起泡排序的一种改进,通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键 字小,则可分别对这两部分继续进行排序,以达到整个序列有序. 交换顺序表L中子表L.r[low..high]的记录,使枢轴记录到位,并返回其所在位置,此时在它之前(后)的记录均不大(小)于它 时间复杂度为 n*logn,其平均性能最好,若初始记录序列按关原创 2012-11-16 19:48:20 · 599 阅读 · 0 评论 -
1~1000这1000个数存在计算机,随机删除其中一个,请找出删除的是哪一个
A:把删除数之前的所有数加起来减去删除数之后的所有数(加减乘除均可)A有局限性 如果不是1000个数而是1000亿个数 那就溢出了 B:把删除数之前的所有数按位与或得到的值和删除数之后的所有数按位与或 最终结果即是删除的数这个方法仅使用2个变量 而且不会溢出转载 2014-04-14 20:51:32 · 1721 阅读 · 0 评论 -
去掉数组重复元素 + 交换一串数组元素
1、已知整数数组a[n]中有重复的元素,试实现函数 void purge( int * a, int &n ); 该函数Post 条件为a[n] 中个元素相异。 常规思路:对表中任一个元素a[i],令 j 从 i+1 到 n-1,将a[i]和a[j]进行比较,若相等,则从顺序表中删除该元素,然后从 j+1 到 n-1 的元素均向前移动一个位置。 弊端: 在删除元素时引起的一连串的元素向转载 2014-04-14 20:50:30 · 746 阅读 · 0 评论 -
字符串全排列
字符串全排列的两个例子:1.abc的全排列有:abcacbbacbcacbacab2.aab的全排列有:aabababaa思路:使用回溯法。对于abc,a和a交换仍是abc;a和b交换可得bac;a和c交换可得cba,至此第一个字母的遍历结束。从上述结果中进行第二个字母的遍历:对于abc,b原创 2013-02-26 21:28:34 · 613 阅读 · 0 评论 -
A、B两个整数集合,设计一个算法求他们的交集,尽可能的高效。
思路1:排序法 对集合A和集合B进行排序(升序,用快排,平均复杂度O(N*logN)),设置两个指针p和q,同时指向集合A和集合B的最小值,不相等的话移动*p和*q中较小值的指针,相等的话同时移动指针p和q,并且记下相等的数字,为交集的元素之一,依次操作,直到其中一个集合没有元素可比较为止。 优点:操作简单,容易实现。 缺点:使用的排序算法不当,会耗费大量的时间,比如转载 2013-10-27 10:58:47 · 48586 阅读 · 0 评论 -
Dijkstra算法
Dijkstra算法是一种最短路径算法,用于计算一个节点到其它所有节点的最短路径,动态路由协议OSPF中就用到了Dijkstra算法来为路由计算最短路径。算法本身并不是按照我们的正常思维习惯,我们一般会,从原点遍历所有与之相连的节点,找到最短路径,再从最短路径上的那个点遍历与之相连的所有其它点(原点除外),然后依次类推。这样做虽然可以算出一个树形,但是在大多数情况下,这种算法会产生很多次优转载 2012-12-29 16:54:32 · 1444 阅读 · 0 评论 -
循环和递归在算法中的应用
一、递归和循环的关系 1、 递归的定义 顺序执行、循环和跳转是冯·诺依曼计算机体系中程序设计语言的三大基本控制结构,这三种控制结构构成了千姿百态的算法,程序,乃至整个软件世界。递归也算是一种程序控制结构,但是普遍被认为不是基本控制结构,因为递归结构在一般情况下都可以用精心设计的循环结构替换,因此可以说,递归就是一种特殊的循环结构。因为递归方法会直接或间接调用自身算法转载 2012-11-10 09:23:52 · 576 阅读 · 0 评论 -
一道有趣的GOOGLE面试题
//GOOGLE面试题//一个大小为n的数组,里面的数都属于范围[0, n-1],有不确定的重复元素,找到至少一个重复元素,要求O(1)空间和O(n)时间。//By MoreWindows (http://blog.youkuaiyun.com/MoreWindows)#include const int NO_REPEAT_FLAG = -1;int FindRepeatNumberInArray转载 2012-11-27 18:08:24 · 458 阅读 · 0 评论 -
数字转换字符串
将一个字符串转换为我们中国人读的方式!要求:1.该字符串只能含数字和小数点(要检测是否含有其他非法字符或为空);2.要考虑到很多的情况(比如): a.100 000 000.12(一亿点一二); b.10 000 001.45(一千万零一点四五); c.2 400 001.01(二百四十万零一点零一); d.4原创 2012-11-10 16:21:46 · 516 阅读 · 0 评论 -
排序算法总结
交换排序:1,冒泡排序:冒泡排序是最简单的排序,是刚学c语言时最早接触到的一个算法。他的思想就是,对待排序元素的关键字从后往前进行多遍扫描,遇到相邻两个关键字次序与排序规则不符时,就将这两个元素进行交换。这样关键字较小的那个元素就像一个泡泡一样,从最后面冒到最前面来。不多说了,直接写出代码:[cpp] view plaincopy转载 2014-03-29 10:50:03 · 799 阅读 · 0 评论 -
斐波那契数列的两种实现方式(递归(大于O(n方))和迭代(O(n))----网易笔试2013录
前段时间参加网易笔试,遇到这么一个题,实现斐波那契数列,要求时间复杂度尽可能小,但必须小于O(n方)之前看到过这样的实现方式,好像很简单,可是就是想不起来了,当然递归实现是大家都会的,可是他的时间复杂度超过了O(n方),所以用递归肯定是不符合要求的,我当时想到的是,递归的时候,每求一个元素值就要把他之前的所有元素的计算都计算一遍,这必然降低了效率,如果改进的话就是先把之前元素得到的计算值保存,转载 2013-11-24 16:57:12 · 947 阅读 · 0 评论 -
100阶乘末尾有多少个零?
题目:1*2*3*……*100 求结果末尾有多少个零分析:一般类似的题目都会蕴含某种规律或简便方法的阶乘末尾一个零表示一个进位,则相当于乘以10而10 是由2*5所得,在1~100当中,可以产生10的有:0 2 4 5 6 8 结尾的数字,显然2是足够的,因为4、6、8当中都含有因子2,所以都可看当是2,那么关键在于5的数量了那么该问题的实质是要求出1~100含有多少个5由特殊推广到一般的转载 2013-11-24 16:35:28 · 1072 阅读 · 0 评论 -
微软面试题:在排序数组中,找出给定数字的出现次数
解法:二分查找评论:二分查找和排序在很多数值类的算法中应用广泛,基本上可以说,对这两个算法不熟练,会悲剧。上题可以扩展为:在一些无序的数字中查找某个数字出现的个数。扩展后的解法可以先进行排序,后面的解法同。排序则当然要用快排了。这个解法应该说就是一个令人满意的答案了。找出给定数字的出现次数,比如 [1, 2, 2, 2, 3] 中2的出现次数是3次 #inclu转载 2013-11-24 16:52:37 · 2296 阅读 · 0 评论 -
所有不同的排列
原题如下:用1、2、2、3、4、5这六个数字,用java写一个程序,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连。 解题思路: 很明显,这是一个递归算法。我们可以排列将这6个数按从小到大的顺序排一下,如果是1,2,3,4,5,6,那么会有1*2*3*4*5*6= 6!=720个递增的数。但如果是1,2,2,3,4,5转载 2012-11-18 19:53:47 · 499 阅读 · 0 评论 -
括号配对
#include #include #define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define STACK_INIT_SIZE 100#define STACKINCREMENT 10#define BUFFERSIZE 1010typedef int Status; //函数返回状态原创 2012-11-10 09:14:25 · 446 阅读 · 0 评论 -
字符串间最短距离(动态规划)
Minimum Edit Distance 问题 解法一:对于不同的字符串,判断其相似度。 定义了一套操作方法来把两个不相同的字符串变得相同,具体的操作方法为: 1.修改一个字符(如把“a”替换为“b”) 2.增加一个字符(如把“abdd”变为“aebdd”) 3.删除一个字符(如把“travelling”变为转载 2013-04-09 17:46:51 · 5654 阅读 · 0 评论 -
动态规划经典五题
1.最大连续子序列之和给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= K。最大连续子序列是所有连续子序中元素和最大的一个, 例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{ 11, -4, 13 },最大和为20。状态转移方程:转载 2012-12-18 17:16:59 · 511 阅读 · 0 评论