C++
文章平均质量分 82
_Luffy
https://github.com/JianmingXia
展开
-
二分查找递归实现--【编程珠玑】
作者说 有百分之九十的程序员在程序中发现了bug(同时怀疑那些没有发现bug的正确性)所以尽管二分查找是我们感觉上比较简单的一个程序,但是我们依然不可小视;首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。原创 2014-01-01 23:35:09 · 1512 阅读 · 0 评论 -
“栈和队列”之队列--基本数据结构
第一期:在队列中,被删去的总是在集合中存在时间最长的那个元素:队列实现的是一种先进先出(first-in,first-out,FIFO)策略;队列上的INSERT操作称之为入队(ENQUEUE),DELETE操作称为出队(DEQUEUE);正如栈的pop操作一样,DEQUEUE操作也没有元素参数。队列的先进先出特性类似于收银台前排队结账的一排顾客。队列有队头(head)和队尾(tail),当有一个元素入队时,它被放在队尾的位置;下面是一个简单的队列操作,初始化队列,入队,出队处理;原创 2014-02-15 15:15:30 · 1110 阅读 · 0 评论 -
二叉排序树(Binary Sort Tree,二叉查找树,二叉搜索树)--【算法导论】
1、首先是了解了二叉搜索树;2、接下来看的是查询二叉搜索树,查询二叉搜索树的内容比较多;(1)查找:即是查询关键字,若存在,返回该节点的指针;否则,返回空;这个书中给了两段伪码,迭代、递归随意;(2)最大关键字及最小关键字元素:顾名思义,肯定是二叉搜索树的最大最小值,以最大关键字为例,一直查询树的右孩子,直到改节点无右孩子为止,该节点就是最大关键字,当然,最小关键字同理;(3)后继与前驱:对一个节点来说,最大的小于该节点值的即是前驱,最小的大于该节点值的即是后继。以后继为例,如果该节点的右子树不为空原创 2014-02-26 22:45:22 · 11684 阅读 · 2 评论 -
先序、中序、后序遍历(三种情况访问二叉树)
昨天才写了篇关于二叉排序树的博客,想起之前有所遗漏,如先序,中序以及后序遍历;先序遍历:也叫做先根遍历,前序遍历,可记做根左右(二叉树父结点向下先左后右)。首先访问根结点然后遍历左子树,最后遍历右子树。在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树,如果二叉树为空则返回。 即:若二叉树为空则结束返回,否则:(1)访问根结点(2)先序遍历左子树(3)先序遍历右子树中序遍历:首先遍历左子树,然后访问根结点,最后遍历右子树。在遍历左、右子树时,仍然先遍历左子树,再访问根结点,最后遍历右原创 2014-02-27 17:43:59 · 2672 阅读 · 0 评论 -
三角形的内切圆和外接圆--【英雄会】
这个题目有一段时间了,不过当时正在准备考试,纵使有心刷题,奈何佛脚得抱,后来又被撤了,所以拖至今天...如题:一个三角形必然存在它的内切圆与外接圆,求他们的面积比。考虑到精度问题,我们输出面积比*1000的整数部分(直接下取整)。 输入数据是一个三角形的三个顶点,但这三个顶点在三维空间中,所以输入是9个整数,分别表示三个顶点(x1,y1,z1) (x2,y2,z2) (x3,y3,z3),保证三点不共线,每个整数在-1000,+1000范围内。 输出内接圆与外切圆的面积比*1000的整数部分。原创 2014-02-18 22:26:10 · 2078 阅读 · 0 评论 -
vector中的删除,erase和remove的小疑惑--【STL】
对于vector容器的使用,平时只是简单的进行遍历查找一下,未曾进行其它操作,这不,今天出了一点差错;earse方法的操作是将此时的节点删除,然后指向被删除节点的下一个:如对数据1 6 6 4 7;原创 2014-05-01 14:29:00 · 4748 阅读 · 1 评论 -
插入排序--《编程珠玑》
如百度百科:有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外,而第二部分就只包含这一个元素。在第一部分排序后,再把这个最后元素插入到此刻已是有序的第一部分原创 2014-04-01 15:12:28 · 1141 阅读 · 0 评论 -
钢条切割--【算法导论】
对以上的价格表样例,进行模拟切割:r1 = 1,切割方案1 = 1(无切割)r2 = 5,切割方案2 = 2(无切割)r3 = 8, 切割方案3 = 3(无切割)r4 = 10, 切割方案4 = 2 + 2r5 = 13, 切割方案5 = 2 + 3r6 = 17, 切割方案6 = 6(无切割)r7 = 18, 切割方案7 = 1 + 6或7 = 2 + 2 + 3r8 = 22, 切割方案8 = 2 + 6r9 = 25, 切割方案9 = 3 + 6r10 = 30,切割方案10 =原创 2014-04-23 12:05:17 · 1249 阅读 · 0 评论 -
矩阵链乘法--【算法导论】
矩阵链乘:给定一个n个矩阵的序列(矩阵链)<A1, A2,...,An>,希望计算它们的乘积A1A2...An,当然乘积的顺序我们可以通过括号来改变,最后希望乘积最少;如对A1A2A3A4:方案1:(A1(A2(A3A4)))方案2:(A1((A2A3)A4))方案3:((A1A2)(A3A4))方案4:((A1(A2A3))A4)方案5:(((A1A2)A3)A4)原创 2014-04-24 16:18:16 · 1552 阅读 · 0 评论 -
最长公共子序列--【算法导论】
最长公共子序列:一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列;其核心很简单:if(str1[i - 1] == str2[j - 1]) m[i][j] = m[i - 1][j - 1] + 1;else m[i][j] = max(m[i - 1][j], m[i][j - 1]);前面动态规划思想说得足够了,这次直接贴:原创 2014-04-25 14:20:56 · 1133 阅读 · 0 评论 -
“举一反三”合并数组--《剑指offer》
与上篇思想一样,或者说是替换数字的另一种版本吧,题目如下:有两个已经排好的数组A1和A2,A1的末尾有足够的空间来容纳A2,我们将A2数组插入到A1中,继续保持已经排序;这样看来就和替换空格相似了,如果我们在A1数组从头到尾复制数字,这样导致A1数组后面的数一直不断往后移动,复杂度一样是O(n2),所以,我们来举一反三:原创 2014-05-18 15:26:46 · 917 阅读 · 0 评论 -
从尾到头打印链表--《剑指offer》
题目:很简单,就是题目,将链表从尾到头打印出来。可能我们首先想到的是将链表进行遍历,将之前的访问的数据进行保存,最后进行反向输出,可是保存数据的空间是个问题;或者是我们将整个链表进行反向操作,将整个链表进行逆置,可是我们只是进行打印操作而已,改变链表不合适吧...其实这时候应该想到了,用栈:既然是逆置,和栈的功能不就不谋而合吗,后进先出,进行反向打印。原创 2014-05-18 17:27:19 · 1379 阅读 · 0 评论 -
替换空格--《剑指offer》
如题所示,题目很简单,替换空格,将字符串中的空格替换为%20;即"we are happy”替换成“we%20are%20happy”;如果每当我们遇到一个空格就将字符串向后平移两位,这样复杂度就是O(n2)了,这样的方法是不可取的,按照作者的来说,offer已不足拿到了;而当我们反向从字符串末尾开始遍历,复杂度仅为O(n),当然前提的是该字符串有足够空间,否则替换会失败。了解到思想之后程序也就比较简单了,发现自己的与作者的写的也比较类似,就此贴上了...原创 2014-05-18 13:54:04 · 1033 阅读 · 0 评论 -
极值问题
题目:已知m、n为整数,且满足下列两个条件:① m、n∈1,2,...,K,(1≤K≤10^9)② (n^ 2-mn-m^2)^2=1编一程序,对给定K,求一组满足上述两个条件的m、n,并且使m^2+n^2的值最大。例如,若K=1995,则m=987,n=1597,则m、n满足条件,且可使m^2+n^2的值最大。原创 2014-05-21 12:40:09 · 2891 阅读 · 0 评论 -
“栈与队列”之栈--基本数据结构
亡羊补牢犹未晚啊,栈,按照书上小小的操作一下,后续会有补充...栈和队列都是动态集合,且在其上进行DELETE操作所移除的元素是预先设定的。在栈(stack)中,被删除的是最近插入的元素:即栈实现的是一种后进先出(last-in,first-out,LIFO)策略。下面是栈的简单操作,即初始化InitStack,空栈StackEmpty,入栈Push,出栈Pop;原创 2014-02-15 13:44:41 · 1337 阅读 · 2 评论 -
中国剩余定理--【信息安全】
这时上学期的信息安全学科的“公钥密码体制”中一章,关于数论基础的内容中说到的。有题如下:今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问物几何。即:有一批物品,三个三个地数余二个,五个五个地数余三个,七个七个地数余二个,问这批物品最少有多少个。这一题的解法也很简单:三人同行七十希,五树梅花廿一支,七子团圆正半月,除百零五使得知;即将该数除以3得到的余数乘以70,将除以5得到的余数乘以21,将除以7得到的余数乘以15,加起来后除以105,取余就是答案。即2 * 70 + 3 * 21 +原创 2014-02-23 21:03:38 · 1433 阅读 · 0 评论 -
罐子与硬币--【英雄会】
好久没来英雄会了,所以今天来看看几题,看到“罐子与硬币”这一题不错,这种题目比较适合我的味道,不过,可惜啊...性子太急,分没到手...题目如下:有n个罐子,有k个硬币,每个罐子可以容纳任意数量的硬币。罐子是不透明的,起初你可以随机把这k个硬币任意放在罐子里。然后罐子被打乱顺序,你从外表无法区别罐子。最后罐子被编上号1-n。你有p次机会,每次你可以选择某个罐子,如果该罐子里有硬币,则你可以得到1个(你不可以知道该罐子里有多少硬币),如果该罐子是空的,你得不到任何硬币。你最终要得到至少c枚硬币,我们的问原创 2014-01-28 19:53:26 · 2098 阅读 · 4 评论 -
二分查找非递归实现--【编程珠玑】
首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。原创 2014-01-04 13:08:10 · 1164 阅读 · 0 评论 -
二分查找另类--【编程珠玑第四章】
这是《编程珠玑》第四章的问题:如果最初的二分查找对你来说太简单了(大家肯定都是这么感觉的...)那么请你试一下其变型:在p中返回t在数组x中第一次出现时的位置(即如果一个数组多次出现的话,原先的算法所返回的是众多位置的中的任意一个)。你的代码应该对数组元素进行对数次比较,可能要进行log2N此这样的比较才能完成此二分查找。这题的关键是找到最先开始出现的位置,如对数组:{0, 5, 5, 5, 5, 14, 16, 16, 50, 65, 70};原创 2014-01-04 13:39:46 · 1808 阅读 · 5 评论 -
字符串消除--【英雄会】
给定一个字符串,仅由a,b,c 3种小写字母组成。当出现连续两个不同的字母时,你可以用另外一个字母替换它,如 有ab或ba连续出现,你把它们替换为字母c; 有ac或ca连续出现时,你可以把它们替换为字母b; 有bc或cb 连续出现时,你可以把它们替换为字母a。 你可以不断反复按照这个规则进行替换,你的目标是使得最终结果所得到的字符串尽可能短,求最终结果的最短长度。 输入:字符串。长度不超过200,仅由abc三种小写字母组成。输出: 按照上述规则不断消除替换,所得到的字符串最短的长度。 例如:原创 2014-01-03 17:07:11 · 843 阅读 · 0 评论 -
最大子数组问题(分治法)--【算法导论】
《算法导论》中引入这个问题是通过股票的购买与出售,经过问题转换,将前一天的当天的股票差价重新表示出来,即转为了一个最大子数组的问题,具体内容我不多说,转的内容是:13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7找到这连续的16个数里面的连续和最大的子数组;假定我们要寻找子数组A[low..high]的最大子数组,使用分治法意味着我们要将子数组划分为两个规模尽可能相等的子数组。也就是说,找到子数组的中央位置,比如mi原创 2014-01-07 11:44:05 · 5257 阅读 · 16 评论 -
最大子数组问题(动态规划)--【算法导论】
《算法导论》中引入这个问题是通过股票的购买与出售,将前一天的当天的股票差价重新表示出来,即转为了一个最大子数组的问题,具体内容我不多说,转的内容是:13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7找到这连续的16个数里面的连续和最大的子数组;书中练习部分说用设计非递归的,线性时间的算法,我就YY为动态规划处理了;从数组的左边界开始,从左至右处理,记录到目前为止已经处理过的最大子数组。若已知A[1..j]的最大子原创 2014-01-07 10:32:01 · 9172 阅读 · 0 评论 -
子序列的个数(解)--【英雄会】
本题同样来自caopengcs,只要你有兴趣,每个人都可以出题(出题入口在主页右侧边栏“贡献题目”->“我要发布”内),以下是题目详情:子序列的定义:对于一个序列a=a[1],a[2],......a[n],则非空序列a'=a[p1],a[p2]......a[pm]为a的一个子序列,其中1<=p1<p2<.....<pm<=n。 例如:4,14,2,3和14,1,2,3都为4,13,14,1,2,3的子序列。 对于给出序列a,有些子序列可能是相同的,这里只算做1个,要求输出a的不同子序列的数量。原创 2014-01-07 23:39:37 · 1077 阅读 · 0 评论 -
堆排序(最大堆[1])--【算法导论】
前一章的“概率分析与随机算法”实在伤脑子,好在看过去了,现在正在看的是排序部分;堆排序,这次说的是最大推排序(和最小堆原理也是相同的),和原文中的思路也是一样的,后序有补充也会贴出来的;最大堆...即是父节点的值大于孩子的值,若不满足条件,则经过调节使其满足条件:原创 2014-01-08 19:23:04 · 2793 阅读 · 0 评论 -
快速排序--【算法导论】
对于包含n个数的输入数组来说,快速排序是一种最坏情况时间复杂度为O(n²)的排序算法。虽然最坏情况时间的复杂度很差,但是快速排序通常是实际排序应用中最好的选择,因为它的平均性能非常好:它的期望时间复杂度是O(nlgn),而且O(nlgn)中隐含的常数因子非常小,另外,它还能够进行原址排序,甚至在虚存环境中也能很好的工作。快速排序使用了分治的思想:分解:将数组A[low..high]划分为两个子数组A[low..mid - 1]以及A[mid + 1..high],使得A[low..mid - 1]子原创 2014-01-09 15:49:23 · 1132 阅读 · 0 评论 -
堆排序(最大堆进阶)--【算法导论】
上篇【堆排序(最大堆)】说过,代码是按照书中的伪码写出,书中的根结点是1,但一般我们数组的下标由0开始,故而现在改为由0开始;上篇已说过实现的过程,故而不在赘述,可见上篇;将其中的一些条件改变即可:首先是建堆的值,由0开始的根结点,对于A[n],它的父节点是(n - 1) / 2,并且到0为止,都是父节点;故而建堆:原创 2014-01-08 20:01:54 · 1195 阅读 · 0 评论 -
最大优先队列--【算法导论】
堆排序是一个优秀的算法,但是在实际应用中,如快速排序的性能会优于它。但是堆排序有着另外的作用,如优先队列;与堆排序一样,优先队列也有两种形式:最大优先队列,最小优先队列(暂且讨论最大优先队列);优先队列:是一种用来维护由一组元素构成的集合S的数据结果,其中的每个元素都有一个相关的值,称为关键字。最大优先队列支持:原创 2014-01-09 14:07:40 · 2785 阅读 · 0 评论 -
堆排序(最小堆)--【算法导论】
堆排序的思想在堆排序(最大堆)已做说明,故不再赘述;总之,思想就是首先进行建堆,由于这是最小堆,故而必须保证父节点都小于孩子节点,若不满足条件,则进行调节;最后进行堆排序,不断将最小的提取出来,并对剩下的进行调节,使之满足最小堆;故而将最大堆中的判断父节点与孩子大小部分改变即可: if (left <= length && A[largest] > A[left]) //左孩子比父节点小 { largest = left; } if (righ原创 2014-01-08 21:39:06 · 8439 阅读 · 0 评论 -
计数排序(线性时间排序)--【算法导论】
之前的排序都是通过比较得到的,即比较排序:在排序的最终结果中,各元素的次序依赖与它们之间的比较。而时间复杂度最好的也是O(nlgn),接下来说一个未经比较的排序,而复杂度则是线性的。计数排序假设n个输入元素的每一个都是在0-k区间内的一个整数,其中k为某个整数。当k = O(n)时,排序的运行时间为O(n)。计数排序的基本思想是:对每一个输入元素x,确定小于x的元素个数。利用这一信息,就可以直接把x放到它在输出数组中的位置上了。例如,如果有17个元素小于x,则将x放在第18个位置即可。但是当存在几个原创 2014-01-09 20:56:59 · 1151 阅读 · 0 评论 -
倒排索引处理文档--【随笔】
就是给给一个文档集,利用倒排挡索引技术,实现1.输入布尔表达式,如:输入hello&world,输出同时存在这两个单词的文档名2.输入一个词组,输出存在这个词组的文档名倒排索引(英语:Inverted index),也常被称为反向索引、置入档案或反向档案,是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。它是文档检索系统中最常用的数据结构。有两种不同的反向索引形式:1、一条记录的水平反向索引(或者反向档案索引)包含每个引用单词的文档的列表。2、一个单原创 2014-01-16 09:00:44 · 1950 阅读 · 1 评论 -
面试题33:把数组排成最小的数--《剑指offer》
问题:输入一个正整数数组,把数组里面的所有数字连接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3, 32, 321},则打印这三个数字能排成的最小数字321323。这题如果按照一般的全排列,n个数字是n!个排列,实在是行不通...这时我们需要一个排序规则:原创 2014-06-04 20:34:40 · 1171 阅读 · 2 评论