DataStructure & Algorithm
文章平均质量分 89
selfimpr1991
这个作者很懒,什么都没留下…
展开
-
【数据结构】二叉堆(堆)
二叉堆(也叫堆)是一个部分排序的二叉树,其排序规则体现在它的堆序性质上:最大堆和最小堆,最大堆就是其对于任一节点,每个节点的键值都大于等于它的孩子节点,所以根节点键值最大。最小堆则相反。堆是一棵完全二叉树,具备完全二叉树的性质,可以用一个数组表示而不需要指针,在起始位置为 0 的数组中任一位置 i 上的元素,其左儿子在位置 2*1+1 上,右儿子在左儿子的后面邻近位置上,它的父节点则在位置 (原创 2014-03-12 19:16:11 · 1769 阅读 · 0 评论 -
【数据结构】图邻接表存储实现
一个图 G = (V,E)由顶点(vertex)集 V 和边(edge)集 E 组成。原创 2014-04-29 21:46:45 · 9340 阅读 · 0 评论 -
【数据结构】平衡二叉树[AVL树](一)——插入
AVL 树是带有平衡条件的二叉查找树,所谓的平衡条件就是每个节点的左子树和右子树的高度最大差别为1。平衡二叉树的实现大部分过程和二叉查找树是一样的,区别在于要时刻保持树的平衡,所以在插入和删除之后要添加一个旋转算法来保持平衡,保持平衡需要借助一个节点高度的属性。一、AVL 节点class AvlTree;class AvlNode{public: AvlNode(int va原创 2014-03-26 17:37:35 · 7281 阅读 · 2 评论 -
【经典算法】详解 KMP 算法
KMP算法是通过分析模式字符串,预先计算每个位置发生不匹配的时候,所需GOTO的下一个比较位置,原创 2014-04-25 21:58:54 · 1257 阅读 · 1 评论 -
【Linux内核数据结构】最为经典的链表list
很久之前研读过Linux的内核源码(后来终止了,水太深,吾辈驾驭不了),看到其中的内核数据结构,对链表的实现叹为观止,是迄今为止我见过的最为经典的链表实现(不是数据内嵌到链表中,而是把链表内嵌到数据对象中)。现在再来回顾这个经典的数据结构。链表代码在头文件中声明(推荐Source Insight,源码版本:Linux-2.6.32.61),其数据结构很简单有木有,直接就一个前后链表指针,前篇S原创 2015-03-21 18:18:26 · 11178 阅读 · 5 评论 -
【数据结构】图的邻接矩阵存储实现
图的邻接表存储实现:http://blog.csdn.net/wenqian1991/article/details/24667287图的邻接表DFS和BFS算法:http://blog.csdn.net/wenqian1991/article/details/24812393这里则介绍图的另外一种存储方式:邻接矩阵。参考资料《大话数据结构》《C算法:卷二》一、图的数据结构图的邻接原创 2015-07-29 11:05:53 · 8099 阅读 · 0 评论 -
最短路径——迪科斯彻算法(Dijkstra)算法
迪科斯彻算法(Dijkstra)是有荷兰计算机科学家艾兹格·迪科斯彻(Edsger Wybe Dijkstra)发明的。算法解决的是有向图中单个源点到其他顶点的最短路径问题。算法描述这个算法是通过为每个顶点 v 保留目前为止所找到的从s到v的最短路径来工作的。初始时,原点 s 的路径长度值被赋为 0 (d[s] = 0),同时把所有其他顶点的路径长度设为无穷大,即表示我们不原创 2015-08-01 13:36:13 · 5526 阅读 · 0 评论 -
【经典排序算法】桶排序
桶排序假设待排序的一组数统一的分布在一个范围中,然后设定对应数据数量的桶,待排序的一组数,分别对应算式处理归入这些子桶,并将桶中的数据进行排序,最后将各个桶中的数据有序的合并起来。通俗的说,就是通过某个公式将待排序的一组数分为几个子范围,然后归入到对应的子桶,这样必然会有不一样的数据经过算式处理后对应同一个桶,我们可通过简单比较将对应同一个桶的不同数据排序,最后各个数据处理完后,有的桶为空,有原创 2014-03-31 21:06:55 · 1689 阅读 · 0 评论 -
【经典排序算法】选择排序、堆排序
1、选择排序实现思想:首先在未排序序列中找到最小(大)元素,存放在排序序列的起始位置,然后再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾,以此类推,直到所有元素均排序完毕。通俗的讲就是从无序区(不同于插入排序,这里的无序区包含所有元素)选一个最小(大)的元素直接放在有序区的最后,即选择一个最小的元素依次放在前面,即选择最小(大)元素就有个逐一比较和交换的过程。实现步骤原创 2014-03-07 13:37:26 · 1550 阅读 · 0 评论 -
【经典排序算法】冒泡排序
说到算法,不得不提到两个重要的概念:时间复杂度和空间复杂度。这两者都跟数据的输入规模 n 密切相关,时间复杂度的计算就是:找到执行次数最多的语句,然后计算语句执行次数的数量级,用大O表示结果。可以把这个输入规模看做是一个变量来理解,如果时间复杂度为O(1),那个这个 n 就不是一个变量而是一个常量,不管其数值是多少,哪怕是十万级,它的时间复杂度也是O(1),相反如果这个 n 是一个变量,可能它的最原创 2014-03-04 15:10:05 · 1731 阅读 · 0 评论 -
【经典排序算法】插入排序、希尔排序
1、直接插入排序基本思想:每次将一个待排序的数据,按其大小插入到前面已经排好序的子序列中的适当位置,直到全部数据插入完成为止。换言之,就是将无序区(第一个元素默认有序)的第一个元素(也就是输入数组的第二个元素)通过与有序区的数据进行比较,然后直接插入到有序区的适当位置,形成更大的有序区,这样有序区扩大了一个元素,无序区缩小了一个元素。以此循环遍历,最终,整个数组就构成了有序区,排序也就完成了。原创 2014-03-06 14:28:54 · 1236 阅读 · 0 评论 -
本博客全文目录索引
本专栏博文索引(目录)涵盖:C/C++、STL、Data Structure、Algorithm、TCP/IP、Linux(Interface/Driver/Kernel)和 Projects。 C/C++ 详解C指针 C++对象模型 深度探索C++对象内存模型 深度剖析C++虚函数 详解C++类的静态成员和C语言中的static C++拷贝构造函数与赋值函数 详解C+原创 2016-01-26 18:34:02 · 7183 阅读 · 8 评论 -
【经典排序算法】快速排序
快速排序也是采用分治法,将问题化整归零来处理。步骤为:1. 从数列中调出一个元素,称为 “基准”(pivot);2. 重新排序数列,排序规则就是将数列中比基准值大的放在基准的后面,将比基准值小的放在基准的前面,在这个分区退出之后,该基准就处于数列的中间位置(非绝对中间位置),这个称为分区操作;3. 递归地把小于基准值元素的子数列和大于基准值元素的子序列排序。递归的终止条件就是数列的原创 2014-03-11 20:15:57 · 1461 阅读 · 1 评论 -
【数据结构|剑指Offer】单向链表的各项操作实现
本博文着重实现《剑指Offer》上面的单向链表操作。//数据结构struct ListNode{ int data; ListNode *next; ListNode(int x) :data(x), next(NULL) {}};//在链表尾部添加结点void AddToTail(ListNode **pHead, int value){ ListNode *pNew =原创 2015-07-27 12:10:44 · 957 阅读 · 0 评论 -
【数据结构】线性循环队列
线性队列和线性堆栈有点相似,不过队列里面的数据是“先进先出”,原创 2014-01-12 20:41:45 · 1657 阅读 · 0 评论 -
【数据结构】线性堆栈
栈也是一种很重要的数据结构,具备“先进后出”的特点。程序中的函数调用以及递归都涉及栈这一数据结构,熟悉栈有利于我们更好地理解函数的调用过程(主要是形参,局部变量以及函数的返回值)和递归算法的实现过程1、栈的数据节点typedef struct _Stack{ int *pData; //数据域指针 int size; //栈容量 int top; //栈顶}原创 2014-01-10 22:12:19 · 1121 阅读 · 0 评论 -
【数据结构】单向链表
链表是一个很重要的数据结构,它由一系列不必在内存中连续存储的结构组成,也就是对内存要求没那么高,不需要连续的内存块。这里就不介绍链表的优缺点了,只负责链表等基础数据结构的实现,在实现和应用当中去体会它的优劣。既然是不连续的内存空间,我们要访问各个元素,就需要通过指针来寻找。链表结构中需要定义数据域和指针域。PS:虽说是C语言版,但平常都在C++环境下,所以这里新建的文件是.cpp,添加的是C+原创 2014-01-03 11:22:29 · 1480 阅读 · 0 评论 -
【数据结构】二叉查找树【续】之非递归遍历
对于二叉查找树,前面有博文介绍:http://blog.csdn.net/wenqian1991/article/details/18228309【二叉查找树】,关于二叉树的三种遍历方式介绍,参见前面链接。二叉树的遍历关键在于:出的去要回得来。以中序遍历为例,先遍历左子树,再访问根节点,最后遍历右子树,当遍历完左子树,即发现访问到左子树的叶子节点了,下一步便是访问该叶子节点的根节点,再右子树。接下原创 2014-03-01 16:24:17 · 1191 阅读 · 0 评论 -
【数据结构】双向链表
双向链表较单向链表有更好的灵活性,具备前后指针,可以更方便的对链表进行操作,但程序设计也更复杂,需要同时考虑前后指针。这里同样对照单链表的基础操作,讨论链表的创建、尾端添加元素、指定位置插入元素、删除指定单个元素节点、删除指定元素所有节点、删除指定位置节点、顺序,逆序打印节点以及统计结点个数等基础操作。1、双向链表的数据结构typedef struct _Node{ int val原创 2014-01-07 21:53:57 · 1316 阅读 · 0 评论 -
【数据结构】平衡二叉树[AVL树](二)——删除
前面介绍了平衡二叉树的插入操作:平衡二叉树的插入,这里来介绍平衡二叉树的删除,平衡二叉树是一棵带有平衡条件的二叉查找树,其删除操作是在二叉查找树的基础上添加平衡调整算法。二叉查找树的删除操作参见博文:二叉查找树的删除(第七点)先看一下示意图()/*二叉查找树的性质让我们可以很方便的查找最小最大键值*//*查找最小键值节点:直接递归遍历左子树叶子节点*/AvlNode* Av原创 2014-03-27 18:01:46 · 6059 阅读 · 2 评论 -
【经典算法】图的深度优先搜索和广度优先搜索
前面学习了图的邻接表存储,原创 2014-07-23 21:41:31 · 10292 阅读 · 0 评论 -
【数据结构】哈希表
哈希表,也叫散列表,是根据关键字而直接访问在内存存储位置的数据结构。也就是说,它通过把键值经过一个映射函数的计算,映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称作散列函数,存放记录的数组称作散列表。由哈希表的定义可知,散列函数关系到关键字映射到什么散列表的什么位置,实际上散列表的单元是有限的,但是关键字的个数却往往远大于该单元个数,我们必须又同时保证每个关键字通过映射函数的计算原创 2014-04-03 15:38:25 · 3217 阅读 · 1 评论 -
【经典排序算法】归并排序
归并排序是建立在归并操作上的一种有效的排序算法,采用分治法。将两个(或两个以上)有序表合并成一个新的有序表。分而治之:分就是将待排序序列分为若干个有序的子序列,对子序列进行排序;合就是把有序的子序列合并为整体有序序列。这个算法原创 2014-03-08 21:06:31 · 1854 阅读 · 1 评论 -
【经典排序算法】八大排序对比总结
针对前面讨论的八大经典排序算法:冒泡排序、插入排序、选择排序、堆排序、归并排序、快速排序、希尔排序、桶排序。关于各种什么时间复杂度,空间复杂度的对比总结,网上一大堆,别人也总结的很好,这里就不赘述了,这里主要通过对大量数据进行排序测试,来比较各排序之间优劣(时间上)。原创 2014-04-03 20:52:30 · 3819 阅读 · 1 评论 -
【深度探索 STL】【数据结构】详解红黑树(一)结构及插入
红黑树概述历史上 AVL 树流行的另一变种是红黑树()原创 2014-05-31 21:59:18 · 4636 阅读 · 3 评论 -
【数据结构】二叉查找树
1、基本概念:树的深度原创 2014-01-16 11:35:01 · 2805 阅读 · 2 评论