数据结构和算法
q6301031
在校生一枚,以自己理解的方式记录学习心得,供日后复习使用,大都是自己的学习方法来记录,有相同或类似学习方法的可以来参考
展开
-
数据结构算法爬坑日记十九
最短路径Dijkstra算法Floyd算法Dijkstra算法思路:将一个点作为出发点,基于广度优先进行遍历,将出发点到各个点的最短距离记录,在以出发点到各个点最短距离的点进行遍历,查看经过该点到各个点的距离是否是最短距离,如果是就更新,循环此操作直到将所有的点全部遍历代码实现//Dijkstra求解最短路径public class Dijkstra { char[] vertexes;//顶点数组 int[][] commons;//邻接矩阵 int[] alrea原创 2020-09-09 22:09:06 · 80 阅读 · 0 评论 -
数据结构算法爬坑日记十八
常用算法二贪心算法普利姆算法(Prim)贪心算法思想:使用贪心算法进行求解时,也是将一个大问题分为若干小问题进行求解,在求解时,每一步都使用当前问题的最优解,从而希望最终的结果也是最优的. 贪心算法得到的结果不一定是最优的结果,但都是与最优解接近的结果求解集合覆盖问题问题描述:有若干个电台,每个电台覆盖若干个地区,找出覆盖所有地区的最少电台组合,如果使用穷举法,在电台数量大时,组合的复杂度就是指数级,效率有限代码实现//贪心算法求解集合覆盖public class Greedy {原创 2020-09-07 19:24:01 · 83 阅读 · 0 评论 -
数据结构算法爬坑日记十七
常用算法一二分查找非递归方式分治法动态规划KMP二分查找非递归方式与递归方式原理相同代码实现//非递归二分查找public class BinarySelect { public static void main(String[] args) { int[] arr = {1, 2, 6, 9, 20}; System.out.println(select(arr, -2)); } public static int select(int原创 2020-09-05 01:37:07 · 66 阅读 · 0 评论 -
数据结构算法爬坑日记十六
图图的概念图的遍历图的概念相关概念:由于线性表和树只能有一个前驱节点,无法表示多对多的关系,需要图来表示这种关系,图是一种数据结构,节点可以有0个或多个相邻元素,节点也成为顶点,两节点的连接称为边,如果两节点的连线带方向为有向图,无方向则为无向图,带值的连线为带权图(也叫网)图的表示方式: ** 邻接矩阵:用一个n*n的二维数组来表示图的每个节点的连接(n为节点个数) ** 邻接表:邻接矩阵在表示图的时候会有很多个无用的值,造成空间浪费,可以使用数组+链表的方式来解决, 数组来表示每个原创 2020-08-31 03:58:28 · 60 阅读 · 0 评论 -
数据结构算法爬坑日记十五
平衡二叉树平衡二叉树(AVL)平衡二叉树(AVL)介绍:在使用二叉排序树时,如果出现类似依次增大或依次减小的这种情况,此时的二叉树便类似于单链表了,因为二叉树在查找的时候每次还需要进行判断才能往下走,此时查询速度明显降低,所以便需要平衡二叉树来解决,平衡二叉树也叫平衡二叉搜索树,属于一种特殊的二叉排序树,特点是:它是一棵空树或者左右子树的高度差的绝对值不超过1且左右子树也分别是一颗平衡二叉树,在不符合上述要求时,就需要通过一些策略来对树进行调整来满足平衡二叉树要求调整策略: ** 左旋转原创 2020-08-30 19:59:15 · 95 阅读 · 0 评论 -
数据结构算法爬坑日记十四
二叉排序树二叉排序树:对于二叉排序树的任意一个非叶子节点,它的左子节点的值比当前节点的值小,右子节点比当前节点的值大(如果相同,放在左右均可,应尽量避免出现相同的值)代码实现 ** 二叉排序树节点类 //二叉排序树节点public class Node { int value;//节点权值 Node left; Node right; public Node(int value) { this.value = value; }原创 2020-08-29 01:30:33 · 93 阅读 · 0 评论 -
数据结构算法爬坑日记十三
堆排序堆排序堆是一个完全二叉树,每个节点的值都大于或等于左右节点的值的堆叫大顶堆,小于左右节点的值的堆叫小顶堆堆排序思路:先将原数列构造成一个大顶堆或小顶堆(是数列下标对应的顺序存储二叉树),然后将根节点与数列最后的节点进行交换,再将剩余的数列构成一个堆,循环直到得到一个有序序列,一般升序用大顶堆,降序用小顶堆构建大顶堆思路:从最后一个非叶子节点对应子树开始与其左右节点进行比较交换,依次向上比较,直到全部交换完毕即可得到一个大顶堆代码实现(升序)//堆排序public class He原创 2020-08-28 16:29:59 · 86 阅读 · 0 评论 -
数据结构算法爬坑日记十二
二叉树顺序存储二叉树线索化二叉树顺序存储二叉树数组存储与树存储得相互转换,就是将数据内容也就是二叉树节点以数组方式存储,通过二叉树得方式来获取数组得下标,进而获取数据特点:(n为二叉树得第几个元素,从0开始 对应数组下标) ** 通常只考虑完全二叉树 ** 第n个元素得左子节点为 2n+1 右子节点为 2(n+1) ** 第n个元素得父节点为(n+1)/2代码示例 (中序后序遍历与之类似) ** 顺序存储二叉树类 //顺序存储二叉树public class ArrayBinary原创 2020-08-26 22:16:21 · 92 阅读 · 0 评论 -
数据结构算法爬坑日记十一
树概念二叉树的遍历、查找和删除概念由于数组和链表在使用过程中检索,删除添加会出现一些效率低的问题,树存储方式可以大大提高检索速度,同时又保证了数据的插入,删除修改速度二叉树常用术语节点:二叉树连接的各个部分根节点:没有父节点的节点子节点:相对于父节点来说的节点叶子节点:没有子节点的节点节点的权:节点值路径:从根节点开始找到该节点的路线层:根节点为第一层,以此类推子树:以子节点为根节点的树是相对于父节点的字树树的高度:最大层数森林:多颗子树共同组成二叉树:每个节点最多有两个子节原创 2020-08-26 15:11:30 · 99 阅读 · 0 评论 -
数据结构算法爬坑日记十
哈希表哈希表(hash table)哈希表(hash table)哈希表:也叫散列表,通过将关键码值映射到表中的一个位置来访问,加快查找的速度,映射函数也叫散列函数,存放记录的数组叫散列表,在对一些不常改变的数据进行操作的时候,为了加快速度,通常会采用缓存技术将其加载到内存中进行操作,而不直接对数据库进行操作,如redis,散列表就相当于一个简化版redis,可以通过数组+链表或数组+二叉树来实现示例题:一个公司,当有新员工来报道时,将该员工的信息加入,输入员工id时,查找到员工信息(要求不使原创 2020-08-25 18:17:08 · 103 阅读 · 0 评论 -
数据结构算法爬坑日记九
查找算法二分查找插值查找斐波那契查找常用四种 ** 线性(顺序)查找:就是将需要查找的数列进行遍历挨个比对即可 (无序有序均可) ** 二分查找/折半查找 (需要在有序的前提下) ** 插值查找 (需要有序) ** 斐波那契查找 (需要有序)二分查找思路:将数列的中间值与需要查找的值进行比较,如果大于,则向左递归,如果小于,则向右递归,分别再进行与中间值的对比,循环往复,直到找到这个数,将其位置返回或者循环结束返回没有找到代码实现//二分查找public class BinaryS原创 2020-08-24 19:13:37 · 96 阅读 · 0 评论 -
数据结构算法爬坑日记八
排序二快速排序归并排序基数排序快速排序思想:通过一次排序将一组数据分为两部分,一部分全部比另一部分小,然后对两部分分别再进行快排,循环此操作,直到不能再分割,便得到一个有序序列代码实现//快速排序public class QuickSort { public static void main(String[] args) { int[] arr = {8, 7, 5, 9, 6, 0, 2, 2, 2, 3, 10, 25, -2, -5,-8,-3};原创 2020-08-23 15:07:14 · 102 阅读 · 0 评论 -
数据结构算法爬坑日记七
排序算法复杂度排序算法冒泡排序选择排序插入排序希尔排序算法复杂度时间频度:一个算法花费的时间与算法中语句的执行次数成正比,一个算法中执行语句次数为语句频度/时间频度,记为T(n)时间复杂度:T(n)/f(n),当n趋向无穷大时,比值为一个不等于0的常数,则称f(n)是T(n)的同量级函数,记作T(n)=O(f(n)),称O(f(n))为算法的时间复杂度 ** 计算方法 ** 忽略常数项 ** 只保留最高次数项 ** 忽略最高次数项的系数常见的时间复杂度 ** 常数阶 O(1) 通原创 2020-08-22 18:45:25 · 117 阅读 · 0 评论 -
数据结构算法爬坑日记六
回溯算法八皇后问题回溯法:也叫向前试探法,试着寻找正确的求解,当探索到某一步不符合规则时,便回退到上一步进行重新选择,直到获取预期的解法八皇后问题问题描述:在8*8的国际象棋棋盘上,放置八个皇后且八个皇后不能互相攻击思路:先将第一个放在第一行第一列,然后将第二个放在第二行第一列,检查是否满足规则,如果满足则进入第三个的放置,如果不满足尝试下一列,直到八个全部放置完毕,当得到一种解法之后,回退到上一层的栈内开始回溯,直到获得所有解法代码解答//八皇后求解public class Quee原创 2020-08-21 15:58:11 · 82 阅读 · 0 评论 -
数据结构算法爬坑日记五
前缀、中缀、后缀计算规则计算器计算规则概念前缀(波兰表达式):前缀表达式的运算符位于操作数之前 如(3+4)*5-6 ==> - * + 3 4 5 6 计算时从右向左扫描,遇到数将其压入堆栈,遇到符号从栈内弹出两个数进行计算,将结果再次入栈,扫描结 束,栈内的值即为结果,减和除先弹出的数在前中缀表达式:我们日常使用的形式(计算机不易识别)后缀(逆波兰表达式):运算符位于操作数之后 如 (3+4)*5-6 ==> 3 4 + 5 * 6 - 计算时从左到右扫描,遇到数将其压入堆栈原创 2020-08-19 23:24:22 · 108 阅读 · 1 评论 -
数据结构算法爬坑日记四
栈栈(stack)数组实现链表实现栈(stack)概述:一个有序列表,先进后出,插入和删除只能在栈的一段进行,叫做栈顶,另一端为栈底,可由数组或链表来实现数组实现 ** 数组模拟类(与链表模拟一起测试)//数组模拟栈public class ArrayStack { int top=-1; // 栈顶 int maxSize; // 栈的最大长度 int[] stack; // 栈存放数据的数据 public ArrayStack(int maxSize){原创 2020-08-18 18:12:28 · 92 阅读 · 0 评论 -
数据结构算法爬坑日记三
约瑟夫环的解决问题描述:有m个人围成一个圈,指定从第n个人开始依次报数,每报到K时的人出列,然后出列后面的人从1继续报数,无限循环直到剩下一个人为止 ** 代码实现(以环形链表方式) ** 节点类 //节点类public class Node { int id; Node next; public Node(int id) { this.id = id; }}** 环形链表类//环形链表public class RoundLinked原创 2020-08-17 18:38:01 · 96 阅读 · 0 评论 -
数据结构算法爬坑日记二
单链表链表是一个有序的列表,以节点的方式来存储,每个节点包括data域存数据和next域指向下一个节点,各个节点不一定是连续存储的,实现有带头节点和不带头节点俩种实现方式单链表示例(带头节点的) ** 节点类 //链表节点public class UserNode { int id; String name; UserNode next; //指向下一个节点 public UserNode(int id, String name) { this原创 2020-08-17 14:06:23 · 87 阅读 · 0 评论 -
数据结构算法爬坑日记一
稀疏数组数据结构分类稀疏数组(sparseArray)数据结构分类线性结构:最常用的数据结构,特点是数据元素之间存在一对一的线性关系 ** 分俩种存储结构 ** 1.顺序存储结构:又称为顺序表,存储元素是连续的 ** 2.链式存储结构:又称为链表,存储元素不一定是连续的,元素节点中存放数据元素以及相邻元素的地址结构常见线性数据结构:数组、队列、链表、栈非线性结构:常见二维数组、多维数组、广义表、树、图稀疏数组(sparseArray)使用场景:如果一个数组很多元素的值都相同时,使用稀疏原创 2020-08-16 16:02:46 · 93 阅读 · 0 评论