自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(48)
  • 收藏
  • 关注

原创 水王问题

/* *问题:“水王”的帖子超过论坛帖子的一半,如何从所有帖子中,找出“水王”的ID(每个帖子都包含了作者的ID)? *思路:把问题转化为如何在一个长度为N的无序数组中,找出出现次数超过一半的数? *解法1:先将数组中N个数字排序,再统计每个数字出现的次数,出现次数超过一半的数就是我们要找的数,时间复杂度是O(N*logN + N)。 *解法2:因为所找数字出现的次数超过一半,所以将数组中

2014-03-11 15:13:09 477

原创 N!最低位1的位置

/* *问题:正整数N的阶乘是N!,求N!的二进制数的最低位1的位置 *思路:求最低位1的位置 => 最低位1的位置=N!的二进制数的结尾0的个数 + 1 => N!的二进制数的结尾0的个数=N!中因数2的个数 *解法:N!中质因数2的个数 = N/2 + N/(2x2) + N/(2x2x2) + ... */#include int count(N){ int num = 0

2014-03-11 15:12:34 639

原创 N!结尾有多少个0

/**问题:正整数N的阶乘是N!,求N!的结尾0的个数*思路:不能先求N!的值,再求N!的结尾0的个数,因为N!可能非常大。 N!的结尾0的个数 => N!中因数10的个数 => 10=2x5,因数2的个数总是多于5 => N!中质因数5的个数*解法1:遍历1~N,累计每个数中因数5的个数*解法2:N!中质因数5的个数 = N/5 + N/(5x5) + N/(5x5x5) + .

2014-03-11 15:11:44 573

原创 二叉查找树转换为有序双向链表

将二叉排序树转换为有序的双向链表,只需调整结点的指针位置。见代码#include #include #define TRUE 1#define FALSE 0typedef int Status;typedef struct BSTNode{ int data; struct BSTNode *left, *right;} BSTNode, *BSTree;/**在

2014-03-10 13:08:34 583

原创 求二进制数中1的个数

有一个八位的二进制数,求该二进制数中1的个数。1、如果该二进制是无符号的,该怎么做?有三种方法,见代码注释。2、如果该二进制是有符号的,该怎么做?如果是有符号的,想办法把有符号二进制数转换为相应的无符号二进制数。使用java的byte类型来表示该二进制数,但是由于java的byte类型是带符号的。如何把signed byte转换为unsigned byte呢?通过与0xFF

2014-03-09 15:29:20 551

原创 二叉排序树

二叉排序树:又称为二叉查找树。它或者是一棵空树,或者是具有下列性质的二叉树。1、若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值。2、若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值。3、它的左、右子树也分别为二叉排序树。为什么需要二叉排序树?构造一棵二叉排序树的目的,其实并不是为了排序,而是为了提高查找和插入删除关键字的速度。二叉排序树

2014-02-27 22:14:37 504

原创 平衡二叉树

为什么需要平衡二叉树?不平衡的二叉排序树的查找效率是非常低的,不平衡的最坏情况就是斜树,查找的时间复杂度是O(n),等同于顺序查找。因此我们在构建时就让这棵二叉排序树是平衡二叉树,此时的查找时间复杂度是O(logn),插入和删除也为O(logn),这显然是一种比较理想的动态查找表算法。平衡二叉树:是一种二叉排序树,其中每一个节点的左子树和右子树的高度差至多等于1。它是一种高度平衡的二叉

2014-02-27 19:21:42 692

原创 散列表(哈希表)

散列技术:散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对于一个存储位置f(key)。查找时,根据这个确定的对应关系找到给定值key的映射f(key),若查找集合中存在这个记录,则必定在f(key)的位置上。通过查找关键字不需要比较就可以获得需要的记录的存储位置。散列函数:这里我们把这种对应关系f称为散列函数,又称为哈希函数。散列表(哈希表):采用

2014-02-27 11:04:14 949

原创 UML类图

UML是Unified Modeling Language的缩写,统一建模语言。UML为面向对象开发系统的产品进行说明、可视化和编制文档的一种标准语言。UML类图:类图是一个矩形框,分为三层,第一层显示类的名称,如果是抽象类,则用斜体显示。第二层是类的特性,通常就是字段和属性。第三层就是类的操作,通常是方法或行为。前面的符号,“+”表示public,“-”表示private,“#”表示pr

2014-02-25 23:16:51 872

原创 简单工厂模式

简单工厂模式的优点:让对象的调用者和对象创建过程分离,当对象调用者需要对象时,直接向工厂请求即可。从而避免了对象的调用者和对象的实现类以硬编码方式耦合,以提高系统的可维护性、可扩展性。简单工厂模式的缺陷:当产品修改时,工厂类也要做相应的修改。public class Operation { public double number1; public double number2

2014-02-25 21:20:58 455

原创 快速排序

快速排序的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。快速排序算法的时间复杂度为O(nlogn)。由于关键字的比较和交换是跳跃进行的,因此,快速排序是一种不稳定的排序方法。void QuickSort(SqList *L){ QSort(L, 1, L->length);

2014-02-19 21:11:30 642

原创 归并排序

归并排序的原理是假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到int(n/2)个长度为2或1的有序子序列;再两两归并,……,如此重复,直至得到一个长度为n的有序序列为止,这种排序方法称为2路归并排序。void MergeSort(SqList *L){ MSort(L->r, L->r, 1, L->length);}void MSo

2014-02-19 18:02:04 579

原创 堆排序

堆是具有下列性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或者等于其左右孩子结点的值,称为小顶堆。堆数组“:把大顶堆或小顶堆用层序遍历存入数组。堆排序就是利用对(假设利用大顶堆)进行排序的方法。它的基本思想是,将待排序的序列构造成一个大顶堆。此时,整个序列的最大值就是堆顶的根结点。将它移走(其实就是将其与堆数组的末尾元素交换,此时末尾元素就

2014-02-19 16:07:27 456

原创 希尔排序

希尔排序是插入排序的一种,是针对直接插入排序算法的改进,该方法又称为缩小增量排序。希尔排序的基本思想:先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个小组。所有距离为d1的倍数的记录放在同一组中。先在各组内进行直接插入排序;然后,取第二个增量d2需要注意的是,增量排序的最后一个增量值必须等于1才行。另外由于记录是跳跃式移动,希尔排序并不是一种稳定的排序算法。void

2014-02-19 14:15:45 590

原创 直接插入排序

直接插入排序的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的,纪录数增1的有序表。void InsertSort(SqList *L){ int i, j; for (i = 2; i length; i++) if (L->r[i] r[i-1]) { L->r[0] = L->r[i]; for (j = i - 1; L->r[j] > L->

2014-02-18 18:20:40 443

原创 简单选择排序

简单选择排序算法:就是通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和i(1void SelectSort(SqList *L){ int i, j, min; for (i = 1; i length; i++) { min = i; for (j = i + 1; j length; j++) if (L->r[min] > L->r[j])

2014-02-18 15:47:52 520

原创 冒泡排序

冒泡排序是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。最简单的排序实现:void BubbleSort0(SqList *L){ int i, j; for (i = 1; i length; i++) for (j = i + 1; j length; j++) if (L->r[i] > L->r[j]) sw

2014-02-18 15:31:55 487

原创 排序的相关概念

排序:假设含有n个记录的序列为{r1, r2, ……, rn},其相应的关键字分别为{k1, k2, ……, kn},需确定1,2,……, n的一种排列p1, p2……, pn,使其相应的关键字满足kp1多个关键字排序最终都可以转化为单个关键字的排序。下面讨论的是单个关键字的排序。排序的稳定性:假设ki=kj(1内排序与外排序:内排序是在排序整个过程中,待排序的所有记录全部被放置在

2014-02-18 14:14:25 513

原创 线性索引查找

索引就是把一个关键字与它对应的记录相关联的过程。一个索引由若干个索引项构成,每个索引项至少应包含关键字和其对应的记录在存储器中的位置等信息。索引技术是组织大型数据库以及磁盘文件的一种重要技术。索引按照结构可以分为线性索引、树形索引和多级索引。线性索引就是把索引项集合组织为线性结构,也称为索引表。这里介绍三种线性索引:稠密索引、分块索引、倒排索引稠密索引:稠密索引是指在线性索引中

2014-02-12 16:28:40 651

原创 有序表查找

折半查找:折半查找技术,又称为二分查找。它的前提是线性表中的记录必须是关键码有序(通常从小到大排序),线性表必须采用顺序存储。折半查找的基本思想是:在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功;若给定值小于中间记录的关键字,则在中间记录的左半区继续查找;若给定值大于中间记录的关键字,则在中间记录的右半区继续查找。不断重复上述过程,直到查找成功,或所有查找区域无

2014-02-11 18:58:31 742

原创 顺序查找

顺序查找又叫线性查找,是最基本的查找技术,它的查找过程是:从表中第一个(或最后一个)记录开始,逐个进行记录的关键字和给定值的比较,若某个记录的关键字和给定值相等,则查找成功,找到所查的记录;如果直到最后一个(或第一个)记录,其关键字和给定值比较都不等时,则表中没有所查的记录,查找不成功。顺序查找的算法实现:时间复杂度为O(n)int Sequential_Search(int *a, in

2014-02-11 18:42:12 535

原创 查找的相关概念

查找表是由同一类型的数据元素(或记录)构成的集合。关键字是数据元素中某个数据项的值,又称为键值,用它可以标识一个数据元素。也可以标识一个记录的某个数据项,我们称为关键码。若此关键字可以唯一地标识一个记录,则称此关键字为主关键字。对于不同的记录,其主关键字均不同。主关键字所在的数据项称为主关键码。对于那些可以识别多个数据元素(或记录)的关键字,我们称为次关键字。它对应的数据项就是次关键码

2014-02-11 18:32:46 683

原创 关键路径

AOE网:在一个表示工程的带权有向图中,用顶点表示事件,用有向边表示活动,用边上的权值表示活动的持续时间,这种有向图的边表示活动的网,我们称之为AOE网。把路径上各个活动所持续的时间之和称为路径长度,从源点到汇点具有最大长度的路径称为关键路径,在关键路径上的活动叫关键活动。关键路径算法:我们需要定义如下几个参数:1、事件的最早发生时间etv:即顶点v的最早发生时间。2、事件的最

2014-02-10 17:01:00 656

原创 拓扑排序

AOV网:在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,我们称为AOV网。拓扑序列:设G={V, E}是具有n个顶点的有向图,V中的顶点序列v1, v2, ……vn,满足若从顶点vi到vj有一条路径,,则在顶点序列中顶点vi必须在顶点vj之前,则我们称这样顶点序列为一个拓扑序列。拓扑排序:所谓拓扑排序,其实就是对一个有向图构造拓扑序列

2014-02-10 15:50:53 556

原创 最短路径

对于网图来说,最短路径是指两顶点之间经过的边上权值之和最少的路径,并且我们称路径上的第一个顶点是源点,最后一个顶点是终点。迪杰斯特拉算法:解决了从某个源点到其余各顶点的最短路径问题。此算法的时间复杂度是O(NxN)。#define MAXVEX 9#define INFINITY 65535typedef int Patharc[MAXVEX];typedef int S

2014-02-10 13:12:37 577

原创 最小生成树

最小生成树:我们把构造连通网的最小代价生成树称为最小生成树。普里姆算法:假设N = {V, E}是连通网,TE是N上最小生成树中边的集合。算法从U={u0}(u0∈V),TE={}开始。重复执行下述操作:在所有u∈U,v∈V-U的边(u, v)∈E中找代价最小的边(u0, v0)并入集合TE,同时v0并入U,直至U=V为止。此时TE中必有n-1条边,则T={V, TE}为N的最小生

2014-02-09 21:22:02 516

原创 图的遍历

深度优先遍历深度优先遍历,也有称为深度优先搜索,简称为DFS。它从图中某个顶点v出发,访问此顶点,然后从v的未被访问的邻接点出发深度优先遍历图,直至图中所有和v有路径相通的顶点都被访问了。若图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作起始点,重复上述过程,直至图中所以顶点都被访问到为止。对于n个顶点e条边的图来说,邻接矩阵的时间是复杂度是O(NxN),邻接表的时间复杂度是O(n+

2014-02-07 19:45:56 581

原创 图的五种存储结构

图是由顶点和边或弧两部分来组成,所以分两个结构来分别存储。1、邻接矩阵图的邻接矩阵存储方式是用两个数组来表示图。一个一维数组存储图中顶点信息,一个二维数组(称为邻接矩阵)存储图中的边或弧的信息。无向图的边数组是一个对称矩阵。有了这个矩阵,我们就可以知道无向图的信息:(1)要判断任意两个顶点是否有边无边,只需要查找arc[i][j]或arc[j][i]是否为1即可。(2)要知道某

2014-02-07 16:44:53 2451

原创 图的相关概念

图是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。(1)线性表中我们把数据元素叫做元素,树种把数据元素叫做结点,在图中数据元素,我们则称之为顶点。(2)线性表中可以没有数据元素,称为空表。树中可以没有结点,叫做空树。在图结构中,不允许没有顶点。(3)线性表中,相邻的数据元素之间具有线性关系。树结构中,相

2014-02-05 14:20:43 719

原创 赫夫曼树

从树中一个结点到另一个结点之间的分支构成两个结点之间的路径,路径上的分支数目称做路径长度。树的路径长度就是从树根到每一个结点的路径长度之和。结点的带权路径长度为从该结点到树根之间的路径长度与结点上权的乘积。树的带权路径长度为树中所以叶子结点的带权路径长度之和。带权路径长度WPL最小的二叉树称做赫夫曼树,也称最优二叉树。构造赫夫曼树:(1)根据给定的n个权值{w1,

2014-02-04 19:32:53 822

原创 树、森林和二叉树的转换

1、树转换为二叉树(1)加线。在所有兄弟结点之间加一条连线。(2)去线。对树中每个结点,只保留它与第一个孩子结点的连线,删除它与其他孩子结点之间的连线。(3)层次调整。以树的根结点为轴心,将整棵树顺时针旋转一定的角度,使之结构层次分明。注意第一个孩子是二叉树的左孩子,兄弟转换过来的孩子是结点的右孩子。2、森林转换为二叉树森林是由若干棵树组成的,可以理解为,森林中的每一棵

2014-02-04 19:02:09 755

原创 线索二叉树

线索二叉树:对于一个有n个结点的二叉链表,每个结点有指向左右孩子的两个指针域,所以一共是2n个指针域。而n个结点的二叉树一共有n-1条分支线,也就是说存在n+1个空指针域。我们可以考虑利用那些空地址,存放指向结点在某种遍历次序下的前驱和后继结点的地址。我们把这种指向前驱和后继的指针称为线索,加上线索的二叉链表称为线索链表,相应的二叉树就称为线索二叉树。我们对二叉树以某种次序遍历使其

2014-02-04 18:12:03 780

原创 二叉树的存储、遍历、建立

二叉树的存储:1、顺序存储:对于一般的二叉树,添加一些空结点,使之成为完全二叉树的形式。按照完全二叉树2、二叉链表:

2014-02-04 14:17:10 878

原创 二叉树的相关概念

二叉树:二叉树是n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的,分别称为根结点的左子树和右子树的二叉树组成。二叉树的特点:1、每个结点最多有两棵子树,所以二叉树中不存在度大于2的结点。注意,不是只有两棵子树,而是最多有。没有子树或者有有一颗子树都是可以的。2、左子树和右子树是有顺序的,次序不能任意颠倒。即使树中某结点只有一棵子

2014-02-02 16:51:00 633

原创 树的存储结构

1、双亲表示法以一组连续空间存储树的结点,同时在每个结点中,附设一个指示器指示其双亲结点在数组中的位置。其中data是数据域,存储结点的数据信息。parent是指针域,存储该结点的双亲在数组中的下标。# define MAX_TREE_SIZE 100typedef int TElemType;typedef struct PTNode{ TElemType data; int

2014-02-02 15:33:18 526

原创 树的相关概念

树:树是n(n >= 0)个结点的有限集。n=0时称为空树。在任意一棵非空树中:(1)有且只有一个特别的称为根的结点;(2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2, T3,......,Tm,其中每一个集合本身又是一棵树,并且成为根的子树。结点:1、树的结点包含一个数据元素以及若干指向其子树的分支。2、结点的度:结点拥有的子树数称为结点的度。

2014-02-02 00:05:59 432

原创

串是由零个或多个字符组成的有限序列,又称为字符串。串中的字符数目称为串的长度。零个字符的串称为空串,它的长度为零。空格串,是只包含空格的串。空格串是有内容有长度的,而且可以不止是一个空格。子串与主串,串中任意个数的连续字符组成的子序列称为该串的子串,相应地,包含子串的串称为主串。子串在主串中的位置就是子串的第一个字符在主串中的序号。串的比较是通过组成串的字符之间的编码来进行

2014-02-01 21:40:03 577

原创 栈的应用

栈的应用1--递归把一个直接调用自己或通过一系列的调用语句间接地调用自己的函数,称做递归函数。写递归最怕的就是陷入永不结束的无穷递归中,所以,每个递归定义必须至少有一个条件,满足时递归不再进行,即不再引用自身而是返回值退出。迭代和递归的区别是:迭代使用的是循环结构,递归使用的是选择结构。递归能是程序的结构更清晰,更简洁,更容易让人容易理解,从而减少读懂代码的时间。但是大量的递归调用会建

2014-01-30 22:53:17 499

原创

栈是限定仅在表尾进行插入和删除操作的线性表。允许插入和删除的一端称为栈顶,另一端称为栈底,不含任何数据元素的栈称为空栈。栈又称为后进先出的线性表,简称LIFO结构。栈的插入操作,叫做进栈,也称压栈,入栈。栈的删除操作,叫做出栈,也称弹栈。最先进栈的元素是不是只能是最后出栈?答案是不一定!栈的顺序存储结构数组下标为0的一端作为栈底,定义top变量来指示栈顶元素在数组中

2014-01-30 20:06:38 432

原创 队列

队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。队列是一种先进先出的线性表,简称FIFO。允许插入的一端称为队尾,允许删除的一端称为队头。队列可按存储结构分为顺序队列和链队列。我们把头尾相接的顺序存储结构称为循环队列。font指针指向队头元素,rear指向队尾元素的下一个位置。队列长度:(rear - font + MAXSIZE) % MAXSIZE

2014-01-30 18:26:08 460

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除