
Java数据结构与算法笔记
文章平均质量分 73
是渣渣呀
这个作者很懒,什么都没留下…
展开
-
九大排序算法(C语言)
九大排序算法文章目录九大排序算法直接插入排序(插入排序)折半插入排序(插入排序)希尔排序冒泡排序(交换排序)快速排序(交换排序)简单选择排序(选择排序)堆排序(选择排序)归并排序基数排序直接插入排序(插入排序)算法思想算法思想:每次将⼀个待排序的记录按其关键字⼤⼩插⼊到前⾯已排好序的⼦序列中,直到全部记录插⼊完成。算法实现#include<stdio.h>//升序排列(小-->大) void InsertSort(int A[],int n){ int i,j,temp;原创 2021-07-25 23:45:50 · 365 阅读 · 0 评论 -
无向图的广度优先遍历算法(bfs)
基本介绍图的广度优先搜索(Broad First Search) 。类似于一个 分层搜索的过程,广度优先遍历需要使用一个队列以保持访问过的结点的顺序,以便按这个顺序来访问这些结点的邻接结点算法步骤访问初始结点 v 并标记结点 v 为已访问。结点 v 入队列当队列非空时,继续执行,否则算法结束。出队列,取得队头结点 u。查找结点 u 的第一个邻接结点 w。若结点 u 的邻接结点 w 不存在,则转到步骤 3;否则循环执行以下三个步骤:6.1 若结点 w 尚未被访问,则访问结点原创 2021-04-24 23:25:44 · 7776 阅读 · 0 评论 -
数据结构--图的笔记
图基本介绍为什么要有图前面我们学了线性表和树线性表局限于一个直接前驱和一个直接后继的关系树也只能有一个直接前驱也就是父节点当我们需要 表示多对多的关系时, 这里我们就用到了图.图的举例说明图是一种 数据结构,其中结点可以具有零个或多个相邻元素。两个结点之间的连接称为边。 结点也可以称为顶点。如图:图的常用概念顶点(vertex)边(edge)路径无向图(右图有向图带权图图的表示方式图的表示方式有两原创 2021-04-23 22:54:33 · 289 阅读 · 0 评论 -
Java对二维数组进行排序及源码分析
调用API假设我们要对二维数组int[][] intervals里的一维数组按照每个一维的数组下标为 i 的元素进行升序 / 降序排序int[][] intervals;Arrays.sort(intervals, new Comparator<int[]>() { @Override public int compare(int[] interval1, int[] interval2) { retu原创 2021-04-18 00:11:19 · 800 阅读 · 0 评论 -
最长回文子串中心扩散详解
p(? ,? )表示是否回文,并且 第一个参数是左端点,第二个是右端点Si 表示字符串中位置i对应的字符可以发现,所有的状态在转移的时候的可能性都是唯一的。也就是说,我们可以从每一种边界情况开始「扩展」,也可以得出所有的状态对应的答案。注 :这里的边界不是指左右的边界,而是回文串的中间位置P(i,j)才是字符串的左右边界,图中的状态转移链相当于从两边向中间倒推到中间的过程!!边界情况即为子串长度为 1或 2(奇数或者偶数) 的情况。就相当于 c a b a d 和 .原创 2021-03-26 23:16:13 · 374 阅读 · 1 评论 -
八皇后问题(回溯算法)笔记
八皇后问题(回溯算法)基本介绍八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848 年提出:在 8×8 格的国际象棋上摆放八个皇后,使其不能互相攻击,即: 任意两个皇后都不能处于同一行 、同一列或同一斜线上,问有多少种摆法(92)。算法思想与图解第一个皇后先放第一行第一列第二个皇后放在第二行第一列、然后判断是否 OK, 如果不 OK,继续放在第二列、第三列、依次把所有列都放完,找到一个合适继续第三个皇后,还是第一列、第二列……直到原创 2020-10-30 18:17:37 · 325 阅读 · 0 评论 -
迷宫问题(递归)笔记
迷宫问题(递归)基本介绍上图是一个 8 行 7 列的迷宫, 红色方格表示墙,不能走, 目的是从某一处起点开始让小球最终走到右下角的位置说明:map 表示地图i,j 表示从地图的哪个位置开始出发 (1,1)如果小球能到 map[6] [5] 位置,则说明通路找到.约定: 当 map[i] [j] 为 0 表示该点没有走过 当为 1 表示墙 ; 2 表示通路可以走 ; 3 表示该点已经走过,但走不通代码实现public class MiGong { public sta原创 2020-10-30 18:16:14 · 244 阅读 · 0 评论 -
希尔排序笔记
希尔排序(算法)基本介绍简单插入排序存在的问题:我们看简单的插入排序可能存在的问题.数组 arr = {2,3,4,5,6,1} 这时需要插入的数 1( 最小), 这样的过程是:{2,3,4,5,6,6}{2,3,4,5,5,6}{2,3,4,4,5,6}{2,3,3,4,5,6}{2,2,3,4,5,6}{1,2,3,4,5,6}结论:当 需要插入的数是较小的数时, 后移的次数明显增多,对 效率有影响.希尔排序是希尔(Donald Shell)于 1959 年提出的一种排序算原创 2020-10-29 20:30:14 · 172 阅读 · 0 评论 -
插入排序笔记
插入排序(算法)基本介绍插入式排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。算法思想与图解插入排序(Insertion Sorting)的基本思想是:把 把 n 个待排序的元素看成为一个有序表和一个无序表,开始时 有序表中只包含一个元素,无序表中包含有 n-1 个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。代码实现有一群小牛, 考试成绩分别原创 2020-10-29 20:29:02 · 129 阅读 · 0 评论 -
选择排序笔记
选择排序(算法)基本介绍选择式排序也属于内部排序法,是从待排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的。选择排序,从头至尾扫描序列,找出最小的一个元素,和(当前轮次)第一个元素交换(第二轮和第二个元素交换,以此类推),接着从剩下的元素中继续这种选择和交换方式,最终得到一个有序序列。算法思想与图解选择排序(select sorting)也是一种简单的排序方法。它的基本思想是:第一次从 arr[0]~arr[n-1]中选取最小值,与 arr[0]交换,第二次从 a原创 2020-10-29 20:27:21 · 265 阅读 · 0 评论 -
冒泡排序笔记
冒泡排序(算法)基本介绍 冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始), 依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。优化:因为排序的过程中,各元素不断接近自己的位置, 如果一趟比较下来没有进行过交换 , 就说明序列有序,因此要在排序过程中设置一个标志 flag 判断元素是否进行过交换。从而减少不必要的比较。(这里说的优化,可以在冒泡排序写好后,再进行)算法思想与图解原创 2020-10-29 20:25:35 · 153 阅读 · 0 评论 -
图的笔记
图基本介绍为什么要有图前面我们学了线性表和树线性表局限于一个直接前驱和一个直接后继的关系树也只能有一个直接前驱也就是父节点当我们需要 表示多对多的关系时, 这里我们就用到了图.图的举例说明图是一种 数据结构,其中结点可以具有零个或多个相邻元素。两个结点之间的连接称为边。 结点也可以称为顶点。如图:图的常用概念顶点(vertex)边(edge)路径无向图(右图有向图带权图图的表示方式图的表示方式有两原创 2020-10-26 22:34:07 · 163 阅读 · 0 评论 -
贪心算法笔记
贪心算法基本介绍1、贪婪算法(贪心算法)是指在对问题进行求解时, 在每一步选择中都采取最好或者最优( 即最有利) 的选择,从而希望能够导致结果是最好或者最优的算法2、贪婪算法所得到的结果不一定是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果问题引入假设存在如下表的需要付费的广播台,以及广播台信号可以覆盖的地区。 如何选择最少的广播台,让所有的地区都可以接收到信号思路分析如何找出覆盖所有地区的广播台的集合呢,使用穷举法实现,列出每个可能的广播台的集合,这被称原创 2020-10-25 18:06:25 · 256 阅读 · 0 评论 -
kmp算法笔记
KMP算法问题引入字符串匹配问题1.有一个字符串 str1= ““硅硅谷 尚硅谷你尚硅 尚硅谷你尚硅谷你尚硅你好””,和一个子串 str2=“尚硅谷你尚硅你”2.现在要判断 str1 是否含有 str2, 如果存在,就返回第一次出现的位置, 如果没有,则返回-1暴力匹配算法如果用暴力匹配的思路,并假设现在 str1 匹配到 i 位置,子串 str2 匹配到 j 位置,则有:如果当前字符匹配成功(即 str1[i] == str2[j]),则 i++,j++,继续匹配下一个字符原创 2020-10-24 21:46:42 · 266 阅读 · 0 评论 -
动态规划算法笔记
动态规划算法基本介绍动态规划(Dynamic Programming)算法的核心思想是:将 大问题划分为小问题进行解决,从而一步步获取最优解的处理算法动态规划算法与分治算法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到 子问题往往不是互相独立的。 ( 即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解 )动态规划可以通过填表的方式来逐步推进,得到最优解.问原创 2020-10-24 21:44:09 · 191 阅读 · 0 评论 -
平衡二叉树(AVL树)
平衡二叉树(AVL树)1、问题引入给你一个数列{1,2,3,4,5,6},要求创建一颗二叉排序树(BST), 并分析问题所在.左子树全部为空,从形式上看,更像一个单链表.插入速度没有影响查询速度明显降低(因为需要依次比较), 不能发挥 BST的优势,因为每次还需要比较左子树,其查询速度比单链表还慢解决方案-平衡二叉树(AVL)2、基本介绍平衡二叉树也叫平衡 二叉搜索树(Self-balancingbinary search tree)又被称为 AVL 树,可以保证查询效率较高。具有以原创 2020-10-20 16:48:08 · 262 阅读 · 0 评论 -
二叉排序树
二叉排序树1、问题引入先看一个需求给你一个数列 (7, 3, 10, 12, 5, 1, 9),要求能够高效的完成对数据的查询和添加解决方案分析使用数组数组未排序, 优点:直接在数组尾添加,速度快。 缺点:查找速度慢.数组排序,优点:可以使用二分查找,查找速度快,缺点:为了保证数组有序,在添加新数据时,找到插入位置后,后面的数据需整体移动,速度慢。使用链式存储-链表不管链表是否有序,查找速度都慢,添加数据速度比数组快,不需要数据整体移动。使用二叉排序树2、基本原创 2020-10-20 16:43:59 · 283 阅读 · 0 评论 -
线索化二叉树
线索化二叉树问题引入将数列 {1, 3, 6, 8, 10, 14 } 构建成一颗二叉树. n+1=7问题分析:当我们对上面的二叉树进行中序遍历时,数列为 {8, 3, 10, 1, 6, 14 }但是 6, 8, 10, 14 这几个节点的 左右指针,并没有完全的利用上.如果我们希望充分的利用 各个节点的左右指针, 让各个节点可以指向自己的前后节点,怎么办?解决方案- 线索二叉树基本介绍n 个结点的二叉链表中含有 n+1 【公式 2n-(n-1)=n+1】 个空指针域。利用二叉原创 2020-10-09 13:58:12 · 174 阅读 · 0 评论 -
二叉树(顺序存储)
二叉树(顺序存储)1、基本介绍从数据存储来看,数组存储方式和树的存储方式可以相互转换,即 数组可以转换成树。要求:上图的二叉树的结点,要求以数组的方式来存放 arr : [1, 2, 3, 4, 5, 6, 6];要求在遍历数组 arr 时,仍然可以以前序遍历,中序遍历和后序遍历的方式完成结点的遍历2、顺序存储二叉树的特点顺序二叉树通常只考虑完全二叉树第 n 个元素的左子节点为 2 * n + 1第 n 个元素的右子节点为 2 * n + 2第 n 个元素的父节点为 (原创 2020-10-09 13:53:37 · 852 阅读 · 0 评论 -
队列(顺序存储)
队列基本介绍队列是一个有序列表,可以用数组或是链表来实现。遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出示意图:(使用数组模拟队列示意图)数组模拟队列思路队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下图, 其中 MaxSize 是该队列的最大容量。因为队列的输出、输入是分别从前后端来处理,因此需要两个变量 front 及 rear 分别记录队列前后端的下标,front 会随着数据输出而改变,而 rear 则是随原创 2020-10-07 20:52:26 · 270 阅读 · 0 评论 -
二叉树(链式存储)
二叉树(链式存储)1、树数据结构与数组和链表的区别数组存储方式的分析优点: 通过 下标方式访问元素,速度快。对于有序数组,还可使用二分查找提高检索速度。缺点: 如果要检索具体某个值,或者插入值( 按一定顺序) 会整体移动,效率较低链式存储方式的分析优点: 在一定程度上对数组存储方式有优化(比如: 插入一个数值节点,只需要将插入节点,链接到链表中即可,删除效率也很好)。缺点: 在进行检索时,效率仍然较低,比如(检索某个值,需要从头节点开始遍历)树存储方式的分析原创 2020-10-07 20:48:12 · 2154 阅读 · 0 评论 -
哈希表笔记
哈希表(HashTable)基本介绍散列表(Hash table, 也叫哈希表), 是根据关键码值(Key value)而直接进行访问的数据结构。 也就是说, 它通过把关键码值映射到表中一个位置来访问记录, 以加快查找的速度。这个映射函数叫散列函数, 存放记录的数组叫做散列表基本图示左边一列就是数组的形式,数组的每个位置存的是一个链表Google公司的一个上机题有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,名字,住址…),当输入该员工的 id 时,要求查原创 2020-10-06 15:39:01 · 224 阅读 · 0 评论