
数据结构与算法
文章平均质量分 78
Furney
人的一生中,最光辉的一天并非是功成名就那天,而是从悲叹与绝望中产生对人生的挑战,以勇敢迈向意志那天。
展开
-
与阶乘相关的问题
1、求一个整数N的阶乘。对于较小的数N的阶乘,可以用基本数据类型表示。但是当N较大时,所得的结果会超出基本数据类型所能表示的范围。所以考虑使用数组保存最终的结果。#include #define N 200 // 结果位数int main(){ int i, j, n, r, s; int a[N] = {0}; // 阶乘结果数组 scanf("%原创 2012-04-19 22:46:04 · 849 阅读 · 0 评论 -
求二进制数中1的个数
求整数的二进制表示中1的个数,最直接的方式是求出其二进制表示,再计算出二进制表示中1的个数。但是这种方法的效率较低。因为我们只需要统计二进制表示中1的个数,所以没有必要将整数先转化为二进制,可以在对整数处理的过程中计数。整数转化为二进制,除了直接除以2以外,位操作的右移一位可以实现同样的功能。右移过程中会将最后一们直接丢弃,因此在右移操作之前需要先判断最后一们是否为1,使用“与”操作可以实现。例如原创 2012-04-20 08:39:15 · 1944 阅读 · 4 评论 -
查找总结
1.折半查找 折半查找又称二分查找(Binary Search)过程是:先确定待查找记录所在区间,然后逐步缩小查找区域直到找到或找不到记录为止。折半查找适用于查找表有序,否则不能使用折半查找。//在大小为len的有序数组arr中查找记录key//找到返回1,找不到返回0int BinarySearch(int *arr, int key, int len){ //初始原创 2011-12-28 21:16:22 · 722 阅读 · 0 评论 -
字符串循环移动
字符串循环移位一直是字符串操作的常见问题,最直观的解决方法是每次将字符串中的元素移动一位,循环k次。这个算法虽然可以实现字符串的循环移位,但是算法的时间复杂度为O(k*n),其中n为字符串的长度,k为循环移位的位数。为了降低时间复杂度,通过对移位过程的详细分析发现,可以利用中间变量tmp保存str[0, k - 1],再将str[n - k, n - 1]依次放入str[0, k - 1],最后将原创 2012-02-16 19:31:37 · 2991 阅读 · 3 评论 -
数据结构小总
1、栈和队列的区别栈是限定只能在表的一端进行插入和删除操作的线性表。 队列是限定只能在表的一端进行插入和在另一端进行删除操作的线性表。 从"数据结构"的角度看,它们都是线性结构,即数据元素之间的关系相同。但它们是完全不同的数据类型。除了它们各自的基本操作集不同外,主要区别是对插入和删除操作的"限定"。 栈和队列是在程序设计中被广泛使用的两种线性数据结构,它们的特点在于基本操作的原创 2012-05-31 22:19:25 · 964 阅读 · 0 评论 -
教你如何迅速秒杀掉:99%的海量数据处理面试题
前言 一般而言,标题含有“秒杀”,“99%”,“史上最全/最强”等词汇的往往都脱不了哗众取宠之嫌,但进一步来讲,如果读者读罢此文,却无任何收获,那么,我也甘愿背负这样的罪名,:-),同时,此文可以看做是对这篇文章:十道海量数据处理面试题与十个方法大总结的一般抽象性总结。 毕竟受文章和理论之限,本文将摒弃绝大部分的细节,只谈方法/模式论,且注重用最通俗最直白的语言阐述相关问转载 2012-05-16 14:30:32 · 1028 阅读 · 0 评论 -
单链表模板类
链表是最基本的数据结构,是一组不连续的数据的集合,链表中每个结点除包含结点元素外,还包含下一结点的地址。对链表可以实现插入、删除、查找以及显示等操作。/* * 单链表模板类List.h */ #ifndef _LIST_H_#define _LIST_H_#include using namespace std;template class List{publi原创 2012-06-12 20:57:54 · 1281 阅读 · 0 评论 -
循环链表模板类
相对于单链表,循环链表的最后一个结点的next指针指向表头元素,而且每个结点还包含指向其前驱结点的prev指针。链表第一个结点的prev指针是链表的头结点,表头结点的prev指针指向链表最后一个结点。循环链表的插入和删除操作需要注意各指针的变化顺序,否则容易造成结点混乱。另外对循环链表来说,更容易找到指定结点的前驱。/* * 循环链表模板类 */#ifndef _DOUBLE_LIST_原创 2012-06-18 11:38:42 · 1767 阅读 · 0 评论 -
字符串的排列
描述:输入一个字符串,打印出该字符串字符的所有排列。比如给定字符串“abc”,即求字符’a‘,’b‘,’c’的全排列,结果应该是abc、acb、bac、bca、cba和cab总有六个。1、全排列的递归方法思路:对于这个问题,我们从结果来分析,以abc和acb为例可以看出,相当于以a为字符串首字符,再和b、c的全排列cb、cb连接构成。以此类推,可以确定以b、c为首字符的全排列。因此解决这个原创 2012-09-16 15:03:45 · 1296 阅读 · 0 评论 -
第一个只出现一次的字符
利用哈希表的思想来解,首先设置一个数组保存字符串中每个字符出现的次数,第一趟遍历字符串计算出每个字符出现的次数,第二次遍历找出第一个只出现一次的字符。算法的时间复杂度为O(n)。char FirstAppearedChar(char *str){ if(str == NULL) // 数据合法性检验 return '\0'; unsigned int hashTable[256原创 2012-09-18 10:20:18 · 995 阅读 · 0 评论 -
连续子数组的最大和
问题描述:输入一个整数数组,数组中有正数也有负数,一个或连续的多个整数组成一个子数组,求所有子数组的和的最大值。求子数组的和的最大值,首先可以求出数组所有子数组的和,再逐一比较可以得到和的最大值。这是最直观易懂的一种解法。但是对一个长度为n的数组,总共有n(n+1)/2个子数组,计算所有子数组的和时间复杂度为O(n^2)。而当n较大时,这种算法是很难被用户接受的。对于数组(a1, a2,原创 2012-09-17 20:54:45 · 7260 阅读 · 2 评论 -
最小的K个数
问题描述:给定的n个整数,计算其中最小的K个数。最直观的解法莫过于将n个数按升序排列后输出前k个。但是就效率来看,这种方法并不是最理想的。一种改进方法是借助快速排序中对数组的划分,以第k个元素对数组进行划分,使得比第k个数字小的数字都在其左边,比其大的数字都在它的右边。void Swap(int &a, int &b){ int c = a; a = b; b = c;}int原创 2012-09-17 16:09:30 · 2393 阅读 · 0 评论 -
字典树
字典树(Trie),又称为单词查找树或键树。Trie是树形结构,是一种哈希树的变形。典型应用于统计、排序和保存大量的字符串,所以经常被搜索引擎系统用于文本词频统计。字典树的结构特点:1、根结点不包含字符,除根结点外其他结点都只包含一个字符。2、从根结点遍历字典树至某一节点,则从根节点至该节点所经过的节点连接结成的字符串即为该节点对应的字符串。3、每个节点的所有子结点所包含的字符都不原创 2011-12-24 12:15:09 · 1689 阅读 · 0 评论 -
拓扑排序
在介绍拓扑排序前我们需要了解什么是偏序和全序。1、偏序——若集合X上的关系R是自反的、反对称的和传递的,则称R是集合X上的偏序关系。2、全序——设R是集合X上的偏序,如果对每个x,y∈X必有xRy或yRx,则称R是集合X上的全序关系。而由某个集合上的一个偏序得到该集合上的一个全序,这个操作就称之为拓扑排序。拓扑排序的经典例子就是选课问题,数据结构书籍上都有介绍,这里不再赘述。那原创 2012-02-12 16:08:58 · 2029 阅读 · 0 评论 -
POJ 2406 Power Strings
题目描述:给出一个字符串s,求该字符串最多是由多少个重复字符串连接而成。分析:KMP算法每次求得的next值就是当前到i为止的前子串与后字符串相等的子串的长度。#include#includeint main(){ int i, j, len; char str[1000005]; int next[1000005]; while(scanf("%原创 2012-01-11 17:02:28 · 754 阅读 · 0 评论 -
字符串模式匹配
模式匹配又称为子串的定位操作,是串最基本的操作。下面对常用的模式匹配算法作简单介绍。1、朴素模式匹配算法 此算法是最简单的匹配算法,算法思想如下:从主串s的第1个字符起和模式串t的第1个字符比较,如果相等,则继续比较后继字符。否则从主串的下一个字符起再重新和模式串的第1个字符进行比较,直到模式串t中的每一个字符依次和主串s中的一个字符序列相等则匹配成功,返回和模式串t中第1个字符相等的字符原创 2012-01-10 16:01:20 · 3350 阅读 · 0 评论 -
打印素数的各种算法
以前在网上看过一段这么描述素数的话说数论的研究对象归根到底是对素数的研究,因此如何高效地判断一个数是否是素数或者快速打印出一定范围内的素数的重要性不言而喻。下面我们来看一下几种关于素数判别的算法。1、素数判定朴素算法素数是这样一类特殊的数:它的因子只有1和它本身。由此我们可以得一种最为简单的判断一个数是否为素数的算法:对于某个数n,使2至n的开根作为除数,如果这些除数都不能整除n,则说明n原创 2012-01-11 22:12:55 · 4478 阅读 · 3 评论 -
POJ 1001 求高精度幂
题目描述:对数值很大、精度很高的数进行高精度计算是一类十分常见的问题。比如,对国债进行计算就是属于这类问题。 现在要你解决的问题是:对一个实数R( 0.0 n),其中n 是整数并且 0 解题思路:很简单的一道高精度题目。话不多说直接上代码,过程被写得复杂啦,有很大的改进空间。#include #include using namespace std;string m原创 2012-01-13 06:02:40 · 2578 阅读 · 0 评论 -
POJ 1488 TEX Quotes
题目描述信息较多,但是仔细读完会发现本题所要完成的功能是并不像描述得那么吓人,只是实现给定字符串中指定字符的替换。直接使用string类提供的find_first_of及replace函数就可以解题,具体实现代码如下:#include #include using namespace std;int main(){ string str; int count = 1; whil原创 2012-01-13 06:20:40 · 1393 阅读 · 0 评论 -
排序总结
1.直接插入排序(Straight Insertion Sort) 直接插入排序(Straight Insertion Sort)是一种最简单的排序方法。基本操作是将当前元素插入到已排好序的有序表中,最终得到完全有序的元素集合。例如,对元素集合{49,38,65,97,76,13,27}进行排序的操作如下:i = 1:{[38],49,65,97,76,13,27}i原创 2011-12-27 22:23:47 · 1173 阅读 · 0 评论 -
ACM小技巧
1.一般用C语言节约空间,要用C++库函数或STL时才用C++;cout、cin和printf、scanf最好不要混用。大数据输入输出时最好不要用cin、cout,防止超时。2.有时候int型不够用,可以用long long或__int64型(两个下划线__)。值类型表示值介于 -2^63 ( -9,223,372,036,854,775,808) 到2^63-1(转载 2012-02-08 20:14:29 · 947 阅读 · 0 评论 -
图的定义及存储
1.图的定义图是一种相对较为复杂的数据结构,由结点及各结点之间的相互关系组成。图中结点之间的关系可以是任意的,也就是说图中任何两个结点之间都可能是有关系的。图中的各个结点称为顶点(vertex)。图分为有向图和无向图。图一中左边是有向图,右边是无向图。图一2.图的存储结构2.1数组表示法数组表示法又称为邻接矩阵表示法,是用两个数组分别存储顶点信息和顶点之间的关系即边原创 2012-02-10 18:51:41 · 4083 阅读 · 0 评论 -
图的深度优先搜索(邻接表)
图的遍历(Traversing Graph)是指从图中某一顶点出发访问图中其余顶点,且使每个顶点仅被访问一次。深度优先搜索(Depth First Search) 深度优先搜索假设初始状态下图中所有顶点都未被访问,尝试优先搜索从图中某个顶点v出去,访问此顶点,然后依次从v的未被访问的邻接点出发深度优先遍历图,直到图中所有和v相连连的顶点都被访问到。如果此时图中还有没有原创 2012-02-11 11:29:49 · 6070 阅读 · 0 评论 -
图的广度优先搜索(邻接表)
图的遍历(Traversing Graph)是指从图中某一顶点出发访问图中其余顶点,且使每个顶点仅被访问一次。广度优先搜索(Breadth First Search) 广度优先搜索假设从图中某个顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后再分别从这些邻接点出发依次访问它们的邻接点,并使先被访问的顶点的邻接点先于后被访问的顶点的邻接点被访问(因此需要原创 2012-02-11 11:52:14 · 6937 阅读 · 0 评论 -
图的深度优先搜索(邻接矩阵)
图的遍历(Traversing Graph)是指从图中某一顶点出发访问图中其余顶点,且使每个顶点仅被访问一次。深度优先搜索(Depth First Search) 深度优先搜索假设初始状态下图中所有顶点都未被访问,尝试优先搜索从图中某个顶点v出去,访问此顶点,然后依次从v的未被访问的邻接点出发深度优先遍历图,直到图中所有和v相连连的顶点都被访问到。如果此时图中还有没有访问到的原创 2012-02-10 20:48:12 · 4024 阅读 · 0 评论 -
图的广度优先搜索(邻接矩阵)
图的遍历(Traversing Graph)是指从图中某一顶点出发访问图中其余顶点,且使每个顶点仅被访问一次。广度优先搜索(Breadth First Search) 广度优先搜索假设从图中某个顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后再分别从这些邻接点出发依次访问它们的邻接点,并使先被访问的顶点的邻接点先于后被访问的顶点的邻接点被访问(因此需要用队列来原创 2012-02-10 22:04:21 · 1901 阅读 · 0 评论 -
高精度计算
由于编程语言提供的基本数值数据类型表示的数值范围有限,不能满足较大规模的高精度数值计算,因此需要利用其他方法实现高精度数值的计算。实现高精度数值计算,虽然不能利用编程语言提供的基本数值数据类型,但是可以利用字符串存储高精度数,计算的结果同样保存在字符串中,将高精度数运算转化为字符串运算。以下列举出高精度数相关运算。1.大数加法/* * 高精度数 * 结果存储在字符串a中,字符串a初始原创 2011-12-30 16:09:21 · 3911 阅读 · 3 评论