数据结构与算法_java实现
文章平均质量分 85
以SGG韩老师的课为骨架,辅以自我总结的笔记,加油!搞定Leetcode & Offer!!
菜菜的大数据开发之路
Java技术栈 AND 大数据开发,学习笔记, 拒绝水文
展开
-
一, 基于Java 的分治算法和典型实现栗子(仔细看, 能行)
一, 分治算法概述1.1 分治法的思想和特点分治算法是采用了分治思想的一种算法, 什么是分治呢?分值策略: 分治, 字面上的解释就是"分而治之",将原问题划分为n个规模较小而结构与原问题相似的子问题; 递归的解决这些子问题, 然后再合并其结果, 就得到原问题的解;将父问题分解为子问题的同等方式求解, 这和递归的概念很吻合, 所以在分治算法通常以递归的方式实现(当然也是有非递归的实现方式). 分治算法的描述从字面上也很容易理解, 分, 治, 其实还有个合并的过程:- 分解(Divide): 将原创 2021-06-04 12:50:15 · 288 阅读 · 3 评论 -
四-中,Java实现双链表 0.8
文章目录四-中, 双链表( Double Linked List)4.1 双链表的常用方法主要代码4.1.2 双链表的普通插入,顺序插入, 定点插入(插入到指定结点后)和遍历输出4.1.3 双链表的查找,修改和删除四-中, 双链表( Double Linked List)单链表结点中只有一个指向其后继的指针,这使得单链表只能从头结点依次顺序地向后遍历。若要访问某个结点的前驱结点(插入、删除操作时),只能从头开始遍历,访问后继结点的时间复杂度为O(1),访问前驱结点的时间复杂度为O(n)。为了克服原创 2021-04-15 22:52:44 · 276 阅读 · 0 评论 -
十-8, 多叉树概述(2-3树, B树,B+树和B*树)-待完善
10.1 2-3树10.1.1 2-3树存在的意义二叉排序树–>平衡二叉树–>2-3树前面我们说到,二叉排序树二叉排序树(BST)结合了数组的查找速度快,以及链表的增删方便的优点, 但是二叉排序树在最好的情况下查找,插入和删除的时间复杂度为 o(logn), 而在最坏情况下会退化成链表的形式, 复杂度为 o(height) = o(n);平衡二叉树为了使二叉排序树(BST)更加的匀称以提高搜索的效率, 我们引入了平衡二叉树(AVL), 每次在添加一个新的节点后,平原创 2021-05-17 23:22:59 · 398 阅读 · 0 评论 -
十一, Java实现图的深度优先遍历(DFS)和广度优先遍历(BFS)
文章目录11.1 图的概述11.1.1 什么是图?11.1.2 线性表, 树, 图的对比11.1.3 图的常见概念11.2 图的存储结构11.2.1 邻接矩阵(Adjacency Matrix)11.2.2 邻接表(Adjacency List)11.3 图的遍历11.3.1 图的深度优先遍历(DFS)11.3.2 图的广度优先遍历(BFS)11.1 图的概述11.1.1 什么是图?图(graph)是一种数据结构,它是由顶点的有穷非空集合V和顶点之间边的集合E组成通常表示为:G(V,E)。其中 G原创 2021-05-17 23:19:27 · 1059 阅读 · 2 评论 -
十-7,平衡二叉树概述及其Java实现
文章目录十四, 平衡二叉树(AVL)10.1 平衡二叉树概述10.2 求平衡二叉树的平衡因子(判断AVL树是否平衡)10.3 二叉树的左旋及其Java实现10.4 二叉树的右旋10.5 二叉树的双旋转十四, 平衡二叉树(AVL)10.1 平衡二叉树概述[基本定义]平衡二叉树又称为AVL树, 是一种特殊的二叉排序树.其左右子树都是平衡二叉树以树中所有节点为根的树的左右子树高度之差的绝对值不超过1.[平衡因子]为了判断一棵二叉树是否是平衡二叉树, 引入了平衡因子的概念. 平衡因子是针对树中原创 2021-05-15 09:57:12 · 1174 阅读 · 0 评论 -
十-6, 一文搞定二叉排序树的创建, 遍历, 查找和删除(Java实现)
文章目录10.1 二叉排序树的概述10.2 二叉排序树创建和遍历的实现10.3 二叉排序树查找和删除指定节点的实现10.1 二叉排序树的概述[二叉排序树]二叉排序树(Binary Search Tree),或者二叉搜索树指的是一棵空树或者具有下列性质的二叉树:左子树< 根节点 < 右子树任意节点的左右子树也分别为二叉排序树10.2 二叉排序树创建和遍历的实现[实现思路]在二叉树的无论是遍历还是查找删除时, 我们通常是在结点类中实际编写对结点各种操作的原创 2021-05-12 19:34:46 · 992 阅读 · 0 评论 -
十-5, 哈夫曼树概述及Java实现
文章目录12.1 哈夫曼树概述12.1.1 与哈夫曼树相关的概念12.1.2 什么是哈夫曼树12.2 哈夫曼树的构造方法12.3 哈夫曼树的代码实现12.3 哈夫曼编码(待补充)12.1 哈夫曼树概述12.1.1 与哈夫曼树相关的概念概念含义1. 路径从树中一个结点到另一个结点的分支所构成的路线2. 路径长度路径上的分支数目3. 树的路径长度从根到每个结点的路径长度之和4. 带权路径长度结点具有权值, 从该结点到根之间的路径长度乘以结点的权值, 就是该结原创 2021-05-11 18:46:58 · 318 阅读 · 1 评论 -
十-4, 堆排序及其Java实现
文章目录前置知识:稳定性:`不稳定`原理演示:基本思想:Java实现的具体步骤代码示例:前置知识:堆:可以把堆看做一棵顺序存储的完全二叉树,这棵树满足,所有的子结点都不大于或不小于其父结点。大顶堆:每个结点皆大于或等于其左右孩子结点; 一般升序采用大顶堆;小顶堆:每个结点皆小于或等于其左右孩子结点; 一般降序采用小顶堆;由于完全二叉树的性质(只有最下面两层结点度小于2,并且最下一层叶结点集中在靠左的位置上),使得堆很容易用数组来表示,每个节点对应数组的一个元素, 拿上图一大顶堆为例得到下图原创 2021-05-10 20:58:09 · 1635 阅读 · 0 评论 -
十-3, Java实现线索化二叉树
文章目录10.1 线索二叉树的定义10.2 二叉树线索化,以及遍历线索二叉树的具体实现10.1 线索二叉树的定义[基本概念]线索, 线索二叉树:对于n个结点的二叉树, 在二叉链表存储结构中有n+1个空链域, 利用这些空链域存放在某种遍历次序下该结点的前驱结点和后继结点的指针, 这些指针称为线索, 加上了线索的二叉树称为线索二叉树.线索化:对一棵二叉树中所有结点的空指针按照某种遍历方法加线索(指定前驱和后继结点)的过程叫做线索化. 根据对二叉树遍历方式的不同, 线索二叉树可以分为前序线索二叉原创 2021-05-10 11:40:53 · 366 阅读 · 0 评论 -
六, 递归以及几个典型的Java递归例子(待补充)
文章目录6.1 什么是递归?6.2 手写递归的三个要素6.2.1 第一要素: 明确你这个函数想要干什么6.2.2 第二要素: 寻找递归结束的条件6.2.3 第三要素: 找出函数的等价关系式(递推式)6.3 栗子的磨练1. 递归打印n次字符串2. 实现n的阶乘3. 数组求和4. 斐波那契数列5.6.1 什么是递归?定义:递归就是方法自己调用自己,每次调用时传入不同的变量。递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。用大白话来讲述递归, 知乎的一位大佬讲的就非常形象:一个小朋友坐原创 2021-05-09 23:43:43 · 877 阅读 · 2 评论 -
十-2, Java实现顺序存储二叉树的遍历
文章目录10.1 顺序存储二叉树定义10.2 顺序存储二叉树遍历的实现10.1 顺序存储二叉树定义从数据存储来看, 数组存储方式和树的存储方式可以相互转换, 即数组可以转换成树, 树也可以转换成数组. 顺序结构存储就是使用数组来存储, 一般使用数组只适合表示完全二叉树, 因为非完全二叉树会有空间的浪费.下图是树和数组对应的关系图用数组顺序存储二叉树, 其显著特征是: (n表示数组的索引值)在数组中index=n的元素对应的父节点为 index=(n-1)/2的元素, 向下取原创 2021-05-07 15:59:27 · 249 阅读 · 1 评论 -
十-1, Java实现简单二叉树(遍历查找和删除)
十, 二叉树10.1 树存在的必要性[数组存储方式的优缺点]优点: 通过下标直接访问目标数据, 速度快. 对于有序数组, 还可使用二分查找提高检索速度缺点: 如果要检索具体某个值, 或者插入值(按一定顺序)会整体移动, 效率较低.[链表存储方式的优缺点]优点:在一定程度上对数组存储方式有所优化。比如插入一个数值节点,只需要将插入节点链接到链表中即可,其删除效率也较高。缺点:在进行检索时,效率仍然较低。比如检索某个值, 需要从头节点开始遍历。从上面数组和链表的特点我们可以知道原创 2021-05-07 12:18:28 · 921 阅读 · 2 评论 -
九, Java实现哈希表(拉链法, 数组+单链表)
九, 哈希表9.1 哈希表的定义和特点散列表(Hash table, 也叫哈希表),是根据关键码 - 值(Key - value)而直接进行访问的数据结构。 也就是说, 它通过把关键码 - 值映射到表中一个位置来访问记录, 以加快查找的速度。这个映射的函数叫做散列函数,存放记录的数组叫做散列表。其实把哈希表看做是字典来理解哈希表就很容易明白了,我们通过关键码即可快速定位关键值。显而易见哈希表有一个很大的优点就是查找数据的速度快。下图就是一个典型的哈希表(数组+链表实现的,使用拉链法解决冲突)原创 2021-05-06 00:05:34 · 762 阅读 · 1 评论 -
八-1, Java实现斐波那契查找算法,一个字,透彻!
文章目录8.4 斐波那契查找[要求有序]8.4.1 斐波那契查找的相关知识点:8.4.2 斐波那契查找算法的思想以及实现步骤8.4 斐波那契查找[要求有序]8.4.1 斐波那契查找的相关知识点:前置知识:黄金比例: 整体与较大部分比值为 1:0.618 或者 1.618 :1斐波那契数(黄金分割数列): 1,1,2,3,5,8,13,21,35…, 随着此数列的递增, 前后两个数的比例会越来越接近0.618.什么是斐波那契数, 以及斐波那契数列的三种实现: Java实现斐波那契数的三种方式原创 2021-05-05 20:15:19 · 1186 阅读 · 1 评论 -
八-0, Java实现斐波那契数的三种方式(递推, 数组, 递归)
文章目录1.原理和定义2. 递推方式实现斐波那契数列3. 数组方式实现斐波那契数列4. 递归方式实现斐波那契数列1.原理和定义斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为 “兔子数列”。如下图所示,就是一个斐波那契数列:在数学上,斐波那契数列被以如下递推的方法定义:从斐波那契的递推公式我们可以总结出重要一点:斐波那契数列从第三项开始,每一项都等于前两项之和。2原创 2021-05-03 12:46:35 · 770 阅读 · 1 评论 -
八,Java实现简单的查找算法(顺序, 折半, 差值查找)
文章目录八, 查找算法8.1 顺序查找8.2 二分查找(折半查找)[要求有序]8.2.1 二分查找基本实现8.2.2 二分查找优化实现(查找多个相同的数)8.3 插值查找[要求有序]8.3.1 插值查找的递归实现八, 查找算法在Java中, 我们常用的查找有四种: 顺序查找, 二分(折半)查找, 插值查找, 斐波那契查找(另作一篇文章)8.1 顺序查找适用于存储结构为顺序或链式存储的线性表顺序查找的基本思想:又称为无序查找, 从数据结构的一端开始, 顺序扫描, 依次将扫描到的原创 2021-05-05 15:38:04 · 689 阅读 · 0 评论 -
七-1, Java实现希尔排序的两种方法(交换法和位移法), 看了还不会代码写来打我!
1.希尔排序的基本思想希尔排序是把记录按照下标的增量进行分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。blah blah blah…2. 交换法实现希尔排序(效率不高)看上面这些被说烂了的定义还不如一步步具体的来看一个希尔排序是如何被实现出来的. 那么我们开始吧.首先,我们都知道希尔排序是插入排序的改进,那么具体是如何实现这种改进的呢? 靠的是增量,实现跳跃式分组排序.具体来说就是:简单插入排序很循原创 2021-04-20 21:54:32 · 293 阅读 · 0 评论 -
七, Java实现八大排序算法, 带源码详解
八大排序算法带源码详解概要:内部排序:待排序记录存放在计算机内存中进行的排序过程。通过比较次数(时间复杂度)来衡量效率;外部排序:待排序记录的数量很大,以致于内存不能一次容纳全部记录,所以在排序过程中需要对外存进行访问的排序过程。通过IO次数(即读写外存的次数)来衡量效率。比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时原创 2021-03-09 14:04:41 · 2471 阅读 · 0 评论 -
五, Java实现栈以及栈的一些应用 0.5
文章目录五, 栈5.1 栈的特点和应用5.2 数组模拟实现栈5.3 栈实现计算器(利用栈计算中缀表达式的值)5.4 中缀, 前缀和后缀表达式5.4.1 前缀表达式的计算机求值5.4.2 后缀表达式的计算机求值5.4.3 逆波兰计算器(给定了后缀表达式)5.4.3 中缀表达式转换为后缀表达式5.4.4 优化后的逆波兰计算器五, 栈5.1 栈的特点和应用栈(Stack), 是一个先入后出(FIFO)的有序列表;栈是一种限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表; 允许插入和删原创 2021-04-19 22:11:35 · 930 阅读 · 6 评论 -
四-下, Java实现 单向循环链表 1
文章目录四-下, 单向循环链表4.0 定义和概念4.1 单向循环链表的应用--约瑟夫问题四-下, 单向循环链表4.0 定义和概念单链表的指针域只存储了向后的指针,到了尾结点就无法继续向后的操作。本篇文章将介绍单向循环链表,它和单链表的区别在于末尾结点的指针域不是指向null,而是指向头结点,形成首尾相连的环。这种首尾相连的单链表称为单向循环链表。循环链表可以从任意一个结点出发,访问到链表中的全部结点。和单链表一样,为了使空链表与非空链表处理一致,我们通常会设置一个头结点。当然,之前提原创 2021-04-17 22:15:36 · 230 阅读 · 0 评论 -
四-上,Java实现单链表(递归实现法待补充)
文章目录四-上, 单链表(Linked List)4.1 定义和栗子4.2 单链表4.2.1 单链表的定义,结构和特点4.2.2 单链表常用方法的具体实现4.2.2.1 单链表的链接和打印的具体实现4.2.2.2 单链表的修改和删除的具体实现4.2.2.3 单链表的有序插入的具体实现4.3 单链表的几个典型例题4.3.1 求单链表中的有效结点个数4.3.2 查找出单链表中的倒数第k个结点4.3.3 单链表的反转(方法之一, 头插法反转单链表)4.3.4 逆序打印单链表(方式1,反转链表并遍历; 方式2,使用原创 2021-04-15 12:37:44 · 578 阅读 · 0 评论 -
三, Java 数组模拟实现普通队列,循环队列
文章目录三, 队列(Queen)3.1 定义和栗子3.2 数组模拟实现普通队列3.2.1 数组模拟普通队列的实现思路3.2.2 数组模拟普通队列的具体实现3.3 数组模拟实循环队列3.3.1 数组模拟循环队列的实现思路3.3.2 数组模拟环形队列的具体实现三, 队列(Queen)3.1 定义和栗子队列是一个有序列表,可以用数组或链表来实现;队列遵循先入先出的原则(先存入队列的数据先取出)队列存取的特点是尾部插入(用rear指示), 头部取出(用front指示).3.2 数组模拟实现普通队原创 2021-04-13 21:10:42 · 688 阅读 · 0 评论 -
一,二, 数据结构框架, Java实现稀疏数组
一, 数据结构二, 稀疏数组2.1 定义和栗子当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。稀疏数组的表示方法记录数组一共有几行几列,有多少个不同的值把二维数组的值,以及所处的行索引,列索引记录下来存储到一张规模较小的表中.(注意: 索引都是从0开始,对应的行,列数要+1哦)举个栗子:2.2 编程实现2.2.1 思想Ⅰ, 二维数组转换为稀疏数组的思路遍历原始的二维数组, 得到有效数据的数量 count;根原创 2021-04-12 21:49:01 · 306 阅读 · 0 评论