
数据结构和算法
roseduan
个人微信公众号:【roseduan写字的地方】,技术之外,咱们聊聊人生琐碎。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Java 中的 PriorityQueue 源码分析
一、概述 顾名思义,PriorityQueue 是一个队列,队列的特点是先进先出,后进后出,和现实生活中的排队场景非常的类似。而优先级队列是一个比较特殊的队列,它的入队普通的队列没有区别,而出队操作不是先来后到了,而是有优先级的,优先级高的先出队。 下面的代码描述了 Java 中的 PriorityQueue 的基本使用方法: Queue<Integer> queue = new PriorityQueue<>(); queue.add(1); //入队 queue.ad原创 2020-09-12 19:59:02 · 290 阅读 · 0 评论 -
数据结构与算法——队列
1. 概述 前面说完了栈,接下来再看看另一种很基础的数据结构,队列。顾名思义,队列跟我们现实生活中的排队很相似:例如我们在食堂排队打饭,先来的先打到,后来的只能一次排在后面,不允许插队。很明显,队列的操作也是受限的,插入元素(入队)只能在队尾,删除元素(出队)只能在队头。结合下面的图就很容易理解了: 2. 队列实现 和栈一样,队列也有两种实现方式,使用数组实现的队列叫做顺序队列,使用链表...原创 2019-02-13 21:19:45 · 376 阅读 · 0 评论 -
数据结构与算法——散列表
1. 什么是散列表? 散列表(Hash Table)又叫做哈希表,是一种很常用的数据结构。散列表其实是基于数组实现的,可以说,没有数组就没有散列表。先来举一个简单的例子,来认识一下什么是散列表。 假如在学校的运动会上,每个运动员的胸前都会标识自己的号码,编号是1,2,3……,这样的话,我们可以很容易的将运动员信息存储在数组当中,运动员的编号就是数组的下标。但是会存在这样一种情况,假如运动员的编...原创 2019-02-28 20:36:36 · 407 阅读 · 0 评论 -
数据结构与算法——二叉树(上)
1. 什么是树? 前面说到的几种数据结构都是线性的,例如链表、栈、队列等,今天就来学习一种非线性的数据结构——树。先来看看几种树的结构 有没有发现,其实树这种结构跟我们现实生活中的“树”非常的相似,像上图中的这棵“树”,节点 A 称作 B 和 C 的父节点,节点 B 和 C 在同一级,叫做兄弟节点。没有父节点的 A 节点叫做根节点,没有子节点的节点叫做叶子节点或叶节点,例如图中的 D E F...原创 2019-03-02 12:36:10 · 378 阅读 · 0 评论 -
数据结构与算法——二叉树(下)
1. 概述 前面的文章说到了二叉树,其实今天讲的二叉搜索(查找)树就是二叉树最常用的一种形式,它支持高效的查找、插入、删除操作,它的定义是这样的:对于树中的任意一个节点,其左子节点值必须小于该节点,其右子节点必须大于该节点。例如下图中的几种树都是二叉查找树: 2. 二叉搜索树的查找 我们直接拿查找的数据和根节点数据作比较,如果大于根节点,则在右子树中递归查找,如果小于根节点,则在左子树中...原创 2019-03-03 12:49:17 · 509 阅读 · 0 评论 -
数据结构与算法——堆
1. 什么是堆 堆(Heap),其实是一种特殊的二叉树,主要满足了二叉树的两个条件:’ 堆是一种完全二叉树,还记得完全二叉树的定义吗?叶节点都在最底下两层,最后一层的节点都靠左排列,并且除了最后一层,其他层的节点个数都要达到最大,这种树叫做完全二叉树。 堆中的每个节点的值都必须大于等于(或者小于等于)其左右子节点的值。2. 堆中的每个节点的值都必须大于等于(或者小于等于)其左右子节点的值。 ...原创 2019-03-10 12:03:53 · 559 阅读 · 0 评论 -
数据结构与算法——图
1. 什么是图? 前面说完了树这种数据结构,接下来在看看一种更加复杂的非线性数据结构——图。 先看看下面图这种数据结构的图片演示吧: 像上图这样的数据结构就叫做图了,图中的每个节点叫做 顶点 ,各个顶点之间的连接关系叫做 边 ,每个顶点有多少条边,叫做这个顶点的 度 。其实图这种数据结构比较适合用来存储我们常用的微信、微博好友关系。例如存储微信好友,例如两个人互加了微信,就相当于在两个顶点...原创 2019-03-19 20:43:30 · 495 阅读 · 0 评论 -
数据结构与算法——堆的应用
1. 概述 前面说完了堆这种数据结构,并且讲到了它很经典的一个应用:堆排序,其实堆这种数据结构还有其他很多的应用,今天就一起来看看,主要有下列内容: 优先级队列 求 Top K 问题 求中位数 2. 优先级队列 优先级队列是一种特殊的队列,前面学习队列的时候,说到队列满足 先进先出,后进后出 的特点,优先级队列则不是这样。优先级队列中的数据,出队的顺序是有优先级的,优先级高的,先出...原创 2019-03-17 11:33:51 · 388 阅读 · 0 评论 -
数据结构与算法——广度和深度优先搜索
1. 概论 前面说到了图这种非线性的数据结构,并且我使用了代码,简单演示了图是如何实现的。今天就来看看基于图的两种搜索算法,分别是广度优先搜索和深度优先搜索算法,这两个算法都十分的常见,在平常的面试当中也可能遇到。 在图上面的搜索算法,其实主要的表现形式就是从图中的一个顶点,找到和另一个顶点之间的路径,而两种搜索算法,都是解决这个问题的。 2. 广度优先搜索 广度优先搜索的基本思路就是从一...原创 2019-03-27 20:46:56 · 915 阅读 · 0 评论 -
十大排序算法总结
前言 排序算法中涉及到了两个概念: 原地排序:根据算法对内存的消耗情况,可以将算法分为原地排序和非原地排序,原地排序特指空间复杂度为 O(1) 的排序。 排序算法的稳定性:例如排序一个数组 [1, 5, 3, 7, 4, 9, 5],数组中有两个 5,排序之后是 [1, 3, 4, 5, 5, 7, 9],如果排序之后的两个 5 的前后顺序没有发生变化,那么称这个排序是稳定的,反之则是不稳定的...原创 2019-07-08 15:46:33 · 511 阅读 · 0 评论 -
数据结构与算法——跳表
1. 概述 前面说到了二分查找,并且它是基于顺序表结构的,即数组,如果直接用于链表,时间复杂度会比较的高,是 O(logn),一般我们不会这样做。那么有没有基于链表的二分查找呢?答案就是今天说到的跳跃链表。 2. 跳表长什么样子? 对于一般的链表,我们进行查找的话,需要遍历整个链表,就像下面这样:如果我们要找节点 9 ,需要遍历 9 个节点。 如果我们在原始链表之上建立一级链表,会是什么...原创 2019-02-27 22:14:27 · 709 阅读 · 0 评论 -
数据结构与算法——二分查找练习
1. 概述 前面说到了二分查找问题,看起来非常的简单,的确,前面的两种实现都不难,代码也很容易写,因为那只是最基础的二分查找问题了。今天来看看几种稍微复杂的二分查找问题: 查找第一个等于给定值的元素 查找最后一个等于给定值的元素 查找第一个大于等于给定值的元素 查找最后一个小于等于给定值的元素 1. 查找第一个等于给定值的元素 假如有一个数组 data[1,3,5,5,5,7,8,10...原创 2019-02-17 16:08:29 · 395 阅读 · 0 评论 -
数据结构与算法——二分查找
1. 二分查找的思想 二分查找是一种使用十分普遍的查找算法,其基本的思路也非常的简单,在一个有序的数据集合中,我们想要查找某个数据,直接取最中间的那个数据,将它和要找的数据进行比较,如果较大,则在更大的那个数值区间继续取中间值查找,反之亦然。 例如我们要在一个有序的集合里[1,3,5,6,7,8,10],查找5这个值,那么二分查找的过程就如下图所示,经过三次查找操作就能够找到。 2. 二分...原创 2019-02-16 20:03:35 · 918 阅读 · 0 评论 -
数据结构与算法——冒泡排序
1.导言 因为这是排序算法系列的第一篇文章,所以多啰嗦几句。 排序是很常见的算法之一,现在很多编程语言都集成了一些排序算法,比如Java 的Arrays.sort()方法,这种方式让我们可以不在乎内部实现细节而直接调用,在实际的软件开发当中也会经常使用到。但是站在开发者的角度而言,知其然必须知其所以然。多练练排序算法,不仅能够让我们知道一些排序方法的底层实现细节,更能够锻炼我们的思维,提升编程能力...原创 2019-01-12 16:19:52 · 366 阅读 · 0 评论 -
数据结构与算法——选择排序和插入排序
1.回顾 前面说到了冒泡排序,这是一种时间复杂度为 O(n2) 、是原地排序和稳定的的排序算法,具体思路是:根据相邻两个元素之间比较大小,然后交换位置,得出最后排序的结果。具体可参考我写的这一篇文章:数据结构与算法——冒泡排序,今天来看看另外两种基础的排序算法:选择排序和插入排序。 2.选择排序 先来看看选择排序,选择排序的思路其实很简单,将排序的数据分为已排序区间和未排序区间,一般是以第一个元素...原创 2019-01-13 16:04:36 · 530 阅读 · 0 评论 -
数据结构与算法——希尔、归并、快速排序
1. 回顾 前面说完了三种较为简单的排序算法,分别是冒泡排序,选择排序和插入排序,它们的平均情况时间复杂度都是 O(n2),比较的高,适合小规模的数据排序,其中插入排序的效率稍高,所以更推荐使用插入排序。今天再来看看另外三种时间复杂度都是 O(nlogn) 的排序算法,分别是希尔排序、归并排序和快速排序。其中后两者的应用非常的广泛。 2. 希尔排序 先来看看希尔排序,它是较早突破 O(n2) 的时...原创 2019-01-20 11:52:36 · 344 阅读 · 0 评论 -
数据结构与算法——线性排序
1. 回顾 前面已经说完了几种非线性排序,它们分别是时间复杂度为 O(n2) 、适合小规模数据的冒泡排序、选择排序、插入排序,和应用较广泛的时间复杂度为 O(nlogn) 的希尔排序、归并排序、快速排序。其实这几种排序都有一个特性,那就是它们都是基于数据的比较和移动,而今天介绍的这几种线性排序,他们的时间复杂度都是 O(n) ,因为不涉及到数据的比较和移动。 2. 桶排序 桶排序的思路是:将要排序...原创 2019-01-26 13:44:06 · 469 阅读 · 0 评论 -
数据结构与算法——数组
1. 概述 数组(Array)是一种很基础的数据结构,几乎绝大多数编程语言都会支持数组这种数据结构。数组是一种线性结构,使用一组连续的内存空间,来存储相同类型的数据。 所谓线性结构,就是指数据是前后排列的,只有前后两个方向,除了数组,其他的比如链表、栈、队列都是线性结构。 因为数组是使用连续的内存空间来存储数据的,所以数组的最大的特点就是支持根据下标随机访问数据,这是数组最大的优势。但是,有利...原创 2019-01-26 20:44:31 · 471 阅读 · 0 评论 -
数据结构与算法——链表
1. 概述 前面说到了数组,利用连续的内存空间来存储相同类型的数据,其最大的特点是支持下标随机访问,但是删除和插入的效率很低。今天来看另一种很基础的数据结构——链表。链表不需要使用连续的内存空间,它使用指针将不连续的内存块连接起来,形成一种链式结构。 2. 单链表 首先来看看单链表,存储数据的内存块叫做节点,每个节点保存了一个 next 指针,指向下一个节点的内存地址,结合下图你就很容易看...原创 2019-01-27 14:17:13 · 467 阅读 · 0 评论 -
数据结构与算法——栈
1. 概述 今天来看看栈这种线性数据结构,非常的基础,我举个例子你就能明白了。比如你桌子上堆放的一摞文件,最先放的在最下面,拿的时候也是最后拿,最后放的在最上面,拿的时候也先拿到。这种满足了 先进后出,后进先出 特点的数据结构,就叫做栈。 相信结合上图你能够看到,栈这种数据结构,插入和删除的操作都被局限在了栈的一端,插入数据叫做入栈,删除数据叫做出栈。 2. 栈的实现 栈有两种实现方式,...原创 2019-02-07 15:08:13 · 920 阅读 · 0 评论 -
数据结构与算法——单链表练习
1. 概述 前面的文章说到了一种很基础的数据结构——链表:数据结构与算法——链表,今天就来看看关于单链表的几种常见的操作,技术笔试的时候很大概率能够遇到其中的一些。多练习一下,对我们理解链表有很大的帮助,也能够提升我们的编码能力。 废话不多说,这几个练习题是: 单链表反转 合并两个有序链表 检测链表中的环 删除链表倒数第 k 个节点 找到链表的中间节点 2. 单链表反转 单链表反转,顾...原创 2019-02-16 15:29:14 · 397 阅读 · 0 评论