![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构/算法
文章平均质量分 71
Bruce_Zeng
这个作者很懒,什么都没留下…
展开
-
kmp模板
关于KMP算法的思想,网上有很多,这个算法写起来简单,但理解起来还是有一定难度的,我的表达能力也说不清楚,所有直接上我自己写的模板吧#include#includeusing namespace std;void get_next(char* p, int* next){ int i, j; i = 0; j = -1; next[0] = -1; while原创 2012-07-19 22:16:11 · 2999 阅读 · 0 评论 -
算法导论学习笔记(一):插入排序
排序可以说是我们平常写代码中最经常用到的算法之一了。冒泡排序应该是大家最熟悉的了,几乎每本编程语言的入门教程中都会提到。这里主要讲下插入排序。插入排序:插入排序的大概步骤是从第二个元素开始遍历,当遍历到第N个元素时,前面N - 1个元素都已经排好序了,然后查找前面排好序的N - 1个元素,将第N个元素插入到适当的位置。也就是说插入排序实现有两个关键点:如何保证遍历到当前原创 2012-12-11 22:32:38 · 3474 阅读 · 0 评论 -
算法导论学习笔记(六):计数排序与基数排序
这里的两个排序的期望运行时间都是O(n),应该是到目前为止时间复杂度最低的了。计数排序计数排序假设n个输入元素的每一个都是介于0到K之间的整数,此处K为某个整数,在具体实现中,我们可以取K为n个元素中最大的那个。计数排序的基本思想:对每个输入元素x,确定小于x的元素个数。再根据这个信息,把x放到它最终输出数组中的位置上。例如,有20个元素小于x,则x就放到输出数组的第21个位置原创 2012-12-30 17:14:30 · 2645 阅读 · 0 评论 -
算法导论学习笔记(八):二叉查找树
前言昨天复习完了二叉树,今天终于可以很好的展开对二叉查找树的学习了。言归正传,查找树是一种数据结构,支持多种动态集合操作,包括SEARCH、MINIMUM、MAXIMUM、PREDECESSOR、SUCCESSOR、INSERT以及DELETE。定义一颗二叉查找树是按二叉树结构来组织的。这样的树可以用链表结构来表示,其中每一个结点都是一个对象。结点中除了key域和卫原创 2013-01-09 10:54:48 · 3299 阅读 · 4 评论 -
算法导论学习笔记(四):求X的N次方的二分实现
今天在看到网易里的算法导论的公开课,听到老外讲分治法时提到了下算一个数的N次方的可以通过二分思想来实现,于是便想自己写个代码来实现它。虽然很简单,还是想写在博客中。一是可以加深自己的印象,以后遇到这类问题时可以马上想到用二分来解决;二是可以方便以后的复习,再次用到的时候可以直接来这找模板。#includeusing namespace std;int Pow(int x, i原创 2012-12-28 02:39:01 · 5438 阅读 · 4 评论 -
算法导论学习笔记(十一):动态规划(一)
装配线调度#includeusing namespace std;int a[3][7], t[3][7], e[3], x[3];int f[3][7], l[3][7];int n = 6;/***************************************************** l[i][j]存储经过装配站j-1所在装配线** f[1][0]和f[原创 2013-02-25 20:37:20 · 2069 阅读 · 0 评论 -
算法导论学习笔记(十四):贪心算法(一):活动安排问题
对很多最优化问题来说,采用动态规划方法来解决就有点大材小用了。有时候我们可以采用贪心算法来取代。贪心算法是通过所做的局部最佳选择来产生一个全局最优解。而且和动态规划不同的是,它是通过自顶向下的方式来解决每一个子问题。而活动安排问题可以说是贪心算法的一个入门学习。当我看到这个问题时,首先就想到了自己大一做ACM时在杭电acm里遇到的一个题目:今年暑假不AC。可以说这个题目就是原创 2013-03-03 15:00:38 · 2759 阅读 · 0 评论 -
算法导论学习笔记(二):合并排序
在前一篇博客中已经提到了插入排序,这里继续介绍下另一种比较高效的排序:合并排序。合并排序用到了分治思想,其时间复杂度为O(NlgN)。合并算法的关键在于合并。合并排序的的基本步骤如下:1.把待排序的数组分为左数组和右数组2.对左数组和右数组进行迭代排序3.将左数组和右数组进行合并显然这些基本步骤符合分治模式在每一层递归上的三个步骤:分解、解决、合并。每步的实现代码如下:原创 2012-12-15 22:43:49 · 3180 阅读 · 1 评论 -
算法导论学习笔记(五):快速排序
快速排序是一种最坏情况运行时间为O(n*n),虽然这个最坏情况运行时间比较差,但快速排序通常都是用于排序的最佳的实用选择,这是因为其平均性能相当好:期望的运行时间为O(nlgn),且O(nlgn)记号中隐含的常数因子很小。另外,它还能够进行就地排序。快速排序和合并排序一样,采用的都是分治思想。快排中利用该思想解决步骤为:1、先从数组中取出一个数作为基数,基数的选择对排序效率原创 2012-12-29 22:10:23 · 5989 阅读 · 0 评论 -
算法导论学习笔记(十三):动态规划(三):01背包问题
01背包问题有N件物品和一个容量为V的背包。第i件物品的体积是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。基本思路这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:f[i][v] = max{f[i-1][v],f[i-原创 2013-03-07 11:12:09 · 5403 阅读 · 0 评论 -
算法导论学习笔记(十二):动态规划(二):最长公共子序列(LCS)
LCS:给出两个序列S1和S2,求出的这两个序列的最大公共部分S3就是就是S1和S2的最长公共子序列了。公共部分必须是以相同的顺序出现,但是不必要是连续的。解法一:在没学动态规划之前,我能想到的方法就是枚举了。将S1的所有子序列全部检查是否是S2的子序列,从中选出最长公共子序列。对于长度为n的序列,其子序列共有2的n次方个,这样的话这种算法的时间复杂度就为指数级了,这显然不原创 2013-02-27 19:37:56 · 6616 阅读 · 0 评论 -
算法导论学习笔记(十):约瑟夫排列
约瑟夫问题的定义:假设n个人排成环形,且有一个正整数 m 就让其出列,且报数进行下去。这个过程一直进行到所有人都出列为止。每个人出列的次序定义了整数0,1,2,...n-1的(n, m)-约瑟夫排列。例如(7, 3)约瑟夫排列为。Code#includeusing namespace std;int main(){ int n, m; int a[100];原创 2013-01-26 14:52:04 · 2598 阅读 · 0 评论 -
二分查找
二分查找又称折半查找。使用二分查找的前提:线性表中的记录必须是关键码有序,线性表必须采用顺序存储。二分查找的思想是:在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功; 若给定的值小于中间记录的关键字,则在中间记录的左半区继续查找;若给定的值大于中间原创 2012-08-01 15:01:42 · 1332 阅读 · 0 评论 -
表达式求值(简易版)
昨天在复习数据结构之栈的时候,就想起自己以前帮同学做过一个表达式求值的,但现在想想基本忘光了,所以重新写过一个。现在这个版本的实现了基本四则运算以及带括号的运算,并且支持括号的嵌套,如 5+((1+2)*3)+((1+2)*(2+3))这样的表达式。也支持输入的数字是多位的,而不仅仅是个位数的运算,如 56+21这样的表达式。当然,因为这只是个初级版本,目前只支持整数的运算,而且当做除原创 2012-07-18 21:12:19 · 1303 阅读 · 0 评论 -
编程之美学习笔记(二):中国象棋将帅问题
问题描述:根据中国象棋的基本原则,在只有双方的将帅的棋盘上,找出所有双方可以落子的位置,也就是将帅不能 相互面对,而且只能使用一个字节存储变量。这个问题本身是并不复杂,若没有“只能使用一个字节存储变量”这个条件的限制,直接两层 for循环,遍历将帅所有的可能位置即可,但有了这个条件限制后,问题一下子就变得复杂了些。那么接下来我们要思考的就是如何用一个字节的变量来做两层循环的原创 2012-11-14 22:58:53 · 1527 阅读 · 0 评论 -
编程之美学习笔记(一): 1的数目
问题描述给定一个十进制正整数N,求出从1开始,到N的所有整数中出现的所有“1”的个数。思路一这个问题初一看感觉就是不是很难,因为马上就能想到一个最简单的方法来计算了,那就是从1开始遍历到N,将其中每一个数中含有的“1”的个数加起来,这样便得到了从1到N所有“1”的个数的和。下面是实现代码#includeusing namespace std;int count原创 2012-10-26 20:28:18 · 1072 阅读 · 0 评论 -
编程之美学习笔记(三):一摞烙饼的排序
问题描述星期五的晚上,一帮同事在希格玛大厦附近的“硬盘酒吧”多喝了几杯,程序员多喝了几杯之后谈什么呢?自然是算法问题。有个同事说:“我以前在餐厅打工,顾客经常点非常多的烙饼。店里的烙饼大小不一,我习惯在到达顾客饭桌前,把一摞饼按照大小次序摆好---小的在上面,大的在下面。由于我一只手托着盘子,只好用另一只手,一次抓住最上面的几块饼,把它们上下颠倒个个儿,反复几次之后,这摞烙饼就原创 2012-11-17 20:11:38 · 2257 阅读 · 0 评论 -
N!问题
这写的是算N!的一个代码,大家都知道,#includeusing namespace std;int fun(int n){ if (n == 0 || n == 1) return 1; else return fun(n - 1) * n;}int main(void){ int n; while (cin >> n) { cout << fun(n) <原创 2011-11-27 19:10:21 · 875 阅读 · 0 评论 -
manacher算法详解
今天同学问我求字符串中最大回文串的问题,最先想到的就是暴力了,时间复杂度为O(n*n),而且还要考虑回文串长度为奇偶两种情况。后来同学说网上有O(n)的解法,就搜了下,果然manacher是在O(n)的时间复杂度里解决的。但是里面那个求数组p的过程还是不怎么理解,特在此发表希望得到论坛朋友们的指教。下面是实现代码:#include#includeusing namespace st原创 2013-03-02 19:10:11 · 3935 阅读 · 0 评论 -
算法导论学习笔记(三):堆排序
堆排序是一种利用堆的性质进行的排序算法。所以学习堆排序之前先来简单介绍下堆。堆堆数据结构是一种数组对象,如图一所示,它可以被视为一颗完全二叉树。 图一树中的每个结点与数组中存放该结点值的那个元素对应。树的每一层都是填满的,最后一层可能除外。如果树的结点和数组的下标都从0开始,那么给定了某个结点的下标i,其父节点PARENT(i)、左儿子LEFT(i)和右儿子原创 2012-12-26 17:17:32 · 2220 阅读 · 0 评论 -
算法导论学习笔记(七):二叉树
前言昨天看算法导论看到二叉查找树,虽然以前学数据结构的时候已经学过了二叉树,但感觉自己很多东西已经忘了,为了更好的学习二叉查找树以及后面所涉及到的二叉树方面的相关算法,故再一次复习了下二叉树。并在这写个复习笔记,便于以后的复习。定义学习二叉树之前,肯定得了解数据结构中的树。数据结构中的树和我们现实中的树还是有一点区别的。首先数据结构中的树与现实相比是倒立的。其次数据原创 2013-01-07 15:46:27 · 3100 阅读 · 0 评论 -
hdu1003 Max Sum
Max SumProblem DescriptionGiven a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max sum of a sub-sequence. For example, given(6,-1,5,4,-7), the max sum in this sequence is原创 2013-04-18 12:42:17 · 2328 阅读 · 0 评论