回溯算法
摘要:1.八皇后问题 在n*n格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规矩,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于在n*n格的棋盘上方置n个皇后,任何2个皇后不放在同一行或同一列或同一斜线上。我们需要求的是可放置的总数。 基本思路: 用一个数组X[1]到X[n]来
阅读全文
Rabin-Karp指纹字符串查找算法
摘要:首先计算模式字符串的散列函数, 如果找到一个和模式字符串散列值相同的子字符串, 那么继续验证两者是否匹配. 这个过程等价于将模式保存在一个散列表中, 然后在文本中的所有子字符串查找. 但不需要为散列表预留任何空间, 因为它只有一个元素. 基本思想 长度为M的字符串对应着一个R进制的M位数, 为了用一
阅读全文
优先队列
摘要:支持两种操作: 删除最大元素和插入元素, 这种数据结构叫做优先队列. 当一棵二叉树的每个节点都大于等于它的两个子节点时, 它被成为堆有序. 二叉堆是一组能够用堆有序的完全二叉树排序的元素, 并在数组中按照层级储存(不使用数组中的第一个位置). 堆的算法 用长度为N+1的pq[]来表示一个大小为N的堆
阅读全文
快速排序
摘要:快速排序比一般的排序算法都要快,它是原地排序(只需要一个很小的辅助数组),且将长度为N的数组排序所需的时间与NlgN成正比. 基本算法 快速排序也是一种分治算法,它将一个数组分成两部分分别排序,它和归并排序是互补的. 归并排序是将一个数组分成两个子数组分别排序,并将有序子数组归并以将整个数组排序;而
阅读全文
归并排序
摘要:归并排序:要将一个数组排序,可以先(递归的)将它分成两半分别排序,然后将结果归并起来得到一个有序数组,它最吸引人的地方是能够保证将任意长度为N的数组排序所需的时间复杂度和NlogN成正比. 原地归并排序 实现归并排序简单粗暴的办法是创建一个新数组,然后将两个有序输入数组的按照大小一个个从小到大放进这
阅读全文
初级排序算法
摘要:我们关注的主要对象是重新排列数组元素的算法,其中每一个元素都有一个主键.排序算法的目标是将所有的主键按某种方式排列.排序后索引较大的元素大于等于索引较小的元素主键. 在java中,元素通常是对象,对主键的抽象描述则是通过一种内置的机制来完成的. 下面是排序算法类模版 我们实现CompareTo接口保
阅读全文
并查集(union-find)算法
摘要:动态连通性 、 假设程序读入一个整数对p q,如果所有已知的所有整数对都不能说明p和q是相连的,那么将这一整数对写到输出中,如果已知的数据可以说明p和q是相连的,那么程序忽略p q继续读入下一整数对. 为了实现这个效果,我们设计并查集这种数据结构来保存程序已知的所有整数对的足够多的信息,并用它们来判
阅读全文
Dijkstra的双栈算术表达式的求值算法
摘要:例如需要计算 ( 1 + ( ( 2 + 3 ) * ( 4 * 5 ) ) ) 我们以字符串的形式输入该表达式,利用两个栈来完成这个操作,其中一个栈保存运算符,一个栈保存操作数,过程是这样的: 表达式由括号,运算符号,操作数(数字)组成,从左到右处理这四种情况. 将操作数压入操作数栈. 将运算符压
阅读全文
无向图的深度优先搜索和广度优先搜索
摘要:图的定义:由一组顶点和一组能够将两个顶点相连的边组成的数据结构. 图的常用表示方法 邻接矩阵:使用矩阵表示,当顶点v和w连接在一起时,就把v行w列定义为true,否则为false,但大量数据时所需空间不能满足. 边的数组:使用一个Edge类,含有两个变量,对应边上的顶点. 邻接表数组:以顶点为索引的
阅读全文
散列表简介
摘要:散列表也叫哈希表,是一种根据关键字直接访问内存存储位置的数据结构,它是用一个数组实现的无序符号表.将键作为数组的索引而数组中键i处存储的就是它对应的值,这样就可以实现快速访问任意键的值.散列表是算法在时间和空间上做出权衡的经典例子. 散列表的查找算法分为两步: 1.用散列函数将键转化为数组索引,可能
阅读全文
顺序表的基本操作
摘要:#include#define MAXSIZE 100//顺序表的结果定义typedef struct{ int data[MAXSIZE]; int num;}SeqList; //建立顺序表void CreateSeqList(SeqList *S){ S->num = 0;}...
阅读全文
单链表的基本操作
摘要:链表是一种递归的数据结构,它或者为空,或者指向一个和节点的引用,该节点包含一个元素和一个指向另一条链表的引用.链表可以作为数组的一种重要替代. 我们用一个嵌套类来定义节点的抽象数据类型 其中Item表示数据变量,Node表示节点变量. 接下来我们就可以构造链表了,首先创造节点 然后为每个节点赋值,设
阅读全文
基本数据结构,二叉排序树
摘要:1.首先是二叉排序树的结构定义,一个数据域,另外两个是指针域,一个指向左孩子,另外一个指向右孩子。//二叉排序树的结构定义 typedef struct Node{ int data; struct Node *lchild,*rchild;}TreeNode,*BSTree;2.在二叉...
阅读全文
基本数据结构,循环队列的顺序实现。
摘要:队列是一种先进先出的数据结构,这里用顺序结构将其实现。 1.首先用结构体定义一个队列,front指向队首元素的前面一位,real指向队尾元素。 2.创建一个循环队列,初始化令front=real=0,因为当队列满时也有front=real,此时无法判断队满;所以我们弃置一个元素位不用,其位置随机,所
阅读全文
栈的基本操作
摘要:栈是一种基于后进先出(LIFO)策略的集合类型,例如上网点击超链接浏览器会跳到另一个页面(将它压入栈中),点击后退可以回到以前的页面(从栈中弹出),栈的后进先出策略正好提供了这种所需要的行为.当遍历栈中的元素时,元素的处理顺序和它们被压入的顺序正好相反. 定容栈 实现起来比较简单,它指定了栈的容量大
阅读全文