
Java数据结构与算法
数据结构与算法基础学习笔记(Java版)
TheManba
You can do anything you want to, if you really want it.
展开
-
Java数据结构与算法——单调栈算法笔记
文章目录1、单调栈的定义2、单调栈的应用案例一:柱状图中最大的矩形(单调递增栈)案例二:下一个更大元素 I1、单调栈的定义栈内元素保持单调,有单调递增栈和单调递减栈。注意:这里的单调递增或递减是指的从栈顶到栈底单调递增或递减。每个元素都要入栈,且仅入栈一次,出栈后不再入栈。操作规则(以单调递增栈为例):(1) 如果新元素比栈顶元素大,就入栈;(2) 如果新元素比栈顶元素小,那就一直弹栈,直到栈顶元素小于新元素,这时再将新元素入栈。注意:栈内可以直接存储元素,也可以存储元素的索引,一般存储的是索引原创 2020-05-28 09:35:53 · 901 阅读 · 0 评论 -
Java数据结构与算法——动态规划
文章目录一、概述——递归、分治与动态规划1、递归2、分治3、动态规划二、动态规划1、基本概念2、动态规划解决问题的四个步骤案例一——爬台阶问题简单递归:动态规划(一):动态规划(二)案例二——三角形最小路径和题目描述:分析:一、概述——递归、分治与动态规划1、递归递归算法是一种直接或者间接调用自身函数或者方法的算法。通俗来说,递归算法的实质是把问题分解成规模缩小的同类问题的子问题,然后递归...原创 2020-05-01 15:58:34 · 697 阅读 · 0 评论 -
Java数据结构与算法——回溯法
一、基本概念1、回溯法的定义在问题的解空间树中,按深度优先搜索的策略,从根结点出发搜索解空间树。搜索至解空间树的任一节点时,先判断该节点是否包含问题的解。如果包含,则进入该节点的子树,继续按深度优先策略搜索;如果不包含,则跳过对该节点的子树的搜索,逐层向其祖先节点回溯。相比于穷举式的搜索,回溯法能避免许多不必要的搜索,因此,回溯法适用于解一些组合数比较大的问题。2、回溯法的解题步骤针对...原创 2020-03-21 12:25:26 · 4618 阅读 · 3 评论 -
Java数据结构与算法——深度优先搜索与广度优先搜索
文章目录一、定义1、深度优先搜索(DFS)2、广度优先搜索(BFS)二、案例1、树的遍历(1)深度优先遍历(2)广度优先遍历一、定义1、深度优先搜索(DFS)深度优先搜索(DFS,Depth First Search),就是“一条路走到黑”。对每一个可能的分支路径深入到不能再深入为止,当访问某个节点到尽头时,返回上一个还没访问的节点继续进行深度优先搜索。深度优先搜索常用栈(Stack)这种...原创 2020-03-20 10:02:19 · 2284 阅读 · 2 评论 -
Java数据结构与算法——分治法
文章目录一、分治的基本思想二、案例1、求数组的最大最小值2、分治法实现归并排序三、小结一、分治的基本思想将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后合并这些子问题的解来求原问题的解。二、案例1、求数组的最大最小值算法思想:若数组中只有一个元素,则该元素既是最大值,也是最小值;若数组中只有两个元素,则较大的为最大值,较小的为最小值;若数组中包含的元素...原创 2020-03-15 22:28:24 · 513 阅读 · 0 评论 -
Java数据结构与算法——穷举法
一、穷举法穷举算法,依赖计算机强大的计算能力,来穷举每一种可能的情况,以达到解决问题的目的。基本思想———逐一列举问题所涉及的所有情形,并根据问题提出的条件检验哪些是问题的解,哪些应予排除 。方法步骤———确定枚举对象、枚举范围、判断条件;循环验证每一个解。二、案例1、案例一甲 、乙、丙 三位球迷分别预测进入半决赛的四队A、B、C、D的名次如下:甲:A 第一名 、B 第二名乙:C ...原创 2020-03-15 09:56:58 · 3103 阅读 · 0 评论 -
Java数据结构与算法——贪婪算法
一、贪婪算法贪婪算法(又叫贪心算法)是指在对问题进行求解时,在每一步的选择中都采取最优的选择,即局部最优,从而希望最后的结果也能达到最优。贪婪算法得到的结果不一定是最优解(有时候会是最优解),但都相对接近最优解。二、设计思路:为求解的问题创建数学模型;把求解的问题分成若干个子问题;求解每一个子问题并得到子问题的局部最优解;将所有子问题的局部最优解合成原问题的解。三、案例1、区...原创 2020-03-10 21:03:17 · 392 阅读 · 0 评论 -
Java数据结构与算法——查找
文章目录一、顺序查找(线性查找)二、有序表查找1、二分查找(折半查找)2、斐波那契查找一、顺序查找(线性查找)顺序查找,也叫线性查找。遍历数组中的所有元素,与要查找的元素比对,不要求数组有序。该算法的时间复杂度为O(n)。代码如下:public class SequentialSearch { public static int search(int[] array, int key){...原创 2020-03-07 16:37:00 · 284 阅读 · 0 评论 -
Java数据结构与算法(树)——堆(完全二叉树)
文章目录一、堆的定义二、堆的主要操作1、遍历和查找2、删除3、插入三、代码实现注意:这里的堆和 Java,C++ 等编程语言在内存中的“堆”是不一样的,这里的堆是一种树结构。一、堆的定义(1)它是完全二叉树完全二叉树——对于一棵具有 n 个节点的二叉树按层序编号,如果编号为 i 的节点与同样深度的满二叉树中编号为 i 的节点在二叉树中的位置完全相同,则这棵树称为完全二叉树。(2)通常用数...原创 2020-02-29 10:37:13 · 835 阅读 · 0 评论 -
Java数据结构与算法(树)——平衡二叉树(AVL树)
一、定义平衡二叉查找树(Balanced Binary Sort Tree,BBST)简称平衡二叉树,是一种高度平衡的二叉树,由苏联数学家 Adele - Veliki 和 Landis 在 1962 年提出,故又命名为 AVL 树。平衡二叉树的性质:首先是一种二叉查找树,并且其中每个节点的左子树和右子树的高度相差至多等于 1。平衡因子BF(Balance Factor)——将二叉树上节点的...原创 2020-02-27 13:04:00 · 540 阅读 · 0 评论 -
Java数据结构与算法(树)——二叉搜索树(BST)
一、定义为了使二叉树的实现变得更有具体意义,我们将实现一种叫二叉搜索树(Binary Search Tree) 的数据结构,也叫二叉查找树。二叉搜索树要求:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉搜索树。如下图:由二叉搜索树的特性看出,其结构有很强的递归性,所以二叉搜索树的很多方...原创 2020-02-24 15:23:05 · 806 阅读 · 1 评论 -
Java数据结构与算法(树)——基本概念(二叉树)
一、树的定义及概念树(tree)是一种抽象数据类型(ADT),用来模拟具有树状结构性质的数据集合。它是由 n(n >= 0)个有限节点通过连接它们的边组成一个具有层次关系的集合。n = 0 时称为空树。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。下图为一棵“树”结构:节点 ——图中的圆圈,比如 A,B,C 等都表示节点。节点一般代表一些实体,在 Java...原创 2020-02-22 20:35:30 · 694 阅读 · 0 评论 -
Java数据结构与算法——散列表(HashTable)
一、概述1、定义散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系 f,使得每个关键字 key 对应一个存储位置 f(key)。查找时,根据这个确定的对应关系找到给定值 key 的映射 f(key),若查找集合中存在这个记录,则必定在 f(key)的位置上。对应关系 f 称为散列函数,又称为哈希(Hash)函数。采用散列技术将记录存储在一块连续的存储空间中,这块连续的存储空间称...原创 2020-02-17 15:39:06 · 998 阅读 · 0 评论 -
Java数据结构与算法——队列(queue)
一、定义队列(queue)—— 是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。先进先出(First In First Out),简称 FIFO。允许插入的一端叫队尾(rear),允许删除的一端叫队头(front)。二、队列的顺序存储结构1、单队列(1)与栈不同的是,队列中的数据不总是从数组的 0 下标开始的,移除一些队头 front 的数据后,队头指针会指向一个较高的下标位置...原创 2020-02-17 10:09:15 · 584 阅读 · 0 评论 -
Java数据结构与算法——栈(stack)
一、栈的定义(后进先出的线性表(Last In First Out))栈(stack)—— 限定仅在表尾进行插入和删除操作的线性表;栈顶(top)—— 允许插入和删除的一端;栈底(bottom)——栈顶的另一端;空栈——不含任何元素的栈。二、栈的抽象数据类型public interface StackADT { public boolean isEmpty();// 判空 ...原创 2020-02-15 17:15:53 · 311 阅读 · 0 评论 -
Java数据结构与算法——递归思维
一、递归的思维方式递归思维方式的精髓在于判断能否将目前复杂的问题转换为较为简单的同类问题。可以的话,就先转换为简单的同类问题来解决,然后再利用同样的方法来解决复杂的同类问题。注意:不要陷入程序递归的内部去思考递归算法,要从递归思维的本质(复杂问题简单化)出发去理解递归算法。千万不要去通过试图解析程序执行的每一个步骤来理解递归(解析程序的执行是指给函数一个真实值,然后自己一步步去推出结果,这样...原创 2020-02-15 10:29:40 · 777 阅读 · 0 评论 -
Java数据结构与算法——线性表(list)
文章目录一、线性表的定义二、线性表的抽象数据类型三、线性表的顺序存储结构及实现1、顺序存储结构2、插入数据3、移除数据4、数组长度与线性表长度的区别5、顺序存储的优缺点6、完整代码实现一、线性表的定义线性表——零个或多个数据元素的有限序列。注意:首先它是一个序列。元素之间是有顺序的,若存在多个元素,则第一个元素无前驱,最后一个元素无后继,其他每个元素都有且只有一个前驱和后继。线性表的元素个...原创 2020-02-13 20:52:47 · 450 阅读 · 0 评论 -
Java数据结构与算法——基本概念
一、数据结构1、基本概念(1)数据——描述客观事物的符号,是计算机可以操作的对象,是能被计算机识别并输入给计算机处理的符号集合 。(2)数据元素——组成数据的、有一定意义的基本单位,在计算机中通常被当作整体处理。(3)数据项——一个数据元素可以由若干个数据项组成。比如,人可以有鼻子、眼睛、耳朵等数据项,也可以有姓名、年龄、性别等数据项。(4)数据结构——相互之间存在一种或多种特定关系的数...原创 2020-02-13 08:42:17 · 408 阅读 · 0 评论 -
Java数据结构与算法(排序)——排序算法总结分析
一、排序算法的稳定性原创 2020-02-13 08:35:08 · 256 阅读 · 0 评论 -
Java数据结构与算法(排序)——快速排序
一、基本思想原创 2020-02-13 08:32:34 · 216 阅读 · 0 评论 -
Java数据结构与算法(排序)——桶排序
一、算法思想通过遍历,将待排序序列分到有限数量的桶中,然后对每个桶单独进行排序,最后将所有桶的结果输出,即为有序序列(关键问题在于,如何设置合适数量的桶)。二、算法步骤(1)设定合适数量的桶;(2)遍历待排序序列,将每个元素放到对应的桶中;(3)对每个桶(非空的桶)进行合适的排序算法;(4)按顺序访问桶,将桶中的元素依次输出,得到有序序列(注意:对每个桶使用的排序算法要与访问桶的顺序一...原创 2020-02-12 10:05:47 · 359 阅读 · 0 评论 -
Java数据结构与算法(排序)——希尔排序
一、基本思想希尔排序(Shell Sort)是插入排序的一种,也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。其处理过程为:对一组无序的数列,选择一个增量,即 gap = array.length / 2,以此增量进行第一趟数据分组与排序,然后缩小增量,继续以 gap = gap / 2 的方式进行分组和排序;每趟排序,根据对应的增量,将待排序列分割成若干长度为 m 的子序列,分别...原创 2020-02-11 10:57:38 · 161 阅读 · 0 评论 -
Java数据结构与算法(排序)——计数排序
一、算法步骤(1)从待排序序列 A 中找到最大值 max 和最小值 min;(2)创建一个新数组 B,用来统计序列 A 中各元素出现的次数。(3)最后遍历数组 B ,输出结果即为排序的结果。注:若 A 中的元素都比较小,则创建新数组 B 的长度为(max + 1),此时数组 B 的下标 index 就是序列 A 中的元素;若 A中的元素都比较大,则创建新数组 B 的长度为(max -...原创 2020-02-11 09:54:02 · 194 阅读 · 0 评论 -
Java数据结构与算法(排序)——归并排序
一、基本思想归并排序,就是利用归并思想实现的排序方法。它的原理是:假设初始序列含有 n 个记录,则可以看成 n 个有序的子序列,每个子序列的长度为 1,然后两两归并,得到(n/2)个长度为 2 或 1的有序子序列;再两两归并,…,如此重复,直至得到一个长度为 n 的有序序列为止,这种排序方法也称 2 路归并排序。如下图(其中第一行为初始序列):二、代码实现 public int[] mer...原创 2020-02-11 08:59:49 · 324 阅读 · 0 评论 -
Java数据结构与算法(排序)——基数排序(LSD)
一、基本思想先从最低位开始排序,再对次低位排序,直到对最高位排序后得到一个有序序列(位数不同时高位补 0)。二、举例分析假设有一串数列:73, 22, 93, 43, 55, 14, 28, 65, 39, 81。排序过程如下:(1)先根据个位进行排序,得到:0——1——812——223——73,93,434——145——55,656——7——8——289——39(2...原创 2020-02-10 09:24:05 · 870 阅读 · 0 评论 -
Java数据结构与算法(排序)——插入排序
一、基本思想(1)将待排序序列的第一个元素看作一个有序序列,把第二个到最后一个元素看作无序序列;(2)遍历扫描无序序列,将扫描到的每个元素插入有序序列的适当位置(如果待插入的元素与有序序列中某个元素相等,则将该元素插入到相等元素的后面)。二、举例分析以序列 12, 23, 33, 8, 99, 0 为例,将 12 看作有序序列,23, 33, 8, 99, 0 看作无序序列,遍历无序序列,...原创 2020-02-10 08:52:57 · 190 阅读 · 1 评论 -
Java数据结构与算法(排序)——选择排序
一、基本思想首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置;再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾;重复第二步,直到所有元素均排序完毕。排序过程仍是每次从未排序序列中找到最大元素并放到已排序序列的合适位置。对于有 n 个记录的序列,最多需经过 n-1 轮排序,可使该序列有序。以序列 12, 23, 33, 8, 99, 0 为例。有 6 ...原创 2020-02-09 11:29:20 · 152 阅读 · 0 评论 -
Java数据结构与算法(排序)——冒泡排序
一、基本思想冒泡排序是一种交换排序。通过两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。其处理过程为:对序列的相邻两个关键字 array[j] 和 array[j+1],若逆序(array[j] > array[j+1]),则交换,使得关键字值小的记录左移,关键字值大的记录右移。第一趟冒泡排序会找出序列中关键字值最大的记录,第二趟排序会找出关键字值第二大的记录,… … 则...原创 2020-02-09 09:25:23 · 272 阅读 · 0 评论