
数据结构
文章平均质量分 87
u013071074
这个作者很懒,什么都没留下…
展开
-
数据结构之顺序循环队列
一、存储结构二、基本操作原创 2014-05-29 23:05:56 · 854 阅读 · 0 评论 -
数据结构之(二叉)堆
(二叉)堆是一个数组,是一颗近似完全二叉树,分为大顶堆&小顶堆。表示堆的数组A有两个属性:(1)A.length表示数组元素的个数;(2)A.heap-size表示有多少个堆元素存储在数组A中。更多的关于堆的性质的介绍:算法导论第三版:p85-p89、编程珠玑:p141-p145。堆的操作主要包括堆插入、堆删除两个,而堆插入设计到FixUp操作(自底向上调整),堆删除涉及到FixDown操作(自顶向下调整,大顶堆时对应算法导论上的MAX-HEAPIFY操作)。本文主要给出的是大顶堆和小顶堆的基本操作的C原创 2014-06-19 10:41:19 · 1434 阅读 · 0 评论 -
利用堆实现堆排序&优先队列
堆排序、利用堆实现最大(小)优先级队列、STL中的heap的使用,利用堆求解top_k类问题。原创 2014-06-19 21:16:04 · 1015 阅读 · 0 评论 -
利用堆实现堆排序&优先队列
假设要实现非递减排序,则需要用要大顶堆。此处设计到三个大顶堆的操作:(1)自顶向下调整操作:MaxHeapify(对应堆的SiftDown操作)、(2)利用数组建立大顶堆:BuildMaxHeap、(3)不断交换堆顶元素(堆的最大元素)和堆的末尾元素,实现非递减排序。优先队列分为最大优先队列和最小优先队列,分别借助于大顶堆和小顶堆。优先队列有以下基本操作:(1)提取队列中的最大(小)元素;(2)提取队列中的最大(小)元素并从队列中删除;(3)将队列中元素为x的关键字减少(增大)到k,这里假设k的值不大(原创 2014-06-19 12:15:39 · 3886 阅读 · 0 评论 -
平衡二叉树(AVL树)
平衡二叉树:是一颗空树;或者具有以下性质的树:它的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值不超过1。平衡二叉树的关键在于插入结点时如何保持整棵树的平衡性。下面是不平衡发生的四种情况:(1)平衡二叉树某一节点的左孩子的左子树上插入一个新的节点,使得该节点不再平衡。LL型(左孩子的左子树)由于在A的左孩子B的左子树上插入结点F,使A的平衡因子由1增至原创 2014-07-09 14:27:22 · 909 阅读 · 0 评论 -
STL源码剖析---红黑树原理详解上
原文地址:http://blog.youkuaiyun.com/hackbuteer1/article/details/7740956一、红黑树概述 红黑树和我们以前学过的AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。不过自从红黑树出来后,AVL树就被放到了博物馆里,据说是红黑树有更好的效率,更高的统计性能。这一点在我们了解了红黑树的实现原理转载 2014-07-10 16:14:06 · 676 阅读 · 0 评论 -
从头到尾彻底理解KMP(2014年7月版)
从头到尾彻底理解KMP作者:July时间:最初写于2011年12月,2014年7月21日晚10点 全部删除重写成此文。1. 引言 本KMP原文最初写于2年多前的2011年12月,因当时初次接触KMP,思路混乱导致写也写得非常混乱,如此,留言也是“骂声”一片。所以一直想找机会重新写下KMP,但苦于一直以来对KMP的理解始终转载 2014-07-30 10:29:54 · 1411 阅读 · 0 评论 -
计数排序、基数排序与桶排序
一、计数排序稳定、 当输入的元素是n 个小区间(0到k)内整数时,它的运行时间是 O(n + k),空间复杂度是O(n)。const int K = 100;//计数排序:假设输入数据都属于一个小区间内的整数,可用于解决如年龄排序类的问题//Input:A[0, ..., n-1], 0 <= A[i] < K//Output:B[0, ..., n-1], sorting of A原创 2014-07-06 13:25:49 · 971 阅读 · 0 评论 -
数据结构之单链表(二)
接上篇:数据结构二:单链表(一)原创 2014-05-28 17:21:10 · 1088 阅读 · 0 评论 -
快排、归并排序(分治)、堆排序
(1)快速排序算法以及应用快速排序中划分的思想求数组中第k小的数,最小的前k个数。(2)归并排序算法以及利用归并排序计算数组的逆序对数。(3)堆排序原创 2014-07-04 23:42:35 · 1907 阅读 · 1 评论 -
数据结构之线性表的顺序表示和实现
线性表的顺序存储结构可以用一维数组来原创 2014-05-28 15:21:10 · 940 阅读 · 0 评论 -
STL源码剖析---红黑树原理详解下
原文地址:http://blog.youkuaiyun.com/hackbuteer1/article/details/7760584 算法导论书上给出的红黑树的性质如下,跟STL源码剖析书上面的4条性质大同小异。 1、每个结点或是红色的,或是黑色的 2、根节点是黑色的 3、每个叶结点(NIL)是黑色的 4、如果一个节点是红色的,则它的两个转载 2014-07-10 16:16:35 · 751 阅读 · 0 评论 -
数据结构之二叉树
一、存储结构原创 2014-06-03 14:48:49 · 878 阅读 · 1 评论 -
二叉排序树
二叉排序树(Binary Sort Tree):或者是一颗空树,或者是具有以下性质的树:(1)若它的左子树不空,则左子树上所以结点的值均小于它的根节点的值;(2)若它的右子树不空,则右子树上的所以结点的值均大于它的根节点的值;(3)它的左、右子树也分别是二叉排序树。二叉排序树的基本操作均可以在O(h)时间内完成(算法导论p165)。相关操作代码如下:int InsertBST(BiTr原创 2014-07-08 23:14:25 · 817 阅读 · 0 评论 -
数据结构之单链表(一)
一、存储结构二、基本操作三、单链表相关的算法原创 2014-05-28 16:30:39 · 918 阅读 · 0 评论 -
数据结构之链队列
一、存储结构二、基本操作原创 2014-05-30 10:29:02 · 1022 阅读 · 0 评论 -
数据结构之双向链表
一、存储结构二、基本操作原创 2014-06-03 14:21:17 · 771 阅读 · 1 评论 -
数据结构之顺序栈
一、存储结构二、基本操作原创 2014-05-29 22:37:33 · 850 阅读 · 0 评论 -
数据结构之并查集
并查集(Union-find Sets)是一种非常精巧而实用的数据结构,它主要用于处理一些不相交集合的合并问题。一些常见的用途有求连通子图、求最小生成树的 Kruskal 算法和求最近公共祖先(Least Common Ancestors, LCA)等。使用并查集时,首先会存在一组不相交的动态集合 S={S1,S2,⋯,Sk},一般都会使用一个整数表示集合中的一个元素。每个集合可能包含一个原创 2014-07-19 16:03:41 · 947 阅读 · 0 评论 -
数据结构之图(术语、存储结构、遍历)
无向边:若顶点Vi 到Vj 的边没有方向,则称这条边为无向边,用无序偶对来表示原创 2014-06-04 14:51:15 · 16827 阅读 · 3 评论 -
数据结构之哈希表
“除留余数法”+“开放定址法(线性探测再散列)”实现的哈希表。原创 2014-07-20 08:57:55 · 1208 阅读 · 0 评论 -
最短路径之Floyd算法
图文并茂。Dijkstra算法求某一个源点到其余各顶点时间复杂度是O(n^2),但如果采用此算法,找从某一源点到某一特定终点的最短路径,复杂度仍为O(n^2)。求每一对顶点之间的最短路径:(1)每次以一个顶点为源点,重复执行Dijkstra算法n次。总的时间复杂度是O(n^3);(2)弗洛伊德(Floyd)算法:时间复杂度也是O(n^3),但形式上更简单。原创 2014-06-10 00:16:01 · 2316 阅读 · 0 评论 -
最短路径之Dijkstra算法
本文简单描述了Dijkstra(迪杰斯特拉)算法,结合一个实例进行了算法流程描述,给出了C语言的算法实现。另外给了两个直接应用Dijkstra算法求解ACM题的链接。原创 2014-06-09 16:37:48 · 28262 阅读 · 2 评论 -
数据结构之最小生成树
最小生成树: 一个连通图的生成树是一个极小连通子图,它含有图中全部顶点,但只有足以构成一棵树的n-1条边。这种构造连通网的最小代价生成树称为最小生成树,详见数据结构之图(术语、存储结构、遍历)。求连通网的最小生成树有两种经典方法:普里姆(Prime)算法和克鲁斯卡尔(Kruskal)算法。1、Prime算法(1)算法描述假设N=(V,{E})是连通网,TE是N上最小生成树中边的集合。从V中任选一个顶点u0,算法从U={u0}(u0∈V),TE={}开始,重复执行以下步骤:在所有u∈U、v∈V-原创 2014-06-09 15:13:46 · 2737 阅读 · 0 评论 -
直接插入排序、二分插入排序、希尔排序、冒泡排序与简单选择排序
一、直接插入排序稳定,时间复杂度:最好O(n)、最差O(n^2)、平均O(n^2),空间复杂度O(1)void InsertSort(int L[], int n){ int i, j,key; for (i = 1; i<n; i++) if(L[i] < L[i-1])//需要将L[i]插入到有序表L[0...i-1] { key = L[i];原创 2014-07-06 14:13:07 · 1458 阅读 · 0 评论