数据结构与算法
数据结构与常用算法Java实现
Aruba233
人生就是不断的超越自我
而超越自我需要不断的坚持
展开
-
哈希表(Java)
哈希表结合了顺序表和链表两者的优势,顺序表随机访问快,链表插入删除元素快。那么怎么将两者结合呢?首先想要随机访问速度快,必须用顺序表,试想一下一个场景:1.场景一A往数组里填充了几个元素:4,2,66,89,1将这个数组交给了BB拿到数组后,想要获取元素:1,但是B不知道元素1具体在哪个索引下,所以B只能遍历数组,从而获取到了元素:1时间复杂度 O(n) n为数组大小2.场景二B显...原创 2021-07-23 11:38:17 · 82 阅读 · 0 评论 -
二叉搜索树(Java)
二叉搜索树具有如下性质:1)若左子树不为空,那么左子树上面的所有节点的关键字值都比根节点的关键字值小2)若右子树不为空,那么右子树上面的所有节点的关键字值都比根节点的关键字值大3)左右子树都为二叉树二叉搜索树利用二分的思想,在构建树时,就对节点的值进行了一定的排序,缩短了查找时间/** * 搜索树 */ public static class Sea...原创 2021-07-28 10:55:24 · 153 阅读 · 0 评论 -
平衡二叉树AVLTree手写实现(Java)
定义节点://平衡因子 左树深度多 public static final int LH = 1; //平衡因子 右数深度多 public static final int RH = -1; //平衡因子 左右树深度相同 public static final int EH = 0; class A...原创 2021-07-31 19:42:34 · 203 阅读 · 0 评论 -
哈夫曼树(Java)
哈夫曼树:其实就是一个压缩算法,类似于最优解例子:有一次考试成绩分为4个等级:A、B、C、D,班级有100人,其中获得A的人数为20人,获得B为40人,获得C为10人,获得D为30人。问:输入所有人的成绩,获取每个人成绩对应的等级,如何使得判断次数最少?伪代码:for 100 to 0 //遍历100人 get num //获得分数 if A == num //分数属于A ...原创 2021-08-09 16:06:33 · 161 阅读 · 0 评论 -
图论-邻接矩阵遍历搜索(Java)
图中的元素称为“顶点”,如果两个顶点是连通的,连通的线叫作“边”,两点之间的距离叫作“权”,对于无向边(AB顶点相连,则A可以到达B,B也可以到达A),顶点A的边数叫作“度”;有向边,顶点A的边数叫作出度(AB顶点相连,A可以到达B,但B不能到达A)和入度(AB顶点相连,A不能到达B,B能到达A)。邻接矩阵的存储结构是用两个数组来表示,一个一维数组存储顶点,一个二维数据(矩阵)存储边的关系...原创 2021-08-10 14:01:13 · 464 阅读 · 0 评论 -
图论-最小生成树prim算法(Java)
最小生成树需要一个加权连通图,连通图就是所有顶点都是连在一起的,从任意一个顶点,都能到达除本身外任意一个顶点prim算法:将顶点分成两个集合 U和 V,U用来存放每次遍历得到的与U中顶点最小路径的邻接顶点,V用来存放U中没有的顶点。U初始化存放任意一个顶点,每次从V中遍历得到与U集合中的顶点最小路径的顶点后,放入U,将V中的对应顶点删除,当U存放到所有顶点后,最小生成树就得到了。利用之前的类实...原创 2021-08-11 09:55:14 · 792 阅读 · 0 评论 -
图论-最小生成树kruskal算法(Java)
和prim算法以顶点为出发点不同,kruskal算法以边为中心,将所有边以小到大排序,遍历边,如果当前边的两个顶点有一个没有访问过,则记录该边,直到记录的边到达顶点数-1时,即所有顶点都可以相连,为最小生成树实现代码:public static class Kruskal { private int verticeSize;// 顶点数量 private int...原创 2021-08-11 14:19:27 · 443 阅读 · 0 评论 -
图论-最短路径Dijikstra算法(Java)
和最小生成树不同的是,最短路径是求顶点A到B之前最短的权,不用考虑中间经过哪些顶点,只要这些路径的总和最小Dijikstra算法:初始化一个边集合,指定一个原始点,以该点为中心,求出到当前点到别的顶点的最小权(遍历求最小权,记录另一个顶点),将权更新到边集合中,无法到达的暂时不需要处理,将另一个顶点设为中心,往复操作实现代码:public static class Dijikstra { ...原创 2021-08-12 08:44:24 · 360 阅读 · 0 评论 -
冒泡排序(Java)
冒泡排序思想:一个指针指向数组尾,从头开始到指针位置进行遍历,相邻元素比较,较大值交换到后面位置,直到指针位置,此时最大值存入指针位置,指针往前移动一位,循环遍历过程,如果遍历过程没有发生交换,退出循环实现代码:/** * 冒泡排序 * * @param nums */ public void bubbleSort(int[] nums) { ...原创 2021-08-16 13:33:18 · 59 阅读 · 0 评论 -
选择排序和快速排序(Java)
选择排序思想:指针指向数组头,从指针位置到数组尾遍历最小值位置,将该位置与指针位置交换值,指针向后位移一位,循环遍历最小值实现代码:/** * 选择排序 * * @param nums */ public void selectSort(int[] nums) { for (int i = 0; i < nums.lengt...原创 2021-08-16 15:12:50 · 282 阅读 · 0 评论 -
归并排序(Java)
归并排序思想:利用空间换时间,将问题分解成一个个小问题,将排序问题分解成有序数组进行合并排序,直到最后两两比对有一个数组: 1 3 5 9 2 4 6 8,已知第0位到第3位是有序的,第4位到第7位是有序的,如何进行排序?实现代码:/** * 将数组合并 * * @param nums * @param start 0 * @param mi...原创 2021-08-17 09:11:45 · 69 阅读 · 0 评论 -
插入排序和希尔排序(Java)
插入排序思想:开始时指针指向第二个元素,从指针位置往前进行元素比较,大的元素往后挪一位,直到找到比指针位置元素小的位置,将该位置赋值成指针指向的值,指针往后移一位,此时前面的元素都已经排好序了,往复元素比较操作,只需要找到插入的位置即可实现代码:/** * 插入排序 * * @param nums */ public void insertSor...原创 2021-08-17 10:32:54 · 95 阅读 · 0 评论 -
堆排序(Java)
堆排序:堆排序的思想比较难理解,首先将数据看成是一个二叉树,对数据进行二叉树的建立(建堆),这个过程也是排序的过程,将最小或最大的值排到根节点上,如果采用最大值,则称为最大堆,反之,称为最小堆例如:有一个数组为[8,1,4,2,3],将他变为二叉树为:8 1 42 3要对它进行排序,可以从8开始,和他的左孩子和右孩子比较,将小的那个和本身进行替换,第一次替换变为:1...原创 2021-08-18 10:56:41 · 50 阅读 · 0 评论 -
最长公共子序列(Java)
最长公共子序列运用十分广泛,例如人脸识别,相似度比较等方面。子序列表示原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。比如:“abc”,“ac”是子序列,但“ca”不是实现代码:/** * 最长公共子序列 * * @param a * @param b */ public int longe...原创 2021-08-19 15:21:20 · 2092 阅读 · 0 评论