数据结构与算法——系列教程
很多人都知道,数据结构与算法很重要,但是从来没有接触,或是浅尝辄止,难以有效的坚持下去。通过这个系列教程,让我们翻过数据结构与算法这道坎!
roseduan
个人微信公众号:【roseduan写字的地方】,技术之外,咱们聊聊人生琐碎。
展开
-
广度和深度优先搜索
搜索是树或者图等数据结构的基础算法之一,很多时候我们需要在树或者图中寻找特定的节点,那么使用到的最基础的、也是最容易理解的两种方式便是广度和深度优先搜索。在开始阅读之前,做为预备知识,你可以先了解一下关于树和图这两种数据结构的基本概念,参考 Wikipedia 上面的介绍:Wikipedia——树(数据结构)Wikipedia——图(数据结构)以及其他一些优秀的文章:https://segmentfault.com/a/1190000010794621https://www.cnblogs.co原创 2020-06-26 10:47:48 · 1639 阅读 · 0 评论 -
经典排序算法分析
排序指的是将一组对象按照特定的逻辑顺序重新排列的过程,排序的应用十分广泛,可以说是无处不在,它在商业数据处理和现代科学计算中发挥着举足轻重的作用,目前已知的应用最广泛的排序算法—快速排序,更是被誉为了 20 世纪科学和工程领域的十大算法之一。排序算法有很多,有比较常见的有比如插入排序、归并排序、快速排序,就是我接下来会讲解的这几种;也有一些非常冷门的排序算法,有一些可能你连名字都没听过,例如鸡尾酒排序、侏儒排序、图书馆排序、耐心排序、臭皮匠排序等等……这篇文章的篇幅较长,涉及到大量图例、证明、代码示例,原创 2020-06-06 11:30:55 · 539 阅读 · 0 评论 -
字符串匹配之 BM 算法
一、基本概念字符串匹配是计算机科学领域中最古老、研究最广泛的问题之一,层出不穷的前辈们也总结了非常多经典的优秀算法,例如 BF 算法、RK 算法、BM 算法、KMP 算法,今天我介绍的主角是 BM 算法。字符串匹配可以简单概括为前缀匹配,后缀匹配,子串匹配,下面的讲解我都以最常见的子串匹配为例。子串匹配的概念很简单,一句话解释就是:在一个字符串 A 中寻找另一个字符串 B,这里的字符串 A 可...原创 2020-04-19 17:23:29 · 916 阅读 · 1 评论 -
数据结构与算法——堆
1. 什么是堆堆(Heap),其实是一种特殊的二叉树,主要满足了二叉树的两个条件:’堆是一种完全二叉树,还记得完全二叉树的定义吗?叶节点都在最底下两层,最后一层的节点都靠左排列,并且除了最后一层,其他层的节点个数都要达到最大,这种树叫做完全二叉树。堆中的每个节点的值都必须大于等于(或者小于等于)其左右子节点的值。2. 堆中的每个节点的值都必须大于等于(或者小于等于)其左右子节点的值。...原创 2019-03-10 12:03:53 · 519 阅读 · 0 评论 -
数据结构与算法——二叉树(下)
1. 概述前面的文章说到了二叉树,其实今天讲的二叉搜索(查找)树就是二叉树最常用的一种形式,它支持高效的查找、插入、删除操作,它的定义是这样的:对于树中的任意一个节点,其左子节点值必须小于该节点,其右子节点必须大于该节点。例如下图中的几种树都是二叉查找树:2. 二叉搜索树的查找我们直接拿查找的数据和根节点数据作比较,如果大于根节点,则在右子树中递归查找,如果小于根节点,则在左子树中...原创 2019-03-03 12:49:17 · 492 阅读 · 0 评论 -
数据结构与算法——二叉树(上)
1. 什么是树?前面说到的几种数据结构都是线性的,例如链表、栈、队列等,今天就来学习一种非线性的数据结构——树。先来看看几种树的结构有没有发现,其实树这种结构跟我们现实生活中的“树”非常的相似,像上图中的这棵“树”,节点 A 称作 B 和 C 的父节点,节点 B 和 C 在同一级,叫做兄弟节点。没有父节点的 A 节点叫做根节点,没有子节点的节点叫做叶子节点或叶节点,例如图中的 D E F...原创 2019-03-02 12:36:10 · 352 阅读 · 0 评论 -
数据结构与算法——散列表
1. 什么是散列表?散列表(Hash Table)又叫做哈希表,是一种很常用的数据结构。散列表其实是基于数组实现的,可以说,没有数组就没有散列表。先来举一个简单的例子,来认识一下什么是散列表。假如在学校的运动会上,每个运动员的胸前都会标识自己的号码,编号是1,2,3……,这样的话,我们可以很容易的将运动员信息存储在数组当中,运动员的编号就是数组的下标。但是会存在这样一种情况,假如运动员的编...原创 2019-02-28 20:36:36 · 373 阅读 · 0 评论 -
数据结构与算法——跳表
1. 概述前面说到了二分查找,并且它是基于顺序表结构的,即数组,如果直接用于链表,时间复杂度会比较的高,是 O(logn),一般我们不会这样做。那么有没有基于链表的二分查找呢?答案就是今天说到的跳跃链表。2. 跳表长什么样子?对于一般的链表,我们进行查找的话,需要遍历整个链表,就像下面这样:如果我们要找节点 9 ,需要遍历 9 个节点。如果我们在原始链表之上建立一级链表,会是什么...原创 2019-02-27 22:14:27 · 668 阅读 · 0 评论 -
数据结构与算法——二分查找练习
1. 概述前面说到了二分查找问题,看起来非常的简单,的确,前面的两种实现都不难,代码也很容易写,因为那只是最基础的二分查找问题了。今天来看看几种稍微复杂的二分查找问题:查找第一个等于给定值的元素查找最后一个等于给定值的元素查找第一个大于等于给定值的元素查找最后一个小于等于给定值的元素1. 查找第一个等于给定值的元素假如有一个数组 data[1,3,5,5,5,7,8,10...原创 2019-02-17 16:08:29 · 380 阅读 · 0 评论 -
数据结构与算法——二分查找
1. 二分查找的思想二分查找是一种使用十分普遍的查找算法,其基本的思路也非常的简单,在一个有序的数据集合中,我们想要查找某个数据,直接取最中间的那个数据,将它和要找的数据进行比较,如果较大,则在更大的那个数值区间继续取中间值查找,反之亦然。例如我们要在一个有序的集合里[1,3,5,6,7,8,10],查找5这个值,那么二分查找的过程就如下图所示,经过三次查找操作就能够找到。2. 二分...原创 2019-02-16 20:03:35 · 834 阅读 · 0 评论 -
数据结构与算法——单链表练习
1. 概述前面的文章说到了一种很基础的数据结构——链表:数据结构与算法——链表,今天就来看看关于单链表的几种常见的操作,技术笔试的时候很大概率能够遇到其中的一些。多练习一下,对我们理解链表有很大的帮助,也能够提升我们的编码能力。废话不多说,这几个练习题是:单链表反转合并两个有序链表检测链表中的环删除链表倒数第 k 个节点找到链表的中间节点2. 单链表反转单链表反转,顾...原创 2019-02-16 15:29:14 · 373 阅读 · 0 评论 -
数据结构与算法——队列
1. 概述前面说完了栈,接下来再看看另一种很基础的数据结构,队列。顾名思义,队列跟我们现实生活中的排队很相似:例如我们在食堂排队打饭,先来的先打到,后来的只能一次排在后面,不允许插队。很明显,队列的操作也是受限的,插入元素(入队)只能在队尾,删除元素(出队)只能在队头。结合下面的图就很容易理解了:2. 队列实现和栈一样,队列也有两种实现方式,使用数组实现的队列叫做顺序队列,使用链表...原创 2019-02-13 21:19:45 · 346 阅读 · 0 评论 -
数据结构与算法——栈
1. 概述今天来看看栈这种线性数据结构,非常的基础,我举个例子你就能明白了。比如你桌子上堆放的一摞文件,最先放的在最下面,拿的时候也是最后拿,最后放的在最上面,拿的时候也先拿到。这种满足了 先进后出,后进先出 特点的数据结构,就叫做栈。相信结合上图你能够看到,栈这种数据结构,插入和删除的操作都被局限在了栈的一端,插入数据叫做入栈,删除数据叫做出栈。2. 栈的实现栈有两种实现方式,...原创 2019-02-07 15:08:13 · 884 阅读 · 0 评论 -
数据结构与算法——链表
1. 概述前面说到了数组,利用连续的内存空间来存储相同类型的数据,其最大的特点是支持下标随机访问,但是删除和插入的效率很低。今天来看另一种很基础的数据结构——链表。链表不需要使用连续的内存空间,它使用指针将不连续的内存块连接起来,形成一种链式结构。2. 单链表首先来看看单链表,存储数据的内存块叫做节点,每个节点保存了一个 next 指针,指向下一个节点的内存地址,结合下图你就很容易看...原创 2019-01-27 14:17:13 · 436 阅读 · 0 评论 -
数据结构与算法——数组
1. 概述数组(Array)是一种很基础的数据结构,几乎绝大多数编程语言都会支持数组这种数据结构。数组是一种线性结构,使用一组连续的内存空间,来存储相同类型的数据。所谓线性结构,就是指数据是前后排列的,只有前后两个方向,除了数组,其他的比如链表、栈、队列都是线性结构。因为数组是使用连续的内存空间来存储数据的,所以数组的最大的特点就是支持根据下标随机访问数据,这是数组最大的优势。但是,有利...原创 2019-01-26 20:44:31 · 435 阅读 · 0 评论 -
数据结构与算法——线性排序
1. 回顾前面已经说完了几种非线性排序,它们分别是时间复杂度为 O(n2) 、适合小规模数据的冒泡排序、选择排序、插入排序,和应用较广泛的时间复杂度为 O(nlogn) 的希尔排序、归并排序、快速排序。其实这几种排序都有一个特性,那就是它们都是基于数据的比较和移动,而今天介绍的这几种线性排序,他们的时间复杂度都是 O(n) ,因为不涉及到数据的比较和移动。2. 桶排序桶排序的思路是:将要排序...原创 2019-01-26 13:44:06 · 434 阅读 · 0 评论 -
数据结构与算法——希尔、归并、快速排序
1. 回顾前面说完了三种较为简单的排序算法,分别是冒泡排序,选择排序和插入排序,它们的平均情况时间复杂度都是 O(n2),比较的高,适合小规模的数据排序,其中插入排序的效率稍高,所以更推荐使用插入排序。今天再来看看另外三种时间复杂度都是 O(nlogn) 的排序算法,分别是希尔排序、归并排序和快速排序。其中后两者的应用非常的广泛。2. 希尔排序先来看看希尔排序,它是较早突破 O(n2) 的时...原创 2019-01-20 11:52:36 · 325 阅读 · 0 评论 -
数据结构与算法——选择排序和插入排序
1.回顾前面说到了冒泡排序,这是一种时间复杂度为 O(n2) 、是原地排序和稳定的的排序算法,具体思路是:根据相邻两个元素之间比较大小,然后交换位置,得出最后排序的结果。具体可参考我写的这一篇文章:数据结构与算法——冒泡排序,今天来看看另外两种基础的排序算法:选择排序和插入排序。2.选择排序先来看看选择排序,选择排序的思路其实很简单,将排序的数据分为已排序区间和未排序区间,一般是以第一个元素...原创 2019-01-13 16:04:36 · 505 阅读 · 0 评论 -
数据结构与算法——冒泡排序
1.导言因为这是排序算法系列的第一篇文章,所以多啰嗦几句。排序是很常见的算法之一,现在很多编程语言都集成了一些排序算法,比如Java 的Arrays.sort()方法,这种方式让我们可以不在乎内部实现细节而直接调用,在实际的软件开发当中也会经常使用到。但是站在开发者的角度而言,知其然必须知其所以然。多练练排序算法,不仅能够让我们知道一些排序方法的底层实现细节,更能够锻炼我们的思维,提升编程能力...原创 2019-01-12 16:19:52 · 338 阅读 · 0 评论