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