数据结构与算法
喝咖啡的皮卡丘
正在学习java的大三学生,会分享一些整理的经典问题和知识点、注意事项等。
展开
-
java学习笔记(数据结构与算法14) KMP算法解决字符串匹配问题
问题:有一个字符串 str1= "BBC ABCDAB ABCDABCDABDE",和一个子串 str2="ABCDABD"现在要判断 str1 是否含有 str2,如果存在,就返回第一次出现的位置,如果没有,则返回-1KMP算法思路:1.总体思路:我们设置两个索引(i,j)来比较str1第i个元素和str2第j个元素是否相等。(1)如果相等则比较下一个(2)不相等,则j=next[j],这里next[j]的含义是“在str2字符串中,标号为j的字符前面的字符有多少和.原创 2021-10-02 19:12:21 · 100 阅读 · 0 评论 -
java学习笔记(数据结构与算法13)分治算法解决汉诺塔问题。
目录分治算法:汉诺塔问题:思路:代码:结果:分治算法:分治算法的基本思想:将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。分治算法解题的一般步骤:(1)分解,将要解决的问题划分成若干规模较小的同类问题;(2)求解,当子问题划分得足够小时,用较简单的方法解决;(3)合并,按原问题的要求,将子问题的解逐层合并构成原问题的解。汉诺塔问题:将A塔的所有圆盘移动到C塔。...原创 2021-10-02 15:39:31 · 130 阅读 · 0 评论 -
java学习笔记(数据结构与算法12)贪心算法解决集合覆盖问题。贪心算法经典案例。
贪心算法:贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择。而在集合覆盖的问题中,贪心算法可以得到最优解。如果我们选择每个电台的权值(可以理解为电台支出)不同,而在不考虑权值时,可能有多个解,而贪心算法得到的是其中一个解,这个解不一定是权值最优的解。题目:...原创 2021-09-28 18:32:09 · 183 阅读 · 0 评论 -
java学习笔记(数据结构与算法11)动态规划解决背包问题。
目录题目:思路:代码:结果分析:题目:最基本的背包问题就是01背包问题(01 knapsack problem):一共有N件物品,第i(i从1开始)件物品的重量为w[i],价值为v[i]。在总重量不超过背包承载上限W的情况下,能够装入背包的最大价值是多少?思路:我们解决这个问题的思路是:1.创建一个back,back[i][j]代表放入尝试放入前i-1个物品时,占用j容量时,可取到的最大价值量。2.依次尝试每个物品,然后在赋值在尝试该物品时,不同容量下...原创 2021-09-28 10:36:25 · 204 阅读 · 0 评论 -
java学习笔记(数据结构与算法10)图的基本方法实现,深度优先搜索dfs,广度优先搜索bfs实现,java代码带注释。
import java.util.ArrayList;import java.util.Arrays;import java.util.LinkedList;import java.util.List;public class Map { public static void main(String[] args) { Graph graph=new Graph(8); String vertexs[]={"1","2","3","4","5","6",".原创 2021-09-23 18:52:10 · 98 阅读 · 2 评论 -
java学习笔记(数据结构与算法9)课程设计-压缩文件和解压文件,思路代码注释。
压缩思路:1.先将要压缩的句子或者文件内容存入一个byte数组中2.处理字符串,存入哈希表<byte值,出现频率>3.根据字符串处理后的哈希表创建一个哈夫曼树,字符都是叶子节点,出现频率越高,距离根结点越近4.生成哈夫曼编码表,保存在哈希表中<Byte值,编码>,比如字母i(本身有一个byte)会对应一个比如001这样的编码。 byte值对应的编码是根据从根结点到该节点的路径,往左走一步在编码后面加个“0”,右走加“1”5.根据哈夫曼编码表得到字符串对应的哈夫曼.原创 2021-09-21 16:38:01 · 186 阅读 · 0 评论 -
java学习笔记(数据结构与算法8)二叉排序树的创建,二叉树的前序遍历,中序遍历,后序遍历,代码加注释。
package BinaryTree;public class Test { public static void main(String[] args) { TreeNode t1=new TreeNode(6,"小李"); TreeNode t2=new TreeNode(5,"小五"); TreeNode t3=new TreeNode(8,"小八"); TreeNode t4=new TreeNode(2,"小二"); .原创 2021-09-13 11:11:56 · 79 阅读 · 0 评论 -
java学习笔记(数据结构与算法7)查找专题-斐波那契查找,自身理解+代码实现,斐波那契查找的好处。
斐波那契查找的理解:要理解斐波那契查找,首先要知道它的优点,虽然它和二分查找一样,时间复杂度为O(log2n),但斐波那契查找过程中,只涉及到加减法,不涉及到乘法,因此在查找速度上是有所提升的。斐波那契查找分为创建新数组和查找两部分。首先我们先了解一下斐波那契数列,斐波那契数列中的数据满足前两个为1,后面每个值等于前面两个的和,这样我们就仅仅用加法实现了一个接近成倍递增的数列。创建新数组的作用是使其长度等于斐波那契数列中的数据。从而每次查找都能从中间分为左右两个,同时左右都是斐波那契数列中的原创 2021-09-12 15:54:22 · 215 阅读 · 0 评论 -
java学习笔记(数据结构与算法6)排序专题-基数排序。用空间换取时间的超快排序。java代码加注释。
package Sort;public class JiShu { public static void main(String[] args) { int arr[]={21,24,57,62,6523,36,1,89,245}; JiShuSort(arr); for(int i=0;i<arr.length;i++){ System.out.print(arr[i]+" "); } }.原创 2021-09-12 19:58:43 · 119 阅读 · 0 评论 -
java学习笔记(数据结构与算法6)排序专题-归并排序,随机数生成。java代码实现,带思路注释。
package Sort;import java.util.Arrays;import java.util.Random;public class MergerSort { public static void main(String[] args) { //随机数的生成,先创建一个random对象(这里要调用Random包) //然后用对象调用nextInt方法,参数n的含义是随机数出自[0,n) int[] arr=new int[10.原创 2021-09-10 17:15:34 · 172 阅读 · 1 评论 -
java学习笔记(数据结构与算法6)排序专题-快速排序。java代码实现,带思路注释。
package Sort;import java.util.Arrays;public class QuickSort { public static void main(String[] args) { int[] arr = {3,5,32,532,1,5,2,4}; System.out.println(Arrays.toString(arr)); Quick(arr,0,arr.length-1); System....原创 2021-09-10 11:46:31 · 75 阅读 · 1 评论 -
java学习笔记(数据结构与算法5)多位计算器,实现括号等功能,利用后缀表达式求解,源代码带注释、思路。
功能实现:输入一个字符串(计算式),计算其结果解题思路:1.先将计算式的数字,符号,存入一个String集合中(这里主要解决的是如12,,536这种多位数)2.然后将中缀表达式转化为后缀表达式,如1+2->12+,再如3*(4+2)->342+*,这个过程总的说就是 按照运算优先级一小步一小步转成后缀表达式3.最后利用后缀表达式和栈进行计算。package JiSuanQi;import java.util.ArrayList;//import java.util.It.原创 2021-09-09 13:07:16 · 353 阅读 · 1 评论 -
java学习笔记(数据结构与算法4)将中缀表达式转化为后缀表达式,实现将多位数的运算式拆分存入数组,java代码带注释。
package JiSuanQi;import java.util.ArrayList;import java.util.Iterator;import java.util.Scanner;import java.util.Stack;/*功能实现:输入一个字符串(计算式),将其转化为后缀表达式解题思路:先将计算式的数字,符号,存入一个String集合中(这里主要解决的是如12,,536这种多位数 *///main作为测试,这里不再赘述。public class Test { .原创 2021-09-09 11:52:32 · 196 阅读 · 1 评论 -
java学习笔记(数据结构与算法3)双向链表的增、删、查、改,源代码。
package Linke;public class DoubleLinkeTest { public static void main(String[] args) { DoubleLinke linke=new DoubleLinke(); People people1=new People("张三",1); People people2=new People("李四",2); People people3=new Peopl.原创 2021-09-08 15:22:20 · 73 阅读 · 0 评论 -
java学习笔记(数据结构和算法2)链表的反转(通过栈实现)源代码带注释,链表的java实现,栈的java实现。
package Linke;public class Test { public static void main(String[] args) { Link link=new Link(); PersonNode a=new PersonNode(1,"张三"); PersonNode b=new PersonNode(2,"李四"); PersonNode c=new PersonNode(1,"张三"); P.原创 2021-09-08 09:58:39 · 140 阅读 · 0 评论 -
java学习笔记(数据结构与算法1)数组和稀疏数组的相互转换,传入文件,从文件读取稀疏数组,代码实现
为了节约空间,我们常用稀疏数组来存储大部分元素为0的数组。这里不对稀疏数组做过多解释,只略微解析代码。本代码秉承着面向对象的思想,将稀疏数组封装成一个类。构造方法可以传入地址,也可以传入数组当在构造方法中传入地址时,会调用Input方法从文件中读入稀疏数组,当构造方法传入数组时,会初始化对象的数组属性。类中还包含稀疏数组和数组的转换方法changeXiShuArray和changeArray同时还有打印方法。下面方法的执行结果如下:实现了使用4*3的数组将5*5的数组读入...原创 2021-09-07 15:32:26 · 99 阅读 · 0 评论