
数据结构
用Java语言实现数据结构的大部分概念和知识。
学哥斌
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
[数据结构与算法-01]稀疏数组和队列
1、稀疏数组(SparseArray)1.1 需求场景 存在一个黑白棋盘,需要对棋盘数据进行存储和读取。 粗暴的解决方案:把棋盘看成是一个二维数组。 存在的问题:该二维数组存在大量的默认值0,因此记录了很多没有意义的数据。 比较优雅的解决方案:使用稀疏数组对棋盘数组进行压缩。1.2 基本介绍 当一个数组中大部分元素为默认值时,可以使用稀疏数组来保存该数组。 稀疏数组的...原创 2020-03-30 20:06:42 · 333 阅读 · 0 评论 -
[数据结构与算法-02]链表
文章目录1、链表基本介绍2、单向链表2.1 单向链表的结点类2.2 单向链表类2.3 测试类3、双向链表3.1 双向链表的结点类3.2 双向链表类3.3 测试类1、链表基本介绍 链表是有序的列表,在内存中的存储如下: 1、链表是以结点的方式来存储,是链式存储; 2、每个结点都包含data域、next域; 3、链表的每个结点在存储上不一定连续; 4、链表分带头结点和不带头结点...原创 2020-03-31 23:05:56 · 212 阅读 · 1 评论 -
[数据结构与算法-03]栈
文章目录1、栈的基本介绍2、应用场景3、数组模拟栈4、栈的运用4.1 利用栈实现简单整数计算器功能4.2 后缀表达式4.2.1 逆波兰计算器4.2.2 中缀转后缀4.2.3 代码实现1、栈的基本介绍 栈的英文为stack,是一个先入后出的有序列表。栈是限制性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端叫做变化的一端,称为栈顶(Top),固定的一端称为栈底...原创 2020-04-02 19:57:08 · 405 阅读 · 0 评论 -
[数据结构与算法-04]递归
文章目录1、递归的概念2、递归要遵守的重要规则3、递归的运用3.1 迷宫问题3.1.1 问题描述3.1.2 代码实现3.3 八皇后问题3.3.1 问题描述3.3.2 算法思路3.3.3 代码实现1、递归的概念 简单来说,递归就是方法自己调用自己,每次调用时传入不同的变量,递归有助于编程者解决复杂的问题,同时可以让代码变得更简洁。代价就是当递归次数过高时会占用过多的计算机资源。2、递归要遵...原创 2020-04-03 19:14:52 · 339 阅读 · 0 评论 -
[数据结构与算法-05]排序算法之冒泡排序
文章目录1、基本思想2、图解3、例子演示4、时间复杂度5、代码实现6、测试1、基本思想 通过对待排序序列从前向后,依此比较相邻元素的值,若发现逆序,则使较大的元素逐渐向后移,就像水底下的气泡一样逐渐往上冒。当一轮排序下来没有元素交换过,则说明序列有序了。2、图解3、例子演示 原始数组:{12,3,9,11,29,-3} 第一步:比较下标:0 和 1,发现前面较大,于是交换。...原创 2020-04-05 20:57:33 · 230 阅读 · 1 评论 -
[数据结构与算法-06]排序算法之选择排序
文章目录1、基本思想2、图解3、例子演示4、代码实现5、测试6、时间复杂度7、稳定性1、基本思想 第一次从 arr[0] ~ arr[n-1] 中选取最小值,与 arr[0] 交换;第二次从 arr[1] ~ arr[n-1] 中选取最小值,与 arr[1] 交换;第三次从 arr[2] ~ arr[n-1] 中选取最小值,与 arr[2] 交换…。以此类推,总共通过 n - 1 次,得到一...原创 2020-04-06 00:35:18 · 225 阅读 · 0 评论 -
[数据结构与算法-07]排序算法之插入排序
文章目录1、基本思想2、图解3、代码实现4、时间复杂度5、稳定性6、测试1、基本思想 把n个待排序的元素看成一个有序表和一个无序表,开始时有序表只有一个元素(第一个),无序表中包含 n - 1 个元素(1,2,…,n-1),排序过程每次从无序表取出第一个元素,把它的值依次和有序表的元素进行比较,将它插入到有序表合适的位置,使之成为新的有序表。2、图解3、代码实现package cn....原创 2020-04-06 16:37:21 · 179 阅读 · 0 评论 -
[数据结构与算法-08]排序算法之希尔排序
文章目录1、基本思想2、图解3、代码实现4、时间复杂度5、稳定性6、测试1、基本思想 回顾插入排序,当待排序的序列逆序程度越高,在从有序部分找位置插入时,后移的次数明显增多,对效率有影响。 因此,希尔排序就是在简单插入排序基础上进行改进,得到更高效的版本,也成为缩小增量排序。对比简单插入排序,希尔排序对较大规模的数据或者逆序程度很高的数据都具有很高的效率。 希尔排序把待排序序列按下标...原创 2020-04-07 15:29:35 · 682 阅读 · 1 评论 -
[数据结构与算法-09]排序算法之快速排序
文章目录1、基本思想2、图解3、代码实现4、时间复杂度5、稳定性6、测试1、基本思想 快速排序是对冒泡排序的改进。通过一趟排序,将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个序列可以递归进行,以此达到整个数据变得有序序列。2、图解 首先,随便从数组选一个值(比如选最中间的值),然后把比这个值小的元素...原创 2020-04-07 17:30:44 · 204 阅读 · 0 评论 -
[数据结构与算法-10]排序算法之归并排序
文章目录1、基本思想2、图解3、代码实现4、时间复杂度5、稳定性6、测试1、基本思想 归并排序利用归并的思想实现排序,采用经典的分治策略,分阶段把问题拆分成一个个小的问题,然后递归秋节;治阶段则将分的阶段得到的答案进行“修补”在一起。即分而治之。2、图解 首先从整体上了解归并排序,可以看出,分的阶段先把序列拆封成多个子序列,治的阶段则是把子序列依此合并,最后得到一个排序好的序列。 ...原创 2020-04-07 19:17:49 · 691 阅读 · 0 评论 -
[数据结构与算法-11]排序算法之基数排序
文章目录1、基本思想2、图解3、代码实现4、时间复杂度5、稳定性6、测试1、基本思想 把待排序序列的数值统一为同样的数位长度,数位较短的数字在前面补零。然后从最低位开始,依此进行依此排序。这样从最低位排序一直到最高位排序完成后,数列就变成一个有序序列。 基数排序使用桶子法 2、图解3、代码实现4、时间复杂度5、稳定性6、测试...原创 2020-04-08 19:28:04 · 328 阅读 · 0 评论 -
[数据结构与算法-12]查找算法
文章目录1、线性查找1.1 原理1.2 代码实现2、二分查找2.1 原理2.2 代码实现3、插值查找3.1 原理3.2 代码实现4、斐波那契查找4.1 斐波那契数列4.2 mid取值策略4.3 代码实现1、线性查找1.1 原理 线性查找是最简单的查找方法,直接就是比较每一个元素,优点是对带搜索数列没有什么要求。1.2 代码实现package cn.klb.datastructures....原创 2020-04-09 22:25:47 · 213 阅读 · 0 评论 -
[数据结构与算法-13]哈希表
文章目录1、概念2、图解3、代码实现3.1 定义结点类3.2 定义链表类3.3 定义哈希表类4、测试类1、概念 哈希表,也称为散列表(Hash table),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做哈希函数(也称为散列函数),存放记录的数组叫做哈希表(也称为散列表)。2、图解...原创 2020-04-10 14:39:55 · 146 阅读 · 0 评论 -
[数据结构与算法-14]树的基础
文章目录1、树的概念1.1 为什么需要树这种数据结构1.2 树的常用术语2、二叉树2.1 二叉树的基本概念2.3 二叉树的代码实现2.3.1 定义一个结点类:2.3.2 定义二叉树并实现添加方法:2.3.3 二叉树的前序遍历2.3.4 二叉树的中序遍历2.3.5 二叉树的后序遍历2.3.6 二叉树查找指定结点2.3.6.1 前序查找2.3.6.2 中序查找2.3.6.3 后序查找3、顺序存储二叉树...原创 2020-04-13 20:23:47 · 348 阅读 · 0 评论 -
[数据结构与算法-15]堆排序
这里写目录标题1、堆结构2、完全二叉树调整为堆结构3、堆排序3.1 定义结点类3.2 代码实现堆排序3.3 测试1、堆结构 堆是完全二叉树,堆分为大顶堆和小顶堆。 每个结点的值都大于或等于其左右子结点的值,称为大顶堆;反之称为小顶堆。 用前面学到的顺序存储二叉树,讲这种逻辑结构映射到数组中就变成了: 从数组上讲,在没有超出索引情况下用公式来描述堆的定义就是: 大顶堆:ar...原创 2020-04-14 22:24:39 · 314 阅读 · 0 评论 -
[数据结构与算法-16]哈夫曼树和哈夫曼编码
文章目录1、先掌握几个概念1.1 什么是路径?1.2 什么是路径长度?1.3 什么是结点的带权路径长度?1.4 什么是树的带权路径长度?2、哈夫曼树2.1 概念2.2 图解构造哈夫曼树2.3 代码实现3、哈夫曼编码1、先掌握几个概念 先听一遍哈夫曼树的概念:给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度(WPL)达到最小,称这样的二叉树为最优二叉树,也成为哈夫曼树(Huf...原创 2020-04-16 23:14:14 · 2972 阅读 · 0 评论 -
[数据结构与算法-17]二叉排序树和平衡二叉树(AVL)
文章目录1、二叉排序树1.1 介绍1.2 二叉排序树的删除1.2.1 可能的情况1.2.1 代码解决流程1.3 删除的代码实现2、平衡二叉树2.1 问题的提出2.2 介绍2.3 左旋2.4 右旋1、二叉排序树1.1 介绍 二叉排序树是二叉树的一种,对于任何一个非叶子结点,要求左子结点的值比当前结点值小,右子结点比当前结点的值大。 特别说明:如果有相同的值,可以放在左子结点或右子结点。...原创 2020-04-18 11:02:54 · 732 阅读 · 0 评论 -
[数据结构与算法-18]图
文章目录1、基本介绍2、图的常用概念3、图的表示方式3.1 邻接矩阵3.2 邻接表4、图的代码实现5、图的遍历5.1 深度优先遍历5.1.1 基本思想5.1.2 算法步骤5.1.3 代码实现5.2 广度优先遍历5.2.1 基本思想5.2.2 算法步骤5.2.3 代码实现1、基本介绍 线性表局限于一个直接前驱和一个直接后继的关系,树也只能有一个直接前驱,也就是父结点。当我们需要表示多对多的关系...原创 2020-04-18 21:04:55 · 229 阅读 · 0 评论 -
[数据结构与算法-19]分治算法
文章目录1、介绍2、分治算法的设计模式3、最佳实践:汉诺塔3.1 基本介绍3.2 过程模拟4、汉诺塔的分治归纳5、汉诺塔分治的代码实现6、测试类1、介绍 分治算法的基本思想是把一个复杂的问题分成若干个相同或相似的子问题,再把子问题分解成更小的子问题,直到最后子问题可以简单地直接求解。原问题的解就是子问题的解的合并。这个技巧是很多高级算法的基础,比如排序算法中的快速排序、归并排序,还有傅里叶变...原创 2020-04-19 16:54:26 · 448 阅读 · 0 评论 -
[数据结构与算法-20]动态规划算法
文章目录1、介绍2、最佳实践:01背包问题2.1 问题描述2.2 递归思路2.3 非递归思路3、非递归代码实现4、测试类1、介绍 动态规划算法的核心思想是:把大问题划分为小问题进行解决,从而一步步获取最优解的处理算法。动态规划和分治算法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。但是,与分治算法不同在于,适合用动态规划求解的问题,分解...原创 2020-04-19 19:37:58 · 558 阅读 · 0 评论 -
[数据结构与算法-21]KMP算法
文章目录1、应用场景2、暴力匹配算法2.1 案例展示2.2 时间复杂度分析2.3 代码实现2.4 KMP算法对暴力匹配的改进3、 KMP算法3.1 算法原理1、应用场景 Knuth-Morris-Pratt 字符串查找算法,简称为 KMP算法,常用于在一个文本串 S 内查找一个模式串 P 的出现位置。是用来代替暴力匹配算法的有效算法。 如果找到,即返回第一个字符的索引。2、暴力匹配算...原创 2020-04-21 16:26:50 · 972 阅读 · 2 评论