![](https://img-blog.csdnimg.cn/2021062120035320.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构与算法
介绍有关数据结构与算法的简单知识
妄痴梦中
对于学习路上的一些知识进行总结,希望能帮助到各位朋友
展开
-
对list分组的前世今生
问题:根据student类的属性颜色对list进行分组!computeIfAbsentCollectors.groupingBy原创 2022-05-15 10:02:02 · 159 阅读 · 0 评论 -
力扣题之两数相加
2.两数相加(传送门)给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。因为相同位置的数加起来会涉及到该节点下一个节点数据的改变,所以我选用集合ArrayList辅助解决问题(有点笨了)但是还是那句话,自己依靠自己的思路来一遍,会提升我们的编码手感代码: /** * 2. 两数相加 */public cl原创 2021-12-16 12:36:39 · 996 阅读 · 0 评论 -
霍夫曼编码的压缩与解压
赫夫曼编码百度定义:哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫做Huffman编码(有时也称为霍夫曼编码)在了解赫夫曼编码前先了解一下定长编码:太长变长编码:多义性赫夫曼编码:...原创 2021-08-16 20:27:48 · 1733 阅读 · 2 评论 -
霍夫曼树详解Java数据结构篇
赫夫曼树定义:给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为赫夫曼树(Huffman Tree)。什么赫夫曼树,霍夫曼树都是翻译的不同产物罢了;路径:从一个节点到另一个节点的通路称为路径;路径的长度:路径中通过节点两两连线的个数即为路径长度;权:节点中的值即为权;带权路径长度:路径长度*权=带权路径长度树的带权路径长度:所有叶子节点的带权路径长度之和,记为WPL(由此可见权值大的,离根节点越近的越优)赫夫曼树:WPL最小的树下面原创 2021-08-14 19:51:54 · 187 阅读 · 0 评论 -
堆排序详解
堆排序>思路:(由于二叉树比较起来困难,所以就将二叉树放入数组中进行比较) 如: 5 / \ 写成 6 3 ===》arr={5,6,3,4,2,9,8} / \ / \ 4原创 2021-08-14 14:52:03 · 115 阅读 · 0 评论 -
二叉树之顺序存储二叉树Java数据结构篇
二叉树之顺序存储>>二叉树的顺序存储:(为堆排序的学习做铺垫) 将数组按顺序写成二叉树,再将二叉树前序,中序,后序遍历 int[] arr={1,2,3,4,5,6,7}; 1 / \ 2原创 2021-07-27 20:05:28 · 126 阅读 · 0 评论 -
二叉树Java数据结构篇
本章学习目录页内目录一,二叉树的介绍二,二叉树的图解三,二叉树的名词解释四,二叉树的节点五,二叉树的三序遍历六,二叉树的节点删除七,二叉树的测试一,二叉树的介绍二叉树:(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个结点最多只能有两棵子树,且有左右之分 。二,二叉树的图解三,二叉树的名词解释(摘自百度)原创 2021-07-22 17:08:23 · 273 阅读 · 0 评论 -
哈希表基于数组和链表java数据结构篇
本章学习目录页内目录一,哈希表的介绍二,哈希表的图解三,哈希表的链表部分四,哈希表的实现类五,结果测试与展示一,哈希表的介绍哈希表:散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。组成:由数组和链表结合二,哈希表的图解三,哈希表的链表部分节点类public class Emp {原创 2021-07-13 21:38:42 · 299 阅读 · 4 评论 -
插值查找算法详解及优化
插值查找插值查找,有序表的一种查找方式。插值查找是根据查找关键字与查找表中最大最小记录关键字比较后的查找方法。插值查找基于二分查找,将查找点的选择改进为自适应选择,提高查找效率。自适应选择点: int mid=left+(findVal-arr[left])*(right-left)/(arr[right]-arr[left]);>>思路:定义很明显就是基于二分查找,所以直接搬问题就在于这个自适应选择自适应选择点: ` int mid=left+(findVal-arr[left])原创 2021-07-08 21:06:05 · 491 阅读 · 1 评论 -
查找算法之线性查找详解与优化
线性查找这里的线性查找,给定的数组无需有序>>思路:1.就是利用for循环遍历,直到找到为止>>优化:给定一个标识,判断是否找到代码: public static void linearSearch(int[] arr,int findVal){ for (int i = 0; i < arr.length; i++) { if (arr[i]==findVal){ System.ou原创 2021-07-06 19:57:33 · 103 阅读 · 2 评论 -
八大排序算法全讲解
排序算法算法名(可跳转)平均时间复杂度最好情况最坏情况空间复杂度排序方法稳定性冒泡排序O(n2)O(n)O(n2)O(1)内模式稳定选择排序O(n2)O(n2)O(n2)O(1)内模式不稳定插入排序O(n2)O(n)O(n2)O(1)内模式稳定希尔排序O(n log n)O(n log2 n)O(n2)O(1)内模式不稳定归并排序O(n log n)O(n log n)O(n log n)O(n)原创 2021-07-06 11:04:14 · 154 阅读 · 4 评论 -
基数排序详解及演示
基数排序基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog®m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。>>思路:1. 用一个二维数组类似的表示10个桶,每个桶是一个一维数组;分别代表该位是0,1,2原创 2021-07-06 09:43:40 · 176 阅读 · 0 评论 -
归并排序详解
归并排序归并排序(Merge Sort)是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。>>思路:归并排序总体分为两大部分:分:将需要排序的数组分成若干子列(采取递归方式)如: [8,9,6,3]原创 2021-07-05 14:56:55 · 92 阅读 · 2 评论 -
快速排序详解(一文解决)
快速排序>>思路:1. 随便取数组中一个数作为比较数记录下来,(作者采用了第一个数)2. 在数组的左端,右端位置各插入一个指针,(该指针用于于比较数比较)3. 通过一个while循环,右指针减减,找出第一个比比较数小的数,4. 因为前面的比较数已经记录下来,所以比较数原来的位置可覆盖,则将右指针得到的数赋值于比较数原来的位置5. 再通过一个while循环,左指针加加,找出第一个比比较数大的数,6. 因为前面右指针找到的数,已经记录下来,所以它原来的位置可覆盖,则将左指针得到的数赋值原创 2021-07-05 09:58:45 · 90 阅读 · 2 评论 -
希尔排序详解及优化
希尔排序>>思路:通过数组长度不断除2得到每次的步长,每次得到的数组,其中在每个步长中的对应位置的数, 组合起来是有顺序的,如此反复,当步长为1时,便得到该有序数组步长为数组.length/2时:1. 先将数组.length/2作为步长,将它们每组的第0项,第1项,第2项...进行比较,大的放在后一半的第0项, 小的放在前一半的第0项原创 2021-07-03 19:54:58 · 289 阅读 · 3 评论 -
简单数组对数器的实现
对数器的实现 >>思路: 1. 写一个方法,传入想要实现数组的,大小和范围,并返回一个数组 2. 根据大小定义定长的数组 3. for循环遍历数组,为数组的每一项赋值(用Random类中的nextInt方法传入范围) 4. 返回该数组代码: public static int[] randomArr(int size,int group){ int[] arr = new int[size];//规定数组的size for (int i=0;原创 2021-07-02 16:14:17 · 56 阅读 · 0 评论 -
逆波兰计算器
逆波兰计算器的实现思路定义:逆波兰表达式又叫做后缀表达式。逆波兰表示法是波兰逻辑学家J・卢卡西维兹(J・ Lukasiewicz)于1929年首先提出的一种表达式的表示方法 [1] 。后来,人们就把用这种表示法写出的表达式称作“逆波兰表达式”。逆波兰表达式把运算量写在前面,把算符写在后面。 >>整体思路: 1. 首先我们输入中缀表达式; 例如:1+((2+3)*4)-5 2. 将其转换为list集合下的单个元素;原创 2021-07-01 20:38:13 · 245 阅读 · 0 评论 -
栈Java数据结构篇
本章学习目录页内目录一,栈的介绍二,栈的主体三,栈满和栈空的判断四,入栈和出栈的操作五,遍历栈六,整体流程一,栈的介绍栈:(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。特点:先进后出入栈(push):出栈(p原创 2021-06-24 19:27:54 · 72 阅读 · 0 评论 -
循环链表Java数据结构篇(即约瑟夫环问题)
本章学习目录问题的引出:17世纪的法国数学家加斯帕在《数目的游戏问题》中讲了这样一个故事:15个教徒和15 个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了一个办法:30个人围成一圆圈,从第一个人开始依次报数,每数到第九个人就将他扔入大海,如此循环进行直到仅余15个人为止。问怎样排法,才能使每次投入大海的都是非教徒。问题的解决:循环链表可以实现上述问题的解决页内目录一,环形链表的介绍二,约瑟夫环的问题三,环形链表的节点类四,环形链表的建立和打印五,约瑟夫环问题的原创 2021-06-24 16:42:46 · 202 阅读 · 0 评论 -
双链表Java数据结构篇
本章学习目录页内目录一,双链表的简单介绍二,双链表节点类三,双链表操作类一,双链表的简单介绍双向链表:也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。逻辑结构图:双向链表的学习,都是基于单链表延伸的,所以单链表学清楚,对双链表的学习有帮助,而且里面的方法也是大同小易的,二,双链表的节点类package com.双链表;/** *原创 2021-06-24 10:22:09 · 128 阅读 · 2 评论 -
单链表Java数据结构篇
本章学习目录页内目录一,了解单链表二,定义节点类三,链表的增删改查四,链表的进阶操作一,单链表概念:是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。组成:链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每原创 2021-06-22 21:18:53 · 146 阅读 · 2 评论 -
位1的个数(汉明重量) 位运算解
或运算统计>问题: 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量)。>思路1.位运算中找合适的运算符号,首先我们要了解各符号的特性2.这里我将用到|(或)的特性:两者有1就1,全0才03.这里简单做一下举例:比如要测1000111我们给出如下:0000001 相当于1<<00000010 相当于1<<10000100 相当于1<<20001000 相当..原创 2021-06-16 16:14:33 · 168 阅读 · 0 评论 -
多数元素 位运算解
工具链接:位运算表>问题: 给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素>思路: 1. 排序 2. 取下标为中间的值方法代码: public static int majorityElement(int[] nums) { Arrays.sort(nums); return nums[nums.length/2]; }...原创 2021-06-15 12:50:35 · 154 阅读 · 0 评论 -
取二进制最右边的1
问题:怎么把一个数N的二进制类型下最右边的1提取出来?如N的二进制原码为:…001010110000需要得到的结果为 :… 000000010000位运算N&((~N)+1) 可以实现运算二进制结果N001010110000~N110101001111(~N)+1110101010000N&((~N)+1)000000010000注:位运算详解请点击 位运算...原创 2021-05-03 20:20:50 · 1109 阅读 · 0 评论 -
进制
进制十进制(当十进制下为10): System.out.println(10);//结果为:10二进制(10在二进制下为2): System.out.println(0b10);结果为://2八进制(10在八进制下为8): System.out.println(010);结果为://8十六进制(10在十六进制下为16): System.out.println(0x10);结果为://16进制转换: ..原创 2021-05-03 18:28:20 · 69 阅读 · 0 评论 -
位运算表
位运算Java中的位运算运算符使用样式功能描述~~a对a的每个二进制位取反(包括符号位)1变0,0变1&a&ba和b对应二进制位置相与,均1才1,否则0|a|ba和b对应二进制位置相或,右1就1,否则0^a^ba和b对应二进制位置相异或,不同为1,相同为0<<a<<n左移n位,最右边补零(相当于乘以2的n次方 )>>a>>n右移n位,最左边补符号位(相当于除..原创 2021-05-03 17:34:57 · 421 阅读 · 0 评论 -
只出现一次的数字(成对数)位运算解
问题一个数组中,一种数出现奇数次,其他数都是偶数次,怎么打印该数?如该数组为{1,2,3,1,2,3,3}代码:package com.ttttttt;public class ArrOdd { public static int arrOdd(int[] arr){ int ero=0; for(int i=0;i<arr.length;i++){ ero^=arr[i];//ero=ero^arr[i]; ..原创 2021-05-02 00:16:35 · 154 阅读 · 0 评论 -
最小公倍数
基于欧几里得算法求最小公倍数代码:package com.ttttttt;/** * m,n为两个数,o为m乘n的积,mul方法为求最小公倍数 */public class Mul { public static long mul(int m, int n){ int o=m*n;//得到n*m的积 while (n!=0){ int rem=m%n; m=n; n=rem;..原创 2021-04-30 13:19:29 · 57 阅读 · 0 评论 -
欧几里得算法
欧几里得算法求最大公因数package com.ttttttt;/** * m,n为两个数,gcd方法为求最大公因数 */public class Gcd { public static long gcd(int m, int n){ while (n!=0){ int rem=m%n; m=n; n=rem; } return m; } public.原创 2021-04-29 22:50:50 · 104 阅读 · 0 评论 -
高效率的幂运算
递归求幂运算package com.ttttttt;public class Pow { public static long pow(int x,int n){ if (n==0)return 1; if (n==1)return x; if (n%2==0)return pow(x*x,n/2); else return pow(x*x,n/2)*x; } public static void main(.原创 2021-04-29 22:26:22 · 75 阅读 · 0 评论 -
二分查找基于递归详解及优化
折半查找这里对插入排序和折半查找进行了封装package com.ttttttt;/** * @return 找到项的索引,如果没有找到则为-1 */public class Search { public static int binarySearch(int[] arr, int a) { charuSort(arr);//运用排序算法,这里使用了插入排序,也可以用冒泡,选择排序等等... int low = 0; int high原创 2021-04-28 17:55:00 · 106 阅读 · 0 评论 -
插入排序详解及代码的优化
插入排序图解:快速排序基于java的代码:package com.ttttttt;public class Sort2 { public static void charuSort(int[] arr){ for (int i=1;i< arr.length;i++){ for (int j=i-1;j>=0&&arr[j]>arr[j+1];j--){ //交换//原创 2021-04-23 19:24:28 · 88 阅读 · 0 评论 -
选择排序详解
选择排序这里小猿采用了封装的方法!接下来讲解实现流程:内部的j循环就相当于把数组中的最小值取出来,赋值于第i位以我给的数组为例,通过i循环的第0位,依次比较j循环的第一位,第二位,以此类推,每比较一次,都将其两者中的最小值赋值与minIndex位外部的i循环就相当于给j的赋值提供一个变化的位置这是我设置的数组:33 22 11 44 55 77 66package com.ttttttt;原创 2021-04-22 21:18:13 · 97 阅读 · 0 评论 -
冒泡排序算法详解及优化
java编写一个方法,其功能是对一个整型数组升序排列(请采用冒泡算法)According to 我的刚学的 konwledge ,the 冒泡就是这样写的public class test { public static void maopao(int[] arr) { for (int i = 0; i <= arr.length - 1; i++) { for (int j = 0; j < arr.length - i - 1; j++)原创 2021-04-02 22:37:11 · 135 阅读 · 0 评论