
算法|数据结构
文章平均质量分 81
SzMing
这个作者很懒,什么都没留下…
展开
-
SGI_STL_空间配置器
一般而言,我们习惯C++内存申请操作和释放操作如下:class Foo{};Foo * pf = new Foo; //1.申请空间2.调用构造函数delete pf; //1.析构函数2.释放空间 但是为了精确分工,STL Allocator这两个阶段分开来。PS:以下代码不讨论多线程情况内存申请:alloc::allocate()负责。原创 2012-12-10 11:45:19 · 703 阅读 · 0 评论 -
约瑟夫环
题目:约瑟夫环【问题描述】约瑟夫(Joseph)问题的一种描述是:编号为1,2,.....,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始顺时针方向自1开始报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他的顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有的人都出列为止。试设计一个程序求出列顺序。原创 2012-10-29 11:38:59 · 532 阅读 · 0 评论 -
遍历二叉树的各种操作(非递归遍历)
先使用先序的方法建立一棵二叉树,然后分别使用递归与非递归的方法实现前序、中序、后序遍历二叉树,并使用了两种方法来进行层次遍历二叉树,一种方法就是使用STL中的queue,另外一种方法就是定义了一个数组队列,分别使用了front和rear两个数组的下标来表示入队与出队,还有两个操作就是求二叉树的深度、结点数。。。[cpp] view plaincopyprint?#inc转载 2012-10-29 11:38:16 · 633 阅读 · 0 评论 -
C++编译器何时为用户提供默认构造函数
第一种是类成员中有成员是类对象,并且该成员的类含有默认构造函数,那么C++编译器会帮你给这个类也生成一个默认构造函数,用来调用其成员对象的构造函数,完成该成员的初始化构造。需要强调的是,如果这个成员的类也没有给出默认构造函数,那么C++编译器也不会帮你生成该类的默认构造函数。 第二种情况是这个类的基类有默认构造函数。那么C++编译器也会帮你生成该派生类的默认构造函数,以调用基类的转载 2012-10-29 11:30:05 · 601 阅读 · 0 评论 -
全排列算法及实现
全排列在很多程序都有应用,是一个很常见的算法,常规的算法是一种递归的算法,这种算法的得到基于以下的分析思路。 给定一个具有n个元素的集合(n>=1),要求输出这个集合中元素的所有可能的排列。 一、递归实现 例如,如果集合是{a,b,c},那么这个集合中元素的所有排列是{(a,b,c),(a,c,b),(b,a,c),(b,c,a),(c,a,b),(c,b,a转载 2012-10-29 11:26:44 · 463 阅读 · 0 评论 -
为什么学C++比C#的长期风险低
语言之争是程序员永远不会疲倦的闲暇话题,初学者的语言选择也是大家所津津乐道的。回望近年来,随着微软.net战略的来势汹汹,不少初学者都喜欢以C#作为自己的第一门语言。在这样的大环境之下,讨论C++还有什么意义么?在瞎扯这个问题之前,我们先来看看为啥初学者都选择C#。估计原因很简单,就是入门容易。当然,这容易是相对于C++而言的。如果学C++,你肯定要看《C++ primer》这本经典吧?泛原创 2012-10-28 22:23:55 · 947 阅读 · 0 评论 -
内部排序之堆排序
堆排序(Heap Sort)只需要一个记录大小的辅助空间,每个待排序的记录仅占有一个存储空间。 (1)基本概念 a)堆:设有n个元素的序列: {k1, k2, ..., kn} 对所有的i=1,2,...,(int)(n/2),当满足下面关系:转载 2012-10-27 15:52:13 · 629 阅读 · 0 评论 -
线性时间复杂度求数组中第K大数
求数组中第K大的数可以基于快排序思想,步骤如下: 1、随机选择一个支点 2、将比支点大的数,放到数组左边;将比支点小的数放到数组右边;将支点放到中间(属于左部分) 3、设左部分的长度为L, 当K 当K > L时,递归地在有部分中找第(K - L)大的数 当K = L转载 2012-10-27 15:50:16 · 1228 阅读 · 0 评论 -
通讯录管理系统
实现了通讯录的录入信息、保存信息、插入、删除、排序、查找、单个显示等功能。。完整的代码如下:[cpp:firstline[0]] view plaincopyprint?#include #include //得到指向大小为Size的内存区域的首字节的指针// #include #include //标准库函数// #de转载 2012-10-27 12:45:31 · 1485 阅读 · 0 评论 -
约瑟夫环的变形
k个男生和k个女生站成一列,前面k个是男生,后面k个是女生,从第一个男生开始报数,报到队列最后一个同学,循环到队首继续报,并且如果一个同学报到的数是m,这个同学就出列,然后后面的同学继续从1开始报数,现在求一个数m,使k个女生全部出列,而男生没有出列。 输入:男生女生的个数k(男生女生人数相等都为k,输出:m值 例: 输入:2,输出:7原创 2012-10-27 12:31:36 · 776 阅读 · 0 评论 -
数据结构课程设计---------最少换车次数问题
问题描述: 设某城市有n个车站,并有m条公交线路连接这些车站。设这些公交车都是单向的,这n个车站被顺序编号为0~n-1。编号程序,输入该城市的公交线路数,车站个数,以及各公交线路上的各站编号。 实现要求:求得从站0出发乘公交车至站n一1的最少换车次数。 程序设计思路:利用输入信息构建一张有向图G(用邻接短阵g表示),有向图的顶点是车站,若有某条公交线路经i站能到达j转载 2012-10-27 12:14:36 · 1745 阅读 · 1 评论 -
数据结构课程设计---------用栈来实现表达式求值
1、需求分析设计一个程序,演示用算符优先法对算术表达式求值的过程。利用算符优先关系,实现对算术四则混合运算表达式的求值。(1)输入的形式:表达式,例如2*(3+4) 包含的运算符只能有'+' 、'-' 、'*' 、'/' 、'('、 ')';(2)输出的形式:运算结果,例如2*(3+4)=14;(3)程序所能达到的功能:对表达式求值并输出2、系统设计1、栈的抽象转载 2012-10-27 12:13:29 · 1874 阅读 · 0 评论 -
创建随机数链表
编写自定义函数:建立一个带有头结点head的有20个结点的链表,20个结点所需数值由随机数产生。编写自定义函数:建立两个链表,把存有数据的链表中的偶数存入一个链表,奇数存入另一个链表中。编写主函数调用上述两个函数并可输出三个链表中的数据。完整的代码如下:[cpp:firstline[0]] view plaincopyprint?#include "io翻译 2012-10-29 11:41:04 · 1735 阅读 · 0 评论 -
实现几个字符串的字典序排序
编写程序对用户数据进行简单的管理,要求按姓名的字典序对用户信息进行排序。试定义表示用户信息的类person和处理用户信息的类compute实现上述功能。具体要求如下:(1)定义类person,其成员如下:(a)私有成员。char name[10], num[10]:分别保存用户的姓名和电话号码。(2)定义类compute,类compute必须声明为类person的友元类,其成员如下原创 2012-10-29 11:47:53 · 2724 阅读 · 0 评论 -
败者树 K-路归并排序
外部排序指的是大文件的排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存,需要在内存和外部存储器之间进行多次数据交换,以达到排序整个文件的目的。外部排序最常用的算法是多路归并排序,即将原文件分解成多个能够一次性装入内存的部分,分别把每一部分调入内存完成排序。然后,对已经排序的子文件进行多路归并排序。 多路归并排序算法在常见数据结构书中都有涉及。从2路到多路(k路),增原创 2012-11-19 11:32:48 · 901 阅读 · 0 评论 -
判断一棵树是否是BST
很多面试都会问到这样一个问题:给定一个二叉树,判断它是否是二叉查询树。思路:要判断是否是二叉查询树,标准就是看每一个节点是否满足:1、左节点及以下节点的值比它小;2、右节点及以下节点的值比它大。当然,前提是子节点都存在的情况。所以,我们需要从根节点不断向下递归,只要所有节点都满足,那么就是BST,否则,就不是。代码:[java] view原创 2012-11-18 16:21:47 · 1062 阅读 · 0 评论 -
折半查找法的两种实现
前言:刚有人问我一个题扯到了折半查找法,于是我做了下,发现有两种方法可以实现。正文:在有序表中,把待查找数据值与查找范围的中间元素值进行比较,会有三种情况出现:1) 待查找数据值与中间元素值正好相等,则放回中间元素值的索引。2) 待查找数据值比中间元素值小,则以整个查找范围的前半部分作为新的查找范围,执行1),直到找到相等的值。3)原创 2012-10-28 20:10:53 · 851 阅读 · 0 评论 -
折半查找法
折半查找法是效率较高的一种查找方法。假设有已经按照从小到大的顺序排列好的五个整数a0~a4,要查找的数是X,其基本思想是: 设查找数据的范围下限为l=1,上限为h=5,求中点m=(l+h)/2,用X与中点元素am比较,若X等于am,即找到,停止查找;否则,若X大于am,替换下限l=m+1,到下半段继续查找;若X小于am,换上限h=m-1,到上半段继续查找;如此重复前面的过程直到找到或者l>h为止。原创 2012-10-28 19:00:34 · 1703 阅读 · 0 评论 -
用贪心法求解背包问题
贪心方法:总是对当前的问题作最好的选择,也就是局部寻优。最后得到整体最优。应用:1:该问题可以通过“局部寻优”逐步过渡到“整体最优”,这是贪心选择性质与“动态规划”的主要差别。2:最优子结构性质:某个问题的整体最优解包含了“子”问题的最优解。完整的代码如下:[cpp] view plaincopyprint?#include "iostream" usi转载 2012-10-28 16:13:43 · 2473 阅读 · 0 评论 -
快速排序、希尔排序、插入排序、选择排序、归并排序、堆排序总结
一、快速排序的基本思想 设当前待排序的无序区为R[low..high],利用分治法可将快速排序的基本思想描述为:①分解: 在R[low..high]中任选一个记录作为基准(Pivot),以此基准将当前无序区划分为左、右两个较小的子区间R[low..pivotpos-1)和R[pivotpos+1..high],并使左边子区间中所有记录的关键字均小于等于基准记录(不妨记原创 2012-10-29 11:45:38 · 654 阅读 · 1 评论 -
用指向指针方法对N个字符串进行排序并输出
C++语言版本的:#include "iostream"#include "string"#include "algorithm"using namespace std;bool cmp(string &a, string &b){ return a<b;}int main(void){ int n,i; string *str; cout<原创 2012-10-29 11:42:58 · 1746 阅读 · 0 评论 -
魔王语言解释
[问题描述] 有一个魔王总是使用自己的一种非常精练而又抽象的语言讲话,没有人能听得懂,但他的语言是可以逐步解释成人能听懂的语言,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的:(1) α -> β1β2…βm (2)(θδ1δ2…δn)->θδnθδn-1… θδ1θ 在这两种形式中,从左到右均表示解释。试写一个魔王语言的解释系统,把他的话解释成人能听得懂的话。转载 2012-10-29 11:37:22 · 1912 阅读 · 0 评论 -
选择排序法
选择排序的基本思想是:每一趟在n-i+1(i=1,2,…n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录。我们主要介绍简单选择排序、树型选择排序和堆排序。 简单选择排序的基本思想:第i趟简单选择排序是指通过n-i次关键字的比较,从n-i+1个记录中选出关键字最小的记录,并和第i个记录进行交换。共需进行i-1趟比较,直到所有记录排序完成为止。例如:进行第i趟选择时,从当前原创 2012-10-28 19:08:37 · 832 阅读 · 0 评论 -
单链表的快速排序
单链表的快排序和数组的快排序基本思想相同,同样是基于划分,但是又有很大的不同:单链表不支持基于下标的访问。故书中把待排序的链表拆分为2个子链表。为了简单起见,选择链表的第一个节点作为基准,然后进行比较,比基准小得节点放入左面的子链表,比基准大的放入右边的子链表。在对待排序链表扫描一遍之后,左边子链表的节点值都小于基准的值,右边子链表的值都大于基准的值,然后把基准插入到链表中,并作为连接两个子链表的转载 2012-10-27 15:51:13 · 575 阅读 · 0 评论 -
歌厅歌曲管理系统
系统功能:该系统以菜单方式工作,歌曲信息包括:歌名、演唱者、作词、作曲、所属专辑、出版时间、出版公司。试设计一歌厅歌曲管理系统,使之能提供以下功能:歌曲信息录入、修改、插入、删除功能;歌曲排序浏览功能;按歌名查询、按演唱者查询等功能。完整的实现代码如下:[cpp:firstline[0]] view plaincopyprint?#include "stdio.转载 2012-10-27 12:46:21 · 1833 阅读 · 0 评论 -
快速判断 .
1、 快速判断一个数是否是4的幂次方,若是,并判断出来是多少次方! 将4的幂次方写成二进制形式后,很容易就会发现有一个特点:二进制中只有一个1(1在奇数位置),并且1后面跟了偶数个0; 因此问题可以转化为判断1后面是否跟了偶数个0就可以了。 4的整数次幂的二进制数都为 (4)100、(16)10000、(64)1000000......转载 2012-10-27 12:19:01 · 489 阅读 · 0 评论 -
维基百科上的算法和数据结构链接很强大
突然发现维基百科上的算法和数据结构比百度百科强多啦,图文并茂。其实这个网站不错:http://www.sorting-algorithms.com冒泡排序:bubble冒泡的意思http://zh.wikipedia.org/wiki/%E5%86%92%E6%B3%A1%E6%8E%92%E5%BA%8F ---------------------------------转载 2012-10-23 09:05:27 · 1072 阅读 · 0 评论 -
字符串匹配(string matching)算法之一 (Naive and Rabin_Karp)
字符串匹配(String matching)问题的形式定义: 假设文本(Text)是一个长度为n的数组T[1…n], 模式(Pattern)是一个长度为m ≤ n.的数组P[1..m];. 又假设P和T中的元素都属于有限字母表Σ 中的字符。 P和T常称为字符串。如果0 ≤ s ≤ n – m 且T[s+1..s+m]=P[1…m], 则说P在T中出现且位移为s,此时成s为一个有效位移。转载 2012-10-31 21:16:24 · 748 阅读 · 0 评论 -
MFC中一个链表的实现
#include "stdafx.h" #include #include #include using namespace std; //MFC中链表的实现 class CMySimpleList { public: CMySimpleList(int nNextOffset = 0); void Construct(int nNextOf转载 2012-10-30 09:38:46 · 2458 阅读 · 0 评论 -
最长公共子串
数据结构课程设计,由用户输入两个字符串串X和Y,再由用户输入一个任意的字符串Z,实现以下功能:①如果字符串Z是字符串X的子串,则显示Z在X中的位置并记录,如果字符串Z是字符串Y的子串,则显示Z在Y中的位置并记录,如果Z既不是X的子串也不是Y的子串,则显示不匹配。②找出X和Y的一个最长公共子串。③置换: 用户输入任意的字符串去置换X和Y中的子串Z。 思想:首先使用Kmp算法进行匹配,原创 2012-10-29 11:46:47 · 430 阅读 · 0 评论 -
链表各类操作详解
链表概述 链表是一种常见的重要的数据结构。它是动态地进行存储分配的一种结构。它可以根据需要开辟内存单元。链表有一个“头指针”变量,以head表示,它存放一个地址。该地址指向一个元素。链表中每一个元素称为“结点”,每个结点都应包括两个部分:一为用户需要用的实际数据,二为下一个结点的地址。因此,head指向第一个元素:第一个元素又指向第二个元素;……,直到最后一个元素,该元素不再指向其它元素,转载 2012-10-29 11:36:38 · 673 阅读 · 0 评论 -
判断给定的二叉树是否为二叉排序树
思路:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉排序树。递归遍历就可以了,反正就是左孩子的key比根节点的key小,右孩子的key比根节点的key大,一旦有不满足条件的就判定不是。完整的代码如下:#include "stdio.h"#include "stdl原创 2012-10-29 11:49:55 · 865 阅读 · 0 评论 -
基数排序
一、基数排序的基本思想:排序过程无须比较关键字,而是通过“分配”和“收集”过程来实现排序。它们的时间复杂度可达到线性阶:O(n)。二、最高位优先(Most Significant Digit first)法,简称MSD法:先按k1排序分组,同一组中记录,关键码k1相等,再对各组按k2排序分成子组,之后,对后面的关键码继续这样的排序分组,直到按最次位关键码kd对各子组排序后。再将各组连接起来,便转载 2012-10-29 11:48:56 · 473 阅读 · 0 评论 -
数组中求第K大数
问题:有一个大小为n的数组A[0,1,2,…,n-1],求其中第k大的数。该问题是一个经典的问题,在《算法导论》中被作为单独的一节提出,而且其解决方法很好的利用了分治的思想,将时间复杂度控制在了O(n),这多少出乎我们的意料,此处暂且不表。该问题还可以变形为:有一个大小为 n的数组A[0,1,2,…,n-1],求其中前k大的数。一字之差,原问题是“第k大”,变形的问题是“前k大”,但是转载 2012-10-29 11:31:01 · 1055 阅读 · 0 评论 -
N皇后问题的两个最高效的算法
N皇后问题是一个经典的问题,在一个N*N的棋盘上放置N个皇后,每行一个并使其不能互相攻击(同一行、同一列、同一斜线上的皇后都会自动攻击)。一、 求解N皇后问题是算法中回溯法应用的一个经典案例 回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。 在现实中,有很多问题往往需要我们把其所有转载 2012-10-29 11:28:15 · 1173 阅读 · 0 评论 -
排序 : 3 选择排序
3 选择排序a 直接选择排序//选择排序 for(int i=0;i int min=i; for(int j=i+1;j if(ints[j] min=j; } } int temp;//把最小的元素交换到相应位置 temp=ints; ints=ints[min]; ints[min]=t转载 2012-10-15 13:46:05 · 512 阅读 · 0 评论 -
排序 : 2 插入排序
2 插入排序a直接插入排序直接插入排序(Straight Insertion Sorting)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程 中每次从无序表中取出第一个元素,将它插入到有序表中的适当位置,使之成为新的有序表,重复n-1次可完成排序过程。把a[i]插入到a[0],a[1],...,a转载 2012-10-14 18:59:29 · 418 阅读 · 0 评论 -
海量数据处理
1、 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?方案1:可以估计每个文件安的大小为50G×64=320G,远远大于内存限制的4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。s 遍历文件a,对每个url求取,然后根据所取得的值将url分别存储到1000个小文件(记为)中。这样每个小文件的大约为300M。转载 2012-10-23 09:13:51 · 744 阅读 · 0 评论 -
一致性哈希算法以及其PHP实现
在做服务器负载均衡时候可供选择的负载均衡的算法有很多,包括: 轮循算法(Round Robin)、哈希算法(HASH)、最少连接算法(Least Connection)、响应速度算法(Response Time)、加权法(Weighted )等。其中哈希算法是最为常用的算法. 典型的应用场景是: 有N台服务器提供缓存服务,需要对服务器进行负载均衡,将请求平均分发到每台服务器上,每转载 2012-10-23 09:29:08 · 493 阅读 · 0 评论 -
C++中关于二维数组作为函数参数传递的问题
在做数据结构迷宫实验的时候,要生成一个二维数组存储迷宫数据,为了保证程序的模块化,将生成部分单独放进一个函数migongsc()里。大致代码如下: 问题的关键就集中在了如何将主函数中声明的二维数组migong[8][9]传递到自定义函数中去。 耗费了一个晚上的时间,我总共整理出了三种办法: 方法1:模拟编译器寻址(本法来原创 2012-11-03 11:03:23 · 2201 阅读 · 0 评论