
算法
my_et
这个作者很懒,什么都没留下…
展开
-
不用加减乘除做加法
#include #define Times 7int sum(int a,int b){ int sum1,carry,num1,num2; sum1=a^b; carry=(a&b)<<1; num1=sum1; num2=carry; while(carry!= 0) { sum1=num1^num2; carry=(num1&num2)<<1; num原创 2013-05-03 21:01:24 · 586 阅读 · 0 评论 -
概率问题总结
最近学习了一下算法导论中的概率分析和随机算法现总结如下1.雇员问题一个公司面试N个面试者,一但发现当前这位员工比之前的面试者都要好,那么就会雇用他抽象为一个排列问题,如2,1,3,5,4, 那么2,3,5会被雇佣因为1比2要小,4比5小。进一步可以变为一个判断排列中逆序对的问题,初始序列为1,2,3,4,5那么根据规则,所有人会被雇佣。而序列中每增加一个逆序对,被雇佣的人数就会原创 2013-07-14 20:33:15 · 927 阅读 · 0 评论 -
算法导论 堆排序习题
1.怎样利用最大(小)堆构成的优先实现先进先出队列或者栈开始看这道题没有弄清以什么优先,原来是先进先出队列只要保证先进来优先级高,栈保证后进来优先级高,然后每次弹出堆顶元素即可2.如何在logN时间里删除一个元素思路和如何在堆中增加一个元素是一样的,因为堆要的形状要保证是一颗完全二叉树,决定了增减操作只能在堆的尾部进行。 1.先把该元素和堆尾元素交换,并将堆大原创 2013-07-16 16:36:23 · 1127 阅读 · 0 评论 -
快速排序习题
1.修改快速排序中的PATION算法,使得返回q,t,其中pPATION A,p,rq=p-1;t=q;原创 2013-07-20 16:36:55 · 951 阅读 · 0 评论 -
线性时间排序习题
1.设计一个算法,对N个介于0~k之间的数进行预处理,然后能够在O(1)的时间给出有多少个元素介于[a,b]之间首先肯定要考虑a,b和K的相对大小,这里就假设01.参照级数排序累计统计2.对累计统计的结果中计算c[b]-c[a-1]原创 2013-07-22 11:21:42 · 902 阅读 · 0 评论 -
编程之美--买书问题
有个人去买书,买不同的本数有不同的折扣,一共有5种书,买的书种类不同,本数越多折扣越高,折扣表如下:本数12345折扣00.050.10.20.25 买两本不同的书将得到2*0.05的折扣,3本得到3*0.原创 2013-08-27 11:12:08 · 625 阅读 · 0 评论 -
中位数和顺序统计
前言SELECT算法,在n个数中寻找第i大的元素1.将n个数5个一组,分成几组,然后在每个组中利用插入排序求取其中位数2.将上一步得到的元素中以同样的SELECT方法取得其中位数3.利用第二步中得到的中位数对数组进行PATION,之后如果i=k,返回,i1.在算法原创 2013-09-08 15:27:05 · 592 阅读 · 0 评论 -
最大K个数
最近学习了排序算法的应用--最大K个数。从比较多的数据中找出最大的K个数。该问题主要有以下几种解法:1.直接进行排序,堆排序和快速排序都是比较好的选择,在时间为N*lgN的时间开销下完成排序然后再选择前K个数即为最大的K。在这里可以讨论一下K的大小,如果K2.如果只要求找出最大的K个数,而对K个数顺序没有要求,那么可以对这一堆数据进行改良的快速排序:首先选择数据中部的元素m原创 2013-04-26 10:05:19 · 824 阅读 · 0 评论 -
最大流
这个月看了一下最大流的相关知识,记录一下对一个流网络,每条边上有一定的容量和实际的流量,怎样用一种方法求得这个网络的最大流量。Ford-Fulkerson方法,为什么叫做方法,不多说了。以BFS为例:path 记录顶点的流来自于那个顶点flow记录流向该顶点的最小流量源点S入队列DO 顶点V出队列 对于所有的V指向的顶点P IF P原创 2013-09-30 21:57:02 · 692 阅读 · 0 评论 -
Lucene 的索引排序
Lucene 的索引排序是使用了倒排序原理。 该结构及相应的生成算法如下: 设有两篇文章1和2 文章1的内容为:Tom lives in Guangzhou,I live in Guangzhou too. 文章2的内容为:He once lived in Shanghai. 1. 由于lucene是基于关键词索引和查询的,首先我们要取得这两篇文章的关键词,通常我们需要如下处理措施转载 2013-05-03 11:22:00 · 1218 阅读 · 0 评论 -
从一个链表中等可能取出若干节点
题目是这样的:给定一个单向链表,遍历一遍,从中选出M点,要求每个节点被选中的概率相同。这主要是一个概率论的问题,既然是单向链表,分两种来讨论1.如果我们事先就知道链表的长度那么这个问题就变为一个经典的抽签问题--在不知道前面人抽到的结果情况下,每个人抽中奖的概率是一样的证明如下:(1).假设一个票箱里面有N张票,其中M张是奖票,那么第一个人抽中的概率是M/N,抽不中的概率是(N原创 2013-05-28 21:26:22 · 884 阅读 · 0 评论 -
字符串匹配--KMP算法
最近学了一下KMP匹配算法,这个算法在字符串匹配中还是很有名的一般的字符串匹配算法是这样的1.比较目标串和待匹配的字符串,一个字符一个字符的比较,如果比较到待匹配串的末尾,则返回匹配成功的位置;2.发现有不同的停止比较,将目标串向后移动一格,待匹配字符串重新回到起点,回到步骤1,继续匹配。这个算法的优点是思路简单,有点像排序中的冒泡排序,选择排序的样子。缺点就是有大量的重复计算。原创 2013-06-26 21:02:19 · 495 阅读 · 0 评论 -
MySQL索引背后的数据结构及算法原理
本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。为了避免混乱,本文将只关注于BTree索引,因为这是平常使用MySQL时主要打交道的索引,至于哈希索引和全文索引本文暂不讨论。文章主要内容分为三个部分。第转载 2013-05-18 20:49:47 · 577 阅读 · 0 评论 -
螺旋矩阵实现
#include #include using namespace std;void main(){ int m,n,i,j; cin>>m>>n; cout<<m<<n<<endl; int **data=new int*[m]; for(i=0;i<m;i++) data[i]=new int[n]; int k=1,temp; int count=m>n?n:m;原创 2013-05-05 19:34:53 · 492 阅读 · 0 评论 -
判断可能出栈顺序--动态规划解法
先给定一个进栈序列(如1,2,3,4,5),可以随意弹栈(如在3进栈之前,2就可能已经进栈然后出栈了)然后给定一个序列如5,4,3,2,1和3,4,5,1,2,判断是不是其弹栈序列。我是用动态规划强行弄出来的,弄出来后查质料得知这是一个卡特兰数问题。。。。思路:例子4,3,5,1,2一旦一个数弹栈了比如上面序列中的4,在它进栈之前又在它后面出栈的元素,如1,2,3在它之前进原创 2013-05-20 14:36:59 · 1146 阅读 · 0 评论 -
求数组中最大连续子数组
学习思路:数组中连续最大和当前A[0]的关系有三种情况1.就是A[0]本身;2.是以A[0]开始的一个数字串;3.和A[0]无关。从这个问题中我们可以看到要当往数组里面新增一个元素时我们只需要两个信息确定新数组的最大连续和:1.之前这个数组最大连续和old;2,以前一个元素开始的最大连续和startold。假设新增元素为A[i],则有maxsumNew=ma原创 2013-05-07 08:58:43 · 692 阅读 · 0 评论 -
原地合并两个有序数组
昨天看到一篇关于合并两个数组的题目:在一个大数组a[N],a[0]~a[mid-1]和a[mid]~a[N-1]分别有序,怎样在O(1)的空间复杂度下完成将两个子数组合并到a[N]中。一开始想到了直接插入排序,前面是有序的嘛,直接从第mid个开始往前面插,这样一来空间复杂度满足要求,但是时间复杂度为O(N^2)。又回到了那个问题还有更好的方法吗? 在网上看了一下资料,发现这是一个原地归并原创 2013-04-28 16:36:00 · 2826 阅读 · 1 评论 -
电梯调度算法
一栋楼房有一电梯,居民进入楼梯后按一楼层,假设电梯只能停在某一层,问怎么样停靠使得居民爬楼梯的总和最小?或者可以抽象为给定一个数组,数组中数字大小代表元素个数,在数组中选定一个位置,使得数组所有元素到该位置的距离最小关键思路:设第i层当前人数为C1,到该楼层下的人有M个,需要爬楼总和M1,到该楼层以上的人有N个,需要爬楼总和N1那么当到i+1层后,设该层人数为C2到该楼层下原创 2013-05-08 21:51:12 · 1056 阅读 · 0 评论 -
求数组中巅峰元素位置
一个数组,一部分升序,后一部分降序,求巅峰元素位置关键思路:巅峰元素位置比左右两边元素都小,利用有序特性,进行二分查找1.取数组中间位置元素,如果它比它两边的元素都大,那么它就是我们要找的2.如果它比左边大,比右边小,说明这个元素还在升序数组里,在mid~high元素中继续按照本方法寻找3.在low~mid中寻找实现如下#include using namesp原创 2013-05-11 19:56:32 · 669 阅读 · 0 评论 -
输出三个色子可能的组合
三个色子,输出所有组合,(1,2,3)和(3,2,1)以及(2,1,3)算一种情况仔细观察,在算一种情况的几种组合中除了第一个以外其他都有逆序数我们对他们进行排序结果都是1,2,3,只要生成过程中没有逆序数,那么生成的组合就是唯一的也就是说确定一个数后,第二个生成的数只要不比前一个小,那么新生成的组合就是以前没有出现过的实现如下:#include using namespa原创 2013-05-12 15:51:25 · 2514 阅读 · 0 评论 -
数据挖掘常用算法
国际权威的学术组织the IEEE International Conference on Data Mining (ICDM) 2006年12月评选出了数据挖掘领域的十大经典算法:C4.5, k-Means, SVM, Apriori, EM, PageRank, AdaBoost, kNN, Naive Bayes, and CART.不仅仅是选中的十大算法,其实参加评选的18种算法,转载 2013-06-05 15:15:58 · 708 阅读 · 0 评论 -
跳跃表--加速链表访问
之前一次去实习笔试的时候,有一题笔试题是这样的,设计一个队列,使得它在高强度的插入和删除下任然具有较好的访问速度。当时想,数组虽然好,访问的时候是O(1)但是一旦涉及到删除和添加元素的时候,性能就下来了。 由此想到STL中的vector,往里面添加元素是是添加在末尾,一旦超过了其内存大小,在分配一块更大的内存(原来的两倍)然后将旧元素拷贝到新的内存空间去,这样虽然在拷贝的时候时间原创 2013-06-30 22:08:56 · 1447 阅读 · 0 评论