
数据结构和算法
清觞煮雪
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
树操作(上)
最近项目赶的紧,歇了一个星期没写博客了,趁周末继续写这个系列。 先前我们讲的都是“线性结构”,他的特征就是“一个节点最多有一个”前驱“和一个”后继“。那么我们今天讲的树会是怎样的呢?我们可以对”线性结构“改造一下,变为”一个节点最多有一个"前驱“和”多个后继“。哈哈,这就是我们今天说的”树“。一: 树 我们思维中的”树“就是一种枝繁叶茂的形象,那么数据结构转载 2016-05-10 15:16:39 · 274 阅读 · 0 评论 -
栈
今天跟大家聊聊栈,在程序设计中,栈的使用还是非常广泛的,比如有“括号匹配问题“,”html结构匹配问题“。所以说掌握了”栈“的使用,对我们学习算法还是很有帮助的。一: 概念 栈,同样是一种特殊的线性表,是一种Last In First Out(LIFO)的形式,现实中有很多这样的例子, 比如:食堂中的一叠盘子,我们只能从顶端一个一个的取。二:存储转载 2016-05-10 11:32:10 · 293 阅读 · 0 评论 -
树形结构
树型结构的基本概念对大量的输入数据,链表的线性访问时间太慢,不宜使用。本文探讨另外一种重要的数据结构----树,其大部分时间可以保证操作的运行平均时间复杂度为O(logN),第一部分先来看一下树的一些预备知识。首先看一下树形结构的样子,下图代表的是树型结构的一般形态:由上图看得出树是一些节点的集合,总结一下树的一些基本概念:1、结点:树中的数据元素都称之为结点2、根:最上面转载 2016-04-22 15:24:08 · 6758 阅读 · 0 评论 -
数据结构和算法分析
问题引出假设有一道题目:有一组N个数而要确定其中第k个最大者,我们称之为选择问题,那么这个程序如何编写?最直观地,至少有两种思路:1、将N个数读入一个数组中,再通过某种简单的算法,比如冒泡排序法,以递减顺序将数组排序,则第k个位置上的元素就是我们需要的元素2、稍微好一些的做法,将k个元素读入数组并以递减顺序排序,接着将接下来的元素再逐个读入,当新元素被读到时,如果它小于数组中的第k个元转载 2016-04-22 15:37:38 · 759 阅读 · 0 评论 -
八大排序算法
排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。我们这里说说八大排序就是内部排序。当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序序。快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时转载 2016-07-22 14:44:17 · 260 阅读 · 0 评论 -
浅谈算法和数据结构:栈和队列
最近晚上在家里看Algorithems,4th Edition,我买的英文版,觉得这本书写的比较浅显易懂,而且“图码并茂”,趁着这次机会打算好好学习做做笔记,这样也会印象深刻,这也是写这一系列文章的原因。另外普林斯顿大学在Coursera 上也有这本书同步的公开课,还有另外一门算法分析课,这门课程的作者也是这本书的作者,两门课都挺不错的。计算机程序离不开算法和数据结构,本文简单介绍栈(St转载 2016-07-15 10:22:44 · 293 阅读 · 0 评论 -
4 张 GIF 图帮助你理解二叉查找树
二叉查找树(Binary Search Tree),也称二叉搜索树,是指一棵空树或者具有下列性质的二叉树:任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;任意节点的左、右子树也分别为二叉查找树;没有键值相等的节点。二叉查找树相比于其他数据结构的优势在于查找、插入的时间复杂度较低。为O(log n)。二叉转载 2016-07-28 18:16:58 · 560 阅读 · 1 评论 -
史上最清晰的红黑树讲解(上)
本文以Java TreeMap为例,从源代码层面,结合详细的图解,剥茧抽丝地讲解红黑树(Red-Black tree)的插入,删除以及由此产生的调整过程。总体介绍Java TreeMap实现了SortedMap接口,也就是说会按照key的大小顺序对Map中的元素进行排序,key大小的评判可以通过其本身的自然顺序(natural ordering),也可以通过构造时传入的比较器(Compar转载 2016-10-21 14:25:38 · 452 阅读 · 0 评论 -
史上最清晰的红黑树讲解(下)
上一篇文章史上最清晰的红黑树讲解(上)对JavaTreeMap的插入以及插入之后的调整过程给出了详述。本文接着以Java TreeMap为例,从源码层面讲解红黑树的删除,以及删除之后的调整过程。如果还没有看过上一篇文章,请在阅读本文之前大致浏览一下前文,以方便理解。寻找节点后继对于一棵二叉查找树,给定节点t,其后继(树种比大于t的最小的那个元素)可以通过如下方式找到:t的右转载 2016-10-21 14:33:19 · 490 阅读 · 0 评论 -
算法复杂度速查表
算法复杂度这件事这篇文章覆盖了计算机科学里面常见算法的时间和空间的大 OBig-O 复杂度。我之前在参加面试前,经常需要花费很多时间从互联网上查找各种搜索和排序算法的优劣,以便我在面试时不会被问住。最近这几年,我面试了几家硅谷的初创企业和一些更大一些的公司,如 Yahoo、eBay、LinkedIn 和 Google,每次我都需要准备这个,我就在问自己,“为什么没有人创建一个漂亮的大转载 2016-11-18 18:26:08 · 427 阅读 · 0 评论 -
队列
可能大家都知道,线性表的变种非常非常多,比如今天讲的“队列”,灰常有意思啊。一:概念 队列是一个”先进先出“的线性表,牛X的名字就是“First in First Out(FIFO)”, 生活中有很多这样的场景,比如读书的时候去食堂打饭时的”排队“。当然我们拒绝插队。二:存储结构 前几天也说过,线性表有两种”存储结构“,① 顺转载 2016-05-10 11:30:44 · 370 阅读 · 0 评论 -
线性表(下)
一:线性表的简单回顾 上一篇跟大家聊过“线性表"顺序存储,通过实验,大家也知道,如果我每次向顺序表的头部插入元素,都会引起痉挛,效率比较低下,第二点我们用顺序存储时,容易受到长度的限制,反之就会造成空间资源的浪费。二:链表 对于顺序表存在的若干问题,链表都给出了相应的解决方案。1. 概念:其实链表的“每个节点”都包含一个”数据域“和”指针域“。转载 2016-05-10 11:26:50 · 220 阅读 · 0 评论 -
线性表(上)
人活在社会上不可能孤立,比如跟美女有着千丝万缕的关系,有的是一对一,有的是一对多,有的是多对多。哈哈,我们的数据也一样,存在这三种基本关系,用术语来说就是: 线性关系。 树形关系。 网状关系。一: 线性表 1 概念: 线性表也就是关系户中最简单的一种关系,一对一。 如:学生学号的集转载 2016-05-10 11:24:20 · 233 阅读 · 0 评论 -
树操作(下):赫夫曼树
今天说下最后一种树,大家可否知道,文件压缩程序里面的核心结构,核心算法是什么?或许你知道,他就运用了赫夫曼树。听说赫夫曼胜过了他的导师,被认为”青出于蓝而胜于蓝“,这句话也是我比较欣赏的,嘻嘻。一 概念 了解”赫夫曼树“之前,几个必须要知道的专业名词可要熟练记住啊。 1: 结点的权 “权”就相当于“重要度”,我们形象的用一个具体的数字转载 2016-05-10 15:25:16 · 378 阅读 · 0 评论 -
图(上)
今天来分享一下图,这是一种比较复杂的非线性数据结构,之所以复杂是因为他们的数据元素之间的关系是任意的,而不像树那样被几个性质定理框住了,元素之间的关系还是比较明显的,图的使用范围很广的,比如网络爬虫,求最短路径等等,不过大家也不要胆怯,越是复杂的东西越能体现我们码农的核心竞争力。 既然要学习图,得要遵守一下图的游戏规则。一: 概念 图是由转载 2016-05-10 15:37:52 · 252 阅读 · 0 评论 -
图(下)
今天是大结局,说下“图”的最后一点东西,“最小生成树“和”最短路径“。一: 最小生成树1. 概念 首先看如下图,不知道大家能总结点什么。对于一个连通图G,如果其全部顶点和一部分边构成一个子图G1,当G1满足: ① 刚好将图中所有顶点连通。②顶点不存在回路。则称G1就是G的“生成树”。 其实一句话总结就是:生成树是将原图的全部顶点以最转载 2016-05-10 15:43:13 · 261 阅读 · 0 评论 -
1.交换排序:冒泡排序和快速排序
算法系列15天速成——第一天 七大经典排序【上】今天是开篇,得要吹一下算法,算法就好比程序开发中的利剑,所到之处,刀起头落。针对现实中的排序问题,算法有七把利剑可以助你马道成功。首先排序分为四种: 交换排序: 包括冒泡排序,快速排序。 选择排序: 包括直接选择排序,堆排序。 插入排序: 包括直接插入排序,希尔排序。转载 2016-05-10 10:44:13 · 446 阅读 · 0 评论 -
2.选择排序:直接选择排序和堆排序
首先感谢朋友们对第一篇文章的鼎力支持,感动中....... 今天说的是选择排序,包括“直接选择排序”和“堆排序”。话说上次“冒泡排序”被快排虐了,而且“快排”赢得了内库的重用,众兄弟自然眼红,非要找快排一比高下。这不今天就来了两兄弟找快排算账。1.直接选择排序: 先上图:说实话,直接选择排序最类似于人的本能思想,比如把大小不一的玩具让三岁小毛孩对大小排个转载 2016-05-10 10:44:59 · 705 阅读 · 0 评论 -
3.直接插入排序,希尔排序,归并排序
直接插入排序: 这种排序其实蛮好理解的,很现实的例子就是俺们斗地主,当我们抓到一手乱牌时,我们就要按照大小梳理扑克,30秒后, 扑克梳理完毕,4条3,5条s,哇塞...... 回忆一下,俺们当时是怎么梳理的。 最左一张牌是3,第二张牌是5,第三张牌又是3,赶紧插到第一张牌后面去,第四张牌又是3,大喜,赶紧插到第二张后面去, 第五张牌又是3,狂喜,哈转载 2016-05-10 10:46:27 · 350 阅读 · 0 评论 -
查找(一):线性查找之顺序查找和折半查找
在我们的生活中,无处不存在着查找,比如找一下班里哪个mm最pl,猜一猜mm的芳龄....... 对的这些都是查找。在我们的算法中,有一种叫做线性查找。分为:顺序查找。 折半查找。查找有两种形态:分为:破坏性查找, 比如有一群mm,我猜她们的年龄,第一位猜到了是23+,此时这位mm已经从我脑海里面的mmlist中remove掉了。转载 2016-05-10 10:56:06 · 452 阅读 · 0 评论 -
查找(二):哈希查找和索引查找
大家可否知道,其实查找中有一种O(1)的查找,即所谓的秒杀。哈希查找: 对的,他就是哈希查找,说到哈希,大家肯定要提到哈希函数,呵呵,这东西已经在我们脑子里面形成固有思维了。大家一定要知道“哈希“中的对应关系。 比如说: ”5“是一个要保存的数,然后我丢给哈希函数,哈希函数给我返回一个”2",那么此时的”5“和“2”就建立一种对应关系,这种关系就是所谓的“转载 2016-05-10 11:06:16 · 1055 阅读 · 0 评论 -
查找(三):二叉查找树
大家是否感觉到,树在数据结构中大行其道,什么领域都要沾一沾,碰一碰。就拿我们前几天学过的排序就用到了堆和今天讲的”二叉排序树“,所以偏激的说,掌握的树你就是牛人了。今天就聊聊这个”五大经典查找“中的最后一个”二叉排序树“。1. 概念: 其实很简单,若根节点有左子树,则左子树的所有节点都比根节点小。 若根节转载 2016-05-10 11:09:44 · 338 阅读 · 0 评论 -
面试中的排序算法总结
前言 查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中。因为其实现代码较短,应用较常见。所以在面试中经常会问到排序算法及其相关的问题。但万变不离其宗,只要熟悉了思想,灵活运用也不是难事。一般在面试中最常考的是快速排序和归并排序,并且经常有面试官要求现场写出这两种排序的代码。对这两种排序的代码一定要信手拈来才行。还有插入排序、冒泡排序、堆排序、基数排序、桶排序等。面试官对于这些排转载 2016-05-06 15:42:56 · 413 阅读 · 1 评论