算法与数据结构
SpringWar
成长在程序猿——>攻城狮的道路上
展开
-
数据结构基础(23) --红黑树的设计与实现(中)
Insert完善 根据规则4, 新增节点必须为红; 根据规则3, 新增节点之父节点必须为黑. 示例: (1)插入16(红色)/55(红色), 则既不用旋转, 也不用重新染色 (2)插入82(红色), 则违反了红黑规则, 需要进行动态的调整; 红黑树所需的处理1.单旋转 新插入的X与其父P都是红色的, 而且X还是G转载 2015-08-07 15:55:05 · 681 阅读 · 0 评论 -
数据结构基础(11) --循环链表的设计与实现
循环链表:最后一个结点的指针域的指针又指回第一个结点的链表; 循环单链表与单链表的区别在于:表中最有一个节点的指针不再是NULL, 而改为指向头结点(因此要对我们原来的MyList稍作修改), 从而整个链表形成一个环. 因此, 循环单链表的判空条件不再是头结点的指针是否为空, 而是他是否等于头结点; 其实如果只是单纯的实现循环链表对单链表的性能提升是不明显的, 反转载 2015-08-06 15:21:59 · 609 阅读 · 0 评论 -
数据结构基础(16) --树与二叉树
树的基本术语1.结点:{数据元素+若干指向子树的分支}2.结点的度:分支的个数(子树的个数)3.树的度:树中所有结点的度的最大值4.叶子结点:度为零的结点5.分支结点:度大于零的结点(包含根和中间结点)6.(从根到结点的)路径:由从根到该结点所经分支和结点构成;7.结点的层次:假设根结点的层次为1,则根的孩子为第2层,如果某节点在第L层,则其子树的根在L+1层。8.转载 2015-08-06 15:29:06 · 561 阅读 · 0 评论 -
数据结构基础(15) --基数排序
基数排序是一种借助“多关键字排序”的思想来实现“单关键字排序”的内部排序算法。实现多关键字排序通常有两种作法: 最低位优先法(LSD) 先对K[0]{基数的最低位}进行排序,并按 K(0) 的不同值将记录序列分成若干子序列之后,分别对 K[1] 进行排序,..., K[d-1]依次类推,直至最后对最次位关键字排序完成为止。 最高位优先法(MSD) 先对 K[d转载 2015-08-06 15:28:01 · 588 阅读 · 0 评论 -
数据结构基础(2) --顺序查找 & 二分查找
顺序查找适用范围:没有进行排序的数据序列缺点:速度非常慢, 效率为O(N)[cpp] view plaincopy//实现 template typename Type> Type *sequenceSearch(Type *begin, Type *end, const Type &searchValue) throw(std::range_er转载 2015-08-06 15:07:50 · 594 阅读 · 0 评论 -
数据结构基础(6) --顺序栈的设计与实现
栈是一种只允许在一端进行插入或删除操作的线性表.其特点为:先进后出(FILO)/后进先出(LIFO); 栈 VS. 队列 栈和队列都是动态集合, 但在栈中, 可以去掉的是最近插入的那一个,:栈实现了一种后进先出(last-in, first-out)的策略;类似的, 在队列中, 可以去掉的元素总是在集合中存在时间最长的那一个:队列实现了先进先出(first-in, first-o转载 2015-08-06 15:14:23 · 703 阅读 · 0 评论 -
数据结构基础(10) --单链表迭代器的设计与实现
为了向 STL 致敬(O(∩_∩)O~), 我们模仿STL中的list的迭代器, 我们也自己实现一个MyList的迭代器, 以供遍历整个链表的所有元素:首先:Node节点需要做如下修改(注意后缀有+的代码)[cpp] view plaincopy//链表节点 template typename Type> class Node { friend cl转载 2015-08-06 15:20:37 · 602 阅读 · 0 评论 -
数据结构基础(14) --链式队列的设计与实现
链式队列是基于单链表的一种存储表示, 其形状如下图所示: (队列的队头指针指向单链表的第一个结点, 队尾指针指向单链表的最后一个结点, 注意没有无用的空[头/尾]节点) 用单链表表示的链式队列特别适合于数据元素变动比较大的情况, 而且不存在队列满而产生溢出的情况; 链式队列结点构造:[这次我们将节点构造成了类LinkQueue的嵌套类]转载 2015-08-06 15:26:53 · 641 阅读 · 0 评论 -
数据结构基础(18) --哈希表的设计与实现
哈希表 根据设定的哈希函数 H(key)和所选中的处理冲突的方法,将一组关键字映射到一个有限的、地址连续的地址集 (区间) 上,并以关键字在地址集中的“映像”作为相应记录在表中的存储位置,如此构造所得的查找表称之为“哈希表”。 构造哈希函数的方法1. 直接定址法(数组) 哈希函数为关键字的线性函数H(key) = key 或者 H(key) = a*key + b转载 2015-08-06 15:31:41 · 999 阅读 · 0 评论 -
数据结构-各类排序算法总结[续]
各类排序算法总结三.交换类排序[接上]2.快速排序快速排序是通过比较关键码、交换记录,以某个记录为界(该记录称为支点),将待排序列分成两部分。其中,一部分所有记录的关键码大于等于支点记录的关键码,另一部分所有记录的关键码小于支点记录的关键码。我们将待排序列按关键码以支点记录分成两部分的过程,称为一次划分。对各部分不断划分,直到整个序列按关键码有序.如果每次划分对一个元素定位后,该元转载 2015-08-06 15:01:09 · 617 阅读 · 0 评论 -
数据结构-各类排序算法总结[结局]
各类排序算法总结五.分配类排序->基数排序:基数排序是一种借助于多关键码排序的思想,是将单关键码按基数分成“多关键码”进行排序的方法。基数排序属于”低位优先”排序法,通过反复进行分配与收集操作完成排序.对于数字型或字符型的单关键字,可以看成是由多个数位或多个字符构成的多关键字,此时可以采用这种“分配-收集”的办法进行排序,称作基数排序法。其好处是不需要进行关键字间的比较。例如:转载 2015-08-06 15:03:35 · 791 阅读 · 0 评论 -
数据结构基础(4) --快速排序
快速排序是最流行的,也是速度最快的排序算法(C++ STL 的sort函数就是实现的快速排序); 快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数转载 2015-08-06 15:10:43 · 565 阅读 · 0 评论 -
数据结构基础(13) --链式栈的设计与实现
采用链式存储的栈成为链式栈(或简称链栈), 链栈的优点是便于多个栈共享存储空间和提高其效率, 且不存在栈满上溢的情况(因为链栈是靠指针链接到一起,只要内存够大, 则链栈理论上可以存储的元素是没有上限的); 与顺序栈相比, 由于顺序栈是采用的数组实现, 因此一旦数组填满, 则必须重新申请内存, 并将所有元素”搬家”, 而链栈则省略了这一”耗时耗力”的工作, 但却需要付出附加一个指针的代价;转载 2015-08-06 15:25:31 · 796 阅读 · 0 评论 -
数据结构基础(17) --二叉查找树的设计与实现
二叉排序树的特征二叉排序树或者是一棵空树,或者是具有如下特性的二叉树: 1.每一元素都有一个键值, 而且不允许重复; 2.若它的左子树不空,则左子树上所有结点的值均小于根结点的值; 3.若它的右子树不空,则右子树上所有结点的值均大于根结点的值; 4.它的左、右子树也都分别是二叉排序树。二叉排序树保存的元素构造[cpp]转载 2015-08-06 15:30:26 · 762 阅读 · 0 评论 -
数据结构基础(20) --图的存储结构
图的结构定义 图是由一个顶点集 V 和一个弧集 E构成的数据结构。 Graph = (V , E ) 其中,E = {| v,w∈V 且 P(v,w)} 表示从 v 到 w 的一条弧,并称 v 为弧尾,w 为弧头。谓词 P(v,w) 定义了弧 的意义或信息。 由顶点集和边集构成的图称作无向图。 如果”弧”是有方向的,则称由顶点集和弧集构成的图为有向图。转载 2015-08-07 15:49:07 · 743 阅读 · 0 评论 -
数据结构基础(12) --双向循环链表的设计与实现
双向链表的操作特点: (1) “查询” 和单链表相同; (2)“插入” 和“删除”时需要同时修改两个方向上的指针。 但是对于双向循环链表则在表尾插入非常的迅速, 只需O(1)的时间,因为有指向前面的指针, 因此双向循环链表会很容易的找到位于表尾的元素,因此双向循环链表比较适用于频繁在表尾插入的情况.空链表:双向循环链表节点构造:转载 2015-08-06 15:23:49 · 675 阅读 · 0 评论 -
数据结构基础(3) --Permutation & 插入排序
Permutation(排列组合)排列问题:设R = {r1, r2, ... , rn}是要进行排列的n个元素, Ri = R-{ri}; 集合X中元素的全排列记为Permutation(X), (ri)Permutation(X)表示在全排列Permutation(X)的每一个排列前加上前缀ri得到的排列.R的全排列可归纳定义如下:当n=1时,Permutation(R)={r转载 2015-08-06 15:09:13 · 514 阅读 · 0 评论 -
数据结构基础(21) --DFS与BFS
DFS 从图中某个顶点V0 出发,访问此顶点,然后依次从V0的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和V0有路径相通的顶点都被访问到(使用堆栈). [cpp] view plaincopy//使用邻接矩阵存储的无向图的深度优先遍历 template typename Type> void Graph::DFS() {转载 2015-08-07 15:50:22 · 519 阅读 · 0 评论 -
数据结构基础(22)--红黑树的设计与实现(上)
红黑树是一种自平衡的二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组(C++ STL 中的map/set)。它是在1972年由Rudolf Bayer发明的,他称之为"对称二叉B树",它现代的名字是在 Leo J. Guibas 和 Robert Sedgewick 于1978年写的一篇论文中获得的。红黑树虽然很复杂,但它的操作有着良好的最坏情况运行时间,并且在实践中是高效转载 2015-08-07 15:52:58 · 651 阅读 · 0 评论 -
数据结构基础(24) --红黑树的设计与实现(下)
完整源代码: http://download.csdn.net/detail/hanqing280441589/8450041 红黑节点设计与实现[cpp] view plaincopytemplate typename Comparable> class RedBlackNode { friend class RedBlackTree; /转载 2015-08-07 15:56:28 · 566 阅读 · 0 评论 -
数据结构基础(19) --堆与堆排序
完全二叉树 首先让我们回顾一下完全二叉树的两个性质: 性质1:具有n个结点的完全二叉树的深度为[logn](向下取整)+1。 性质2:若对含 n 个结点的完全二叉树从上到下且从左至右进行 1 至 n 的编号,则对完全二叉树中任意一个编号为 i 的结点: (1) 若 i=1,则该结点是二叉树的根,无双亲,否则,编号为 [i/2](向下取整)的结点为其双亲结点转载 2015-08-07 15:48:02 · 664 阅读 · 0 评论 -
数据结构入门——递归
数据结构是学习编程路上的重要一步,也为以后学习算法打下基础,数据结构又称算法与数据结构,与算法密不可分,是计算机软件专业的核心课程,其重要性不言而喻。 递归分为递推与回归两个过程,递归的优点是容易理解,方便编程,可以解决很多问题,缺点是需要不断的调用递归,时间效率慢,空间占用大。递归示例:# include int f(int n){ //printf("1");原创 2015-08-05 10:14:29 · 897 阅读 · 0 评论 -
数据结构入门——链表的实现
该程序实现了链表的增、删、遍历、排序等大部分功能,仅供参考。理解链表的原理,对后面栈、队列、二叉树、图等数据结构的学习有很大帮助。链表的实现:# include # include # include typedef struct Node{ int data; struct Node * pNext;}NODE, *PNODE;PNODE create_list(vo原创 2015-08-05 10:19:09 · 827 阅读 · 0 评论 -
数据结构入门——栈与队列
栈与队列是两种重要的数据结构,有着广泛的应用,他们可以通过对链表功能加以限制改造而来。栈是一种先进后出(FILO)的数据结构,只能在一头进行加入删除,而队列是一种先进先出(FIFO)的数据结构,一头只能加入,另一头只能删除。栈的实现:# include # include # include typedef struct Node{ int data; struct原创 2015-08-05 10:29:47 · 1153 阅读 · 0 评论 -
数据结构入门——动态数组
数组的一大缺点就是长度定义后不能再改变,此程序实现了动态数组,类似于Java中的ArrayList的结构,有增、删、排序、遍历、扩容追加等功能。动态数组的实现:/* 2013年2月16日19:18:35 此程序将数组中的元素进行追加、删除、排序、遍历输出等操作。 与java中的各方法相同,从而更加深入理解java中的方法。*/# include # include原创 2015-08-05 10:36:28 · 1357 阅读 · 0 评论 -
数组结构基础——转载声明
学习数据结构是一个很漫长的过程,我在学习过程中发现了一个不错的博客,博主不断的学习,充实自己,我很佩服,我读了他的博客,深有体会,目前,该博主已经进入阿里巴巴实习。博客地址:http://blog.csdn.net/zjf280441589 他写的博客很详细,适合学习,比我写得好多了,最近也的确没有太多时间写博客,所以将他的博客转载过来,继续我们的数据结构与其他课程的学习。原创 2015-08-05 10:50:51 · 599 阅读 · 0 评论 -
数据结构——各类排序算法总结
各类排序算法总结一. 排序的基本概念排序(Sorting)是计算机程序设计中的一种重要操作,其功能是对一个数据元素集合或序列重新排列成一个按数据元素某个项值有序的序列。有 n 个记录的序列{R1,R2,…,Rn},其相应关键字的序列是{K1,K2,…,Kn},相应的下标序列为1,2,…,n。通过排序,要求找出当前下标序列1,2,…, n 的一种排列p1,p2, …,pn,使得相应关键字转载 2015-08-05 10:58:49 · 661 阅读 · 0 评论 -
数据结构基础(1) --Swap & Bubble-Sort & Select-Sort
Swap的简单实现[cpp] view plaincopy//C语言方式(by-pointer): template typename Type> bool swapByPointer(Type *pointer1, Type *pointer2) { //确保两个指针不会指向同一个对象 if (pointer1 == NULL || poin转载 2015-08-06 15:05:52 · 483 阅读 · 0 评论 -
数据结构基础(5) --归并排序
归并排序的基本思想: 将两个或两个以上的有序子序列”归并”为一个有序序列:假定待排序表含有n个记录, 则可以看成是n个有序的子表, 每个子表长度为1, 然后两两归并, 得到[n/2]个长度为2或1的有序表,; 再量量归并, ...., 如此重复, 直到合并成为一个长度为n的有序表为止, 这种排序方法称为2-路归并排序.如图为一个2-路归并排序的一个示例:[cpp]转载 2015-08-06 15:12:20 · 609 阅读 · 0 评论 -
数据结构基础(7) --循环队列的设计与实现
队列 队列简称队, 也是一种操作受限的线性表, 只允许在表的一端进行插入, 而在表的另一端进行删除.其特点为”先进先出(FIFO)”,故又称为先进先出的线性表,简单队列如图所示: 循环队列 顺序队列有一个先天不足, 那就是空间利用率不高, 会产生”假溢出”现象,即:其实队列中还有空闲的空间以存储元素, 但我们在判断队列是否还有空间时, 队列告诉我们队列已经满转载 2015-08-06 15:16:34 · 551 阅读 · 0 评论 -
数据结构基础(8) --单链表的设计与实现(1)之基本操作
链表简介数组的缺点: 1.元素插入:除了在数组的末尾插入元素之外,在数组的其他任何位置插入元素都需要进行数组元素的频繁移动(插入位置之后的元素都需往后移动), 时间复杂度约为O(N); 2.数组的删除:除了在数组的末尾删除元素之外,在数组的其他任何位置删除元素都需要进行数组元素的频繁移动(删除位置之后的元素都需往前移动), 时间复杂度也为O(N); 链表的特点:转载 2015-08-06 15:17:59 · 759 阅读 · 0 评论 -
数据结构基础(9) --单链表的设计与实现(2)之高级操作
链表的链接: 将第二条链表的所有内容链接到第一条链表之后, 其完整实现代码与解析如下:[cpp] view plaincopy//链表的链接 template typename Type> void MyList::concatenate(const MyList &list) { if (isEmpty())//如果自己的链表为空转载 2015-08-06 15:19:22 · 663 阅读 · 0 评论 -
算法导论笔记——快速排序
快速排序:快速排序是最常用的算法之一,空间复杂度为O(logn),时间复杂度为O(nlogn),最坏情况下为O(n2)快速排序使用分治策略,特点是每次找一个主元,根据主元与数组元素的大小,将数组分为三部分,如数组A[p...r],主元q,分为A[p...q-1],q,A[q+1...r]三部分。寻找合适的主元是算法优化的关键,最初的快速排序将末位的元素作为主元,如果主元是数组中最大值或原创 2015-09-05 11:26:13 · 970 阅读 · 0 评论