算法和数据结构
文章平均质量分 81
fan_rockrock
程序人生
展开
-
查找(3)--哈希表(散列查找)
一.基本概念: 1. 哈希查找(散列查找),与前面介绍的静态查找和动态查找方法完全不同,前面介绍的所有查找都是基于待查关键字与表中元素进行比较而实现的查找方法,而散列查找是通过构造哈希函数来得到待查关键字的地址,按理论分析真正不需要用到比较的一种查找方法。 2.哈希表定义:根据设定的哈希函数 H(key) 和所选中的处理冲突的方法,将一组关键字映原创 2014-02-22 00:01:07 · 3359 阅读 · 0 评论 -
树(1)--树和二叉树的基本定义
一:树1.树的表示方式:(1)图形表示法(分支图表示法)(2)嵌套集合表示法 (3)广义表表示法( A ( B ( E ,F( K, L ), ), C ( G ), D ( H , I, J ) )(4)目录表示法(5)左孩子-右兄弟表示法2.树结构与线性结构的比较: 线性结构:第一个结点无前驱,最后一个结点无后继,其他原创 2014-02-14 22:58:32 · 1099 阅读 · 0 评论 -
树(3)--树和森林
一:树的存储结构1.双亲表示法: 每个节点都存储它的双亲结点的位置:#define MAX_TREE_SIZE 100 typedef struct PTNode { //结点结构 Elem data; int parent; // 双亲位置域} PTNode;typedef struct { //树结构 PTNode no原创 2014-02-17 14:19:15 · 1446 阅读 · 0 评论 -
树(4)--赫夫曼树及其应用
一:基本概念:1.路径:由一结点到另一结点间的分支所构成2.路径长度:路径上的分支数(A->E=2)3.树的路径长度:从树根到每一结点的路径长度之和=104.结点带权路径长度:结点到根的路径长度与结点上权的乘积 F的带权路径长度WPL=9*2=18原创 2014-02-17 22:08:07 · 1347 阅读 · 0 评论 -
图(2)--图的遍历和图的连通性
一:图的遍历 1.概念: 从图中某一顶点出发访遍图中其余顶点,且使每一个顶点仅被访问一次(图的遍历算法是求解图的连通性问题、拓扑排序和求关键路径等算法的基础。) 2.深度优先搜索(DFS) 1).基本思想: (1)在访问图中某一起始顶点 v 后,由 v 出发,访问它的任一邻接顶点 w1;原创 2014-02-19 12:34:35 · 4592 阅读 · 0 评论 -
图(1)--图的相关术语与图的存储结构
一:图的基本术语: 1.无向图:图G中的每条边都是无方向的 2.有向图:图G中的每条边都是有方向的; 3.完全图:图G任意两个顶点都有一条边相连接; 4.有向完全图:若n个顶点的有向图有n(n-1)条边, 称为有向完全图 5.简单路径:路径上各顶点 v1,v2,...,vm 均不互相重复 6.回路(环)原创 2014-02-18 17:06:08 · 1172 阅读 · 0 评论 -
图(3)--拓扑排序与关键路径
一.拓扑排序: 1.定义: 拓扑排序可以理解为在有向图无环图AOV(Activity On Vertex:用图的顶点表示活动,用弧表示活动之间的优先级)中排成一个具有前后次序的线性序列。 2.实现方式: 1). 输入AOV网络。令 n 为顶点个数。 2). 在AOV原创 2014-02-19 23:28:31 · 5491 阅读 · 1 评论 -
图(4)--最短路径
最短路径分为两种: 单源最短路径:一个点到其他所有点的最短距离(Dijkstra:迪杰斯特拉算法) 所有点之间的最短路径:Floyd(弗洛伊德算法)一.迪杰斯特拉算法: 这个算法类似于最小生成树算法,从起点V0开始选择所有可以直接到达的路径,在里面选择一条最短的Vk,然后以V0和Vk为已选择的结点集合U,再次原创 2014-02-20 11:52:55 · 1232 阅读 · 0 评论 -
上机总结
1.素数for(i=2;i{if(num%i==0)return 0;}2.进制void print(int x)//把一个整数转化为二进制输出{if(x){ print(x/2); putchar(x%2 + '0');}}3.冒泡优化 void sort(int a[],int n) {int i,j,原创 2015-03-07 20:41:18 · 818 阅读 · 0 评论 -
树(2)--二叉树的遍历(非递归)+线索二叉树
一:二叉树的遍历. 由于递归算法很简单,在这里就不例举了,主要看一下非递归算法(其实也就是用栈实现,因为递归本身就是一种栈) 1.先序遍历: 思想:(1)从根节点依次遍历当前节点的左子树,边遍历访问,并且压入栈 (2).再访问当前栈顶结点的右子树,然后再返回到(1)执行,直至栈空 #defi原创 2014-02-15 21:51:59 · 1624 阅读 · 0 评论 -
串(2)--模式匹配算法
算法目的:确定子串在主串中第一次出现的位置两种算法:BF,KMP(重点掌握)一:BF算法1.特点:主串的指针需回溯,速度慢;2.算法思想: 当主串T(长为m)和子串S(长为n)的比较字符不相等时,主串的指针i需要指向之前开始比较的位置的后面一个字符(相应的子串的指针j需要重新指到1),,这样依次拿子串T和主串的一个连续子字符串比较知道两个串相等为止。int In原创 2014-02-14 16:49:33 · 1167 阅读 · 0 评论 -
串(1)--基本概念
一:基本概念: 串是字符线性的有限集合,记作a=′a1…an ′ (n≥0)。其中:a是串名,用双引号括起来的字符序列是为串的值,双引号不是串内的成份,其作用是为了避免与变量名或常量混淆。ai(1≤i≤n)或是字母数据,或是其它字符称为串的元素,是构成串的基本单位。n为串的长度,且n≥0,如果n=0,则称a为空串(Null String),记作:a= ′′,其长度为0。而a原创 2014-02-13 17:10:50 · 1259 阅读 · 0 评论 -
查找(2)--动态查找
动态查找表:1.表结构本身是在查找过程中动态生成的,即对于给定值 key ,若表中存在关键字等于 key 的记录,则查找成功返回;否则,插入关键字等于 key 的记录。 2.动态查找表主要有二叉树结构和树结构两种类型。二叉树结构有二叉排序树、平衡二叉树等。树结构有B-树、B+树等。一.二叉排序树: 1.定义:原创 2014-02-21 21:59:06 · 1395 阅读 · 0 评论 -
排序(2)--选择排序,归并排序和基数排序
一.选择排序: 1.简单选择排序: (1).思想: 首先通过 n –1 次关键字比较,从 n 个记录中找出关键字最小的记录,将它与第一个记录交换。 再通过 n –2 次比较,从剩余的 n –1 个记录中找出关键字次小的记录,将它与第二个记录交换。原创 2014-02-23 14:15:57 · 1378 阅读 · 0 评论 -
查找(1)--静态查找
查找分为两种: 静态查找: 只查找,不改变数据元素集内的数据元素; 动态查找:既查找,又改变(增减)集合内的数据元素。静态查找又分为三种:顺序查找,折半查找,索引顺序查找(分块查找)一.顺序查找: 1.思想:从表的一端开始,逐个进行记录的关键 字和给定值的比较。 2.算法实现:原创 2014-02-21 13:54:42 · 2287 阅读 · 0 评论 -
排序(1)--插入排序和交换排序
首先引入几个概念: 内部排序:整个排序过程不需要访问外存便能完成。 外部排序:参加排序的记录数量很大,整个序列的排序过程不可能在内存中完成。 稳定性和不稳定性: 设 Ki、Kj (1≤i≤n, 1≤j≤n, i≠j ) 分别为记录 Ri、Rj 的关键字,且 Ki = Kj ,在排序前的序列中 Ri 领先于 Rj (即 i 一.原创 2014-02-23 11:14:54 · 1824 阅读 · 0 评论 -
排序(3)--各类排序算法的比较
从表中可得出一些结论: (1)从平均时间性能而言,快速排序最佳,其所需时间最省,但快速排序在最坏情况下的时间性能不如堆排序和归并排序。而后两者相比较的结果是,在n较大时,归并排序所需时间较堆排序省,但它所需的辅助存储量最多。(2)简单排序包括除希尔排序之外的所有插入排序,冒泡排序和简单选择排序,其中以直接插入排序为最简单,当序列中的记录“基本有序”或n值较小时,它是最佳的排序方法,因此原创 2014-02-23 14:19:14 · 1262 阅读 · 0 评论 -
栈(1)---栈的基本定义
一:栈的类型定义: 1.相关概念: (1)定义:只能在表的一端进行插入和删除的一种线性表 (2)存储结构:用顺序栈或链栈存储均可,但以顺序栈更常见 (3)运算规则:只能在栈顶运算,且访问结点时依照后进先出(LIFO)的原则 与线性表的区别: 二:栈的表示和实现*顺序栈原创 2014-02-11 15:07:15 · 1474 阅读 · 0 评论 -
线性表
寒假还有将近一个星期啦,前期学习了腩哥的新闻发布系统,很有感触,发现原来代码可以整理得这么规范,以前自己做的东西完全就是想到什么就做什么,完全没有一个整体的思路,学习了之后对开发的整个流程以及代码的规范有了质的提升,真的学得很过瘾,,,以后说不定还会在网页这方面继续深造的!!!多的不想,现在离考研将近一年的时间就是一心一意地好好准备! 数据结构的整体框架如下:原创 2014-02-10 14:53:54 · 1500 阅读 · 3 评论 -
栈(3)--栈与递归
一:递归的实现: 1. 当在一个函数的运行期间调用另一个函数时,在运行该被调用函数之前,需先完成三项任务: 1).将所有的实参、返回地址等信息传递给被调用函数保存; 2).为被调用函数的局部变量分配存储区; 3).将控制转移到被调用函数的入口。 从被调用函数返回调用函数之前,应该完成下原创 2014-02-12 17:19:03 · 933 阅读 · 1 评论 -
队列
示例图:定义:只能在表的一端进行插入运算,在表的另一端进行删除运算的线性表 (头删尾插)存储结构:顺序队,链队运算规则:先进先出(FIFO)一:链式队列: 1.存储结构定义:typedef struct Qnode { QElemType data; stuct Qnode *next;}QNode, *QuenePtr;typed原创 2014-02-12 22:08:43 · 942 阅读 · 0 评论 -
栈(2)--栈的应用
一:数制转换void Conversion ( ) {// 对于输入的任意一个非负十进制整数,输出等值的八进制数 InitStack(&S); // 构造空栈 scanf ("%d",N); while (N) { Push(&S, N % 8); N = N/8; } while (!StackEmpty(S)) {原创 2014-02-11 22:07:54 · 971 阅读 · 0 评论 -
红黑树
http://www.cnblogs.com/fornever/archive/2011/12/02/2270692.html转载 2016-05-08 19:48:37 · 337 阅读 · 0 评论