
数据结构与算法
xiaoding133
My name is Ma dingding. I’m a student, and software cultivator living in NanJing. This is my software development blog. I also study the aspect of speech recognition.If you are on Weibo,you can follow me at @xiaoding133.
展开
-
链表的三种构造方法
#include#include#define MAX 100000typedef struct SLink{ int data; struct SLink *next;}SNode;/*前向插入法构造简单链表*/SNode * CreateLinkA(){ int x; SNode *head,*p; //SNode *p; head=NULL; scanf("原创 2012-05-17 10:04:07 · 6023 阅读 · 2 评论 -
【面试题】在二元树中找出和为某一值的所有路径
问题:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。 例如输入整数 22 ,如下图二元树: 10 / \原创 2012-10-07 16:31:27 · 2061 阅读 · 0 评论 -
【编程之美】读书笔记:求1到N之间整数中出现1的个数
问题:给定一个十进制正整数N,写下从1开始到N的所有整数,求其中出现的所有“1”的个数?例如:N=2,写下1,2.1的个数为1。当N=12,1的个数为5。 解法一:从1开始遍历到N,将其中每一个数中含有1的个数加起来,得到从1到N的所有1的个数之和。 int Count1InInteger(int n){ int iNum=0; while(n!原创 2012-10-02 12:14:38 · 4412 阅读 · 5 评论 -
【编程之美】读书笔记:寻找发帖水王
问题:传说,Tango有一大“水王”,他不但喜欢发帖还会回复其他ID发的每个帖子。该“水王”的帖子数目超过了帖子总数的一半,如何用快速的方法找出这个“水王”的ID? 分析:首先想到的是对所有的ID进行排序,然后再扫描一遍排好序的ID列表,统计各个ID出现的次数。如果某个ID的次数超过总数的一半,那么就输出这个ID。这个算法的时间复杂度为O(N*logN+N).原创 2012-10-01 14:17:20 · 9061 阅读 · 0 评论 -
【校园招聘】2013大众点评网软件研发岗笔试题
今天参加了南京地区的大众点评网软件研发岗的笔试,笔试题分成两部分,第一部分是行测,第二部分是算法设计题。行测中有言语理解题和数字推理以及图形观察题,考试时间20分钟。专业题有三道,都是算法设计题,考试时间为40分钟,先写思路,再写算法。下面回忆一下算法设计的三道题目。 第一题:质因数分解,给定一个整数,求出该数的所有质因数,如90=2*3*3*5; 第二题:求二原创 2012-10-12 16:38:34 · 5336 阅读 · 0 评论 -
【Programming Pearls】对文档中的单词进行计数问题
所谓单词就是用空格分隔开的字符序列。但是在网页文件中还包含 等词,所以需要避免这种情况。 示例 1:int main(void){ set S;set::iterator j;string t;while (cin >>t) //读取输入,插入到set集合S中,重复的单词忽略S.insert(t);for (j = S.begin();j != S.e原创 2013-04-27 10:57:02 · 1336 阅读 · 0 评论 -
【排序算法】堆排序
1、什么是堆 首先它是一颗完全二叉树,并且父结点的值大于子节点的值(最大堆)或父结点的值小于子结点的值(最小堆)。小根堆:根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最小者的堆称为小根堆,又称最小堆。大根堆:根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最大者,称为大根堆,又称最大堆。2、堆排序 利用了大根堆或最小堆堆顶记录的关键字最原创 2012-10-02 18:31:35 · 1400 阅读 · 0 评论 -
【算法题】字符串向左或向右循环移动
问题描述:将一个具有n个元素的字符串向左循环移动i个位置。例如,假设n=8,i=3,那么字符串abcdefgh移动之后变成defghabc.对于整数数组1,2,3,4,5,6,7,8,9,10循环向左移动5位的结果为6 7 8 9 10 1 2 3 4 5. 条件: 时间复杂度O(n), 空间复杂度O( 1 ).人们可能想到的解法:一:先将数组或字符串中的前i个元素复制到一个临时数原创 2012-09-25 20:22:47 · 3090 阅读 · 0 评论 -
【排序算法】直接选择排序(SelectSort)与冒泡排序(BubbleSort)
直接选择排序:每一趟在n-i-1(i=1,2,...n-1)个记录中选取关键字最小的记录,并和第i个记录进行交换。void SelectSort(int Array[],int n)//n为数组长度,不稳定排序{ int i,j,k; int temp; for(i=0;i<n-1;i++) { k=i; //保存最小值 for(j=i+1;j<n;j+原创 2012-07-13 10:13:14 · 1824 阅读 · 0 评论 -
【排序算法】直接插入排序与希尔(Shell)排序
直接插入排序 是依次将每个元素插入到一个有序的序列当中去,可以用抓扑克牌来类比,实现如下:/*插入排序*/void insert_sort(int Array[],int Len){ //可以用抓扑克牌类似 int temp=0,j=0; for(int i=1;i<Len;i++) { temp=Array[i]; j=i-1;原创 2012-07-12 15:54:48 · 1139 阅读 · 0 评论 -
【排序算法】合并排序超级总结
一、介绍基本的排序算法主要可以分为两大类。第一类时基于逐个比较的,第二类是非比较的。插入排序Insertion sort,冒泡排序bubble,和希尔排序Shell sort都是基于比较模型的。这三个算法的时间复杂度为O(n^2),实在是太慢了。是否有可能比O(n^2)更快的排序方法呢?答案当然是有的。前面三种算法都是从待排序列表开始比较其中的每两个元素大小。插入排序和冒泡排序作了很多次比原创 2012-05-17 14:07:51 · 1712 阅读 · 0 评论 -
【Programming Pearls】查找所有的变位词
给定一本英语单词词典(每个输入行一个单词,字母都用小写),怎么找出所有的变位词类。例如:“deposit”、“dopiest”、“posited”是同一类变位词。 假如在词典中大约有230000个单词,即使一次简单的变位词比较至少也需要花一微秒的时间,总共需要230000个单词*230000次比较/个单词*1微秒/一次比较=52900*10^6微秒=52900秒=14.7小时。原创 2013-04-28 11:15:08 · 1710 阅读 · 1 评论 -
【排序算法】快速排序超级总结
快速排序一、介绍 快速排序和合并排序有点类似,两者可以相互比较。快速排序也是像合并排序那样将整个序列分成两段分别进行排序。但是快速排序没有合并排序的合并过程。 该算法是1960 年C.A.R.Hoard提出的一个非常好的排序算法。快速排序算法需要选择一个划分元素,把小于划分元素的元素放在它的左边,大于它的元素放在右边,这样就分成了左右两端,在对左右两段进行排序。从原创 2012-05-17 16:33:34 · 1872 阅读 · 0 评论 -
【Programming Pearls】查找一段文本或单词中的最长重复子串
给定一个文本文件,查找最长的重复子串。 如文本“Ask not what your country can do for you, but what you can do for your country”,最长的重复子串为“can do for you”和“your country”。单词banana的最长重复子串为“ana“。该问题可以看成是一个由颠倒字母组成的单词组合问题。假设该输入字符原创 2013-04-27 19:13:45 · 1805 阅读 · 0 评论 -
【排序算法】基数排序(RadixSort)
基数排序:它不是比较关键字的大小,它是根据关键字中各位的值,通过对待排序的n个元素进行若干趟“分配”与“收集”来实现排序的。设待排序的线性表中每个元素的关键字都是d位的十进制正整数。在排序的过程中需要对该线性表进行d次的分配与收集处理,每趟处理方法是相同的。在进行第j(j=1,2,...,d)次处理时,首先按元素在线性表中的排列顺序,依次将每个元素插入到编号为0~9的某个队列(关键字右起第j位原创 2012-07-13 13:10:15 · 937 阅读 · 0 评论 -
【编程之美】读书笔记:寻找最大的K个数
目录(?)[-]方法一:常规解法,先排序(时间复杂度为O(N*logN))方法二:利用快速排序原理(时间复杂度O(N*logK)(掌握)方法三:利用最小堆的原理(时间复杂度为O(N*logK))(掌握)方法四:二分法(在实际应用中效果不佳)方法五:用空间换取时间的方法 问题:查找大量无序元素中最大的K个数。原创 2012-10-02 19:49:02 · 32962 阅读 · 6 评论 -
【面试题】把二元查找树转变成排序的双向链表
题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。 比如将二元查找树 10 / \原创 2012-10-07 16:03:50 · 1267 阅读 · 0 评论 -
二叉树的创建以及遍历
#include#includeusing namespace std;typedef struct tnode{ char data; struct tnode *lchild,*rchild;}BTNode;///建立二叉树BTNode *CreateTree(){ char x; BTNode *bt; cin>>x; if(x==原创 2012-07-12 13:29:44 · 1296 阅读 · 0 评论 -
队列的线性存储和链式存储实现
队列是只允许在队尾插入元素,在队头删除元素的线性表。它有两种存储结构,即是顺序存储和链式存储结构。链式存储结构实际上是一个同时带有首指针和尾指针的单链表。实现如下:#includeusing namespace std;const int MaxSize=20;typedef struct{ int data[MaxSize]; int font,rear;}SqQueue原创 2012-07-11 19:20:48 · 1445 阅读 · 0 评论 -
C++栈类的实现
#ifndef _CStack#define _CStack#includetemplateclass CStack{// LIFO 对象public :CStack(int MaxStackSize = 10);~CStack () {delete [] stack;}bool IsEmpty() const {return top == -1;}bool IsFull()原创 2011-10-22 20:36:44 · 7549 阅读 · 0 评论 -
双向链表的相关操作C++实现
对于循环双向链表判断一个链表是否为空的条件为:head->next==head (头指针)判断*p为最后一个节点的条件为:p->next=head#includeusing namespace std;/*双链表结构*/typedef struct node{ int data; struct node *prior; struct node *next;}DN原创 2012-07-11 14:17:38 · 9445 阅读 · 1 评论 -
图的存储与遍历
1.图的存储结构有两种,第一种是邻接矩阵,第二种是邻接表。邻接矩阵是表示顶点之间相邻关系的矩阵。邻接表:是图的一种链接存储结构。在邻接表中,对图的每一个顶点建立一个带头结点的单链表,所有的头节点构成一个数组,第i个单链表中的结点表示依附于顶点vi的边。单链表中每个节点由两个域组成:顶点域adjvex,用以指示该邻接点在头结点数组中的序号(下标);链域next, 用以指示依附于顶点vi的下一条边原创 2012-07-17 19:01:45 · 1356 阅读 · 0 评论 -
C++顺序表的实现(采用模板)
(数组描述)采用模板#ifndef CLinearList_#define CLinearList_#includetemplate class CLinearList {public: CLinearList(int MaxListSize=10); //构造函数 virtual ~CLinearList(); bool IsEmpty() const原创 2011-09-29 13:25:33 · 6436 阅读 · 1 评论 -
字典与散列表
一、字典字典(dictionary)是一些元素的集合。每个元素有一个称作key 的域,不同元素的key各不相同。有关字典的操作有:• 插入具有给定关键字值的元素。• 在字典中寻找具有给定关键字值的元素。• 删除具有给定关键字值的元素。随机访问:若仅按照一个字典元素本身的关键字来访问该元素。顺序访问:指按照关键字的递增顺序逐个访问字典中的元素。顺序访问需借助于Be原创 2012-08-21 16:54:59 · 3385 阅读 · 0 评论 -
【算法题】字符串的全排列
问题:编写一个函数,用它把字符串中所有的字符的各种排列形式全部显示出来,即用给定字符做全排列。如比如给定字符串“hat”,函数输出全排列:tha,aht,tah,ath,hta,hat.算法如下:void DoPermute(char in[],char out[],int used[],int length,int recursLev){ int i; /*基底情况*/原创 2012-09-28 16:19:45 · 1017 阅读 · 0 评论 -
【算法题】二叉树的前序遍历(递归和非递归算法分析)
问题:对二叉树的前序遍历(递归和非递归算法)递归算法:输出根节点的值 对左子树进行左遍历 对右子树进行遍历 代码如下:void PreorderTraversal(node *root){ if(root) printf("%d\n",root->value);elsereturn ;PreorderTrave原创 2012-09-29 10:35:08 · 2442 阅读 · 0 评论 -
【算法题】整数与字符串之间的相互转化
数字转换为字符串itocchar itoc(int i){return i+'0';}字符串转换为数字int ctoi(char c){return c-'0';}Q:怎么样将整数转换为字符串数?int main(){ int num=-12345; int isNeg=0;//是否为负数的标志 char temp[7]原创 2012-09-28 16:10:41 · 1174 阅读 · 2 评论 -
【编程之美】读书笔记:给定一个整数N,求N!末尾有多少个0
问题:给定一个整数N,求N!末尾有多少个0 这个题目不能直接求出N!的值,这样可能会溢出。首先考虑N!=K*10^M,并且K不能被10整除,那么N!末尾有M个0。再考虑对N!进行质因数分解,N!=(2^X)*(3^Y)*(5^Z)...,由于10=2*5,所以M只和X和Z有关,每一对2和5相乘都可以得到一个10,于是M=min(X,Z);不能看出X>=Z.所以把公式简化为M=Z原创 2012-10-01 11:59:25 · 4140 阅读 · 1 评论 -
【编程之美】读书笔记:从无头单链表中删除结点
问题:假设有一个没有头指针的单链表。一个指针指向此单链表中间的一个节点(不是第一个也不是最后一个),如何将该结点删除? 分析:假设给定的指针为pCurrent,Node *pNext=pCurrent->Next(pNext指向pCurrent的下一个结点)。根据题意,pNext!=NULL.若pCurrent指向中间要删除的节点B,如下图所示:但是该链表没有头指针,原创 2012-10-04 14:59:13 · 1348 阅读 · 0 评论 -
【编程之美】读书笔记:求数组的子数组之和的最大值
问题:一个有N个整数元素的一维数组(A[0],A[1],A[2],...A[n-1]),这个数组中子数组之和的最大值是多少?该子数组是连续的。例如 数组:[1,-2,3,5,-3,2]返回8; 数组:[0,-2,3,5,-1,2]返回9 解法一:常规解法,时间复杂度为O(N^2) 设Sum[i,...,j]为数组A中第i个元素到第j个元素的和(0利用Sum原创 2012-10-03 16:33:43 · 4032 阅读 · 0 评论 -
【编程之美】读书笔记:寻找数组中的最大值和最小值
问题:对于一个由N个整数组成的数组,需要比较多少次才能把最大值和最小值的数找出来呢? 解法一:将寻找数组中的最大值和最小值看成是两个独立的问题。分别求出最大值和最小值即可。这样需要2*N次的比较才能求出最大的数和最小的数。void FindMinMax(int A[],int size,int &min,int &max){ min=A[0]; m原创 2012-10-06 16:16:06 · 7679 阅读 · 0 评论 -
【编程之美】读书笔记:求二进制数中1的个数
问题:求二进制中1的个数。对于一个字节(8bit)的无符号整型变量,求其二进制表示中"1"的个数,要求算法的执行效率尽可能的高。 解法一:对于一个八位的二进制数据,除以一个2,原来的数字中将减少一个0.如果除的过程中有余,那么当前位置就有一个二进制位1. 例如:10100010 它第一次除以2,商为1010001,余数为0;它第二次除以2,商为10原创 2012-10-01 10:07:51 · 1790 阅读 · 0 评论 -
用STL设计消息队列、优先级消息队列、资源分配管理器
STL库老早已经成为C++的一部分,在使用C++开发项目的过程中,很多人还在犹豫要不要使用STL库,觉得STL库很难,其实不然。我工作的项目中现在大量使用STL库,STL使用调试简单,高效,可以减少重复的代码量。 本文的主要目的是使用STL的queue 和 priority queue来阐述下项目中经常使用的消息队列以及资源分配模式。本文的例子主要如下:消息队列带优先级的消息队原创 2014-09-27 15:07:11 · 4398 阅读 · 0 评论