![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java的学习之路
头很凉快
这个作者很懒,什么都没留下…
展开
-
java学习第49天,归并排序
logn轮,每轮O(n)次拷贝。因此时间复杂度为O(nlogn)。空间复杂度为O(n),只需要一行辅助空间。全都是在拷贝引用,而不是数据本身。这是java的特性。归并两个有序小组的时候,用了三个并列的循环。涉及分组后尾巴的各种情况,所以需要相应的if语句。java代码:package java41to50;import java41to50.D41_DataArray.DataNode;public class D41_DataArray { class DataNode { .转载 2021-07-08 15:51:41 · 101 阅读 · 0 评论 -
java学习第48天,堆排序
堆排序可能是排序算法中最难的,用到了二叉树,理解起来也很难。建初始堆比较费劲.调整堆的时间复杂度为O(logn), 所以总体时间复杂度只有O(nlogn)。空间复杂度只有O(1)。java使用到的代码:package java41to50;import java41to50.D41_DataArray.DataNode;public class D41_DataArray { class DataNode { int key; String content; DataN.转载 2021-07-08 14:08:21 · 93 阅读 · 0 评论 -
java学习第47天,选择排序
选择排序是一个基础的排序算法。与插入排序不同, 先做最麻烦的,要进行n−1次比较才能获得最小的数据。数据一旦被选择并确定位置,就不会再改变。只需要两个额外的空间来存放最小数据的引用与下标,因此空间复杂度为O(1)。java代码:package java41to50;import java41to50.D41_DataArray.DataNode;public class D41_DataArray { class DataNode { int key; String cont.转载 2021-07-08 11:21:51 · 117 阅读 · 0 评论 -
java学习第46天,快速排序
平均时间复杂度为O(nlogn),但最坏情况还是O(n^2)。Pivot应该选(该子序列的)最后一个元素。递归算法,每次只能确定pivot的位置。判断条件&&(tempLeft < tempRight)不能少。(data[tempRight].key >= tempPivot)不能写成>,否则出现两个相同key时可能出错。冒泡算法是非常常用且基础的算法。java代码:package java41to50;import java41to50.D41_Da.转载 2021-07-08 11:06:16 · 92 阅读 · 0 评论 -
java学习第45天,冒泡排序
每次确定当前最大值,也就是确定一个位置的数据。如果某一趟没有交换, 就表示数据已经有序(早熟,premature),可以提前结束了。java代码:package java41to50;import java41to50.D41_DataArray.DataNode;public class D41_DataArray { class DataNode { int key; String content; DataNode(int paraKey, String paraCo.转载 2021-07-08 10:44:36 · 69 阅读 · 0 评论 -
java学习第44天,希尔排序
多达4重循环, 但有点难理解,晕乎乎的。可以改变 tempJumpArray,测试测试用例多用了几个数据, 便于观察。使用了第41天的代码:package java41to50;import java41to50.D41_DataArray.DataNode;public class D41_DataArray { class DataNode { int key; String content; DataNode(int paraKey, String paraCont.转载 2021-07-08 10:12:45 · 50 阅读 · 0 评论 -
java学习第43天,插入排序
插入排序是简单直接的排序方式之一. 代码非常短。每次保证前 i 个数据是有序的。先做简单的事情 (第 1 轮最多有 1 次移动), 再做麻烦的事情 (最后一轮最多有n−1次移动)。下标 0 的数据为岗哨, 与 41 天内容同理. 比其它排序方式多用一个空间。empNode只分配了引用(指针)的空间,并未new。使用了第41天的代码,贴在这里:package java41to50;import java41to50.D41_DataArray.DataNode;public class.原创 2021-07-08 09:44:56 · 40 阅读 · 0 评论 -
java学习第42天,哈希表
神奇、实用、粗暴的方法. 空间换时间。在构造方法中装入数据. 自己可以写代码增加数据。使用 (最简单的) 除数取余法获得数据存放地址 (下标)。使用 (最简单的) 顺移位置法解决冲突搜索的时间复杂度仅与冲突概率相关, 间接地就与装填因子相关. 如果空间很多, 可以看出时间复杂度为 O (1) O(1)O(1)。需要用到41天的代码,并且予以增加部分代码:package java41to50;public class D41_DataArray { class DataNode { .转载 2021-07-06 16:33:09 · 45 阅读 · 0 评论 -
java学习第41天,顺序查找与折半查找
顺序查找使用岗哨可以节约一半的时间. 为此, 第 0 个位置不可以放有意义的数据, 即有效数据只有 length - 1 个。顺序查找时间复杂度为 O ( n ) O(n)O(n)。折半查找时间复杂度为 O ( log n ) O(\log n)O(logn)。书上为简化起见, 只关注键. 这里使用键值对来表示一条完整的数据. 实际应用中可以把 content 改成任何想要的数据类型package java41to50;public class D41_DataArray { clas.原创 2021-07-06 16:16:15 · 86 阅读 · 0 评论 -
java学习第40天,学习小结
感觉代码量越来越大,越来越复杂,有些代码自己手动边写边思考里面的逻辑,很有挑战性,也有一些难度。对于一些基础算法的理解,自己还需要继续提升。了解到java的throws Exception 异常、错误抛出机制和C#有一些不同,java中强制异常处理方式, 一旦方法加入了throws关键字,那么调用这个方法的类就必须加上try和catch进行异常处理,C#中并不强制。学习了图的广度遍历算法,广度优先搜索遍历类似于树的按层次遍历。对于无向连通图,广度优先搜索是从图的某个顶点v0出发,在访问v0之后,依次搜.原创 2021-07-06 15:56:10 · 50 阅读 · 0 评论 -
java学习第39天,关键路径
1,拓扑排序是关键路径的一部分。2,关键路径长度, 其实是最远路径长度。然而,它并非最短路径的对偶问题。3,正向算每个节点的最早开始时间, 逆向算每个节点的最晚开始时间, 设计太了。4,最晚开始时间的初始化容易弄错, 经典算法是不好对付的。需要连接第38天的代码,在这里贴出来package java31to40;import java.util.Arrays;public class D38_Net { public static final int MAX_DISTANCE = 100原创 2021-07-06 15:10:26 · 84 阅读 · 0 评论 -
java学习第38天,Dijkstra 算法与 Prim 算法
1,又需要画个几个图, 换几个例子。2,Dijkstra 算法需要有向图, Prim 算法需要无向图. 代码中也需要更换后者。3,两个算法的结构相同. 不同之处是比较距离的时候, 是用累计的 (Dijkstra) 还是当前边的 (Prim). 建议先写 Dijkstra, 然后拷贝、修改变成 Prim. 到这个阶段, 应该已经具备这样的能力。package java31to40;import java.util.Arrays;public class D38_Net { public sta原创 2021-06-29 20:00:20 · 66 阅读 · 0 评论 -
Java学习第37天,十字链表
1,比邻接表难一点点, 毕竟多一个指针域。2,为控制代码量, 只做了建表和 toString。package java31to40;public class D37_OrthogonalList { class OrthogonalNode { int row; int column; OrthogonalNode nextOut; OrthogonalNode nextIn; public OrthogonalNode(int paraRow, int paraColumn原创 2021-06-28 19:41:47 · 53 阅读 · 0 评论 -
java学习第36天,邻连表
1,相当于图的压缩存储. 每一行数据用一个单链表存储.2,重写了广度优先遍历. 可以发现, 使用队列的机制不变. 仅仅是把其中的 for 循环换成了 while, 避免检查不存在的边. 如果图很稀疏的话, 可以降低时间复杂度.package java31to40;import java21to30.D22_CircleObjectQueue;public class D36_AdjacencyList { class AdjacencyNode { int column; Adjace原创 2021-06-27 23:43:15 · 105 阅读 · 1 评论 -
java学习第35天,图的m着色问题
1,这是经典的回溯算法,万能的暴力解题法,大家一定要掌握!2,调拭时注意 +1, -1 之类的下标控制.3,由于它使用了图的连接性, 所以需要一部分图的代码。图的代码:package java31to40;import java.util.Arrays;import java21to30.D22_CircleObjectQueue;import java21to30.D25_ObjectStack;public class D32_Graph { D31_IntMatrix conn转载 2021-06-26 10:42:21 · 154 阅读 · 0 评论 -
java学习第34天,图的深度优先遍历
与二叉树的深度优先遍历类似。不过比二叉树的深度优先遍历要复杂一些。1,使用到了图连通性检测代码。package java31to40;import java21to30.D22_CircleObjectQueue;import java21to30.D25_ObjectStack;public class D32_Graph { D31_IntMatrix connectivityMatrix; public static void main(String[] args) { Sys转载 2021-06-26 10:41:27 · 206 阅读 · 0 评论 -
java学习第33天,图的广度优先遍历
与树的广度优先遍历类似,自己可以再去看看树的代码1,使用到了图连通性检测代码。package java31to40;import java21to30.D22_CircleObjectQueue;public class D32_Graph { D31_IntMatrix connectivityMatrix; public static void main(String[] args) { System.out.println("Hello!"); D32_Graph tempG转载 2021-06-26 10:40:37 · 111 阅读 · 0 评论 -
java学习第32天,图的连通性检测
1,适用于有向图. 反正无向图是有向图的特殊形式。2,0次方的时候是单位矩阵。3,为每一个方法写一个独立的测试方法,测试代码有时比正常使用的代码更多。4,第一个测试用例是无向图,第二个是有向图。可以看到,后者从节点1不能到达节点0。5,Matrix基础代码准备好之后,其它的算法真的很方便。package java31to40;public class D32_Graph { D31_IntMatrix connectivityMatrix; public static void main原创 2021-06-26 10:39:23 · 144 阅读 · 0 评论 -
java学习第31天,整数矩阵及其运算
1,矩阵对象的创建。2,getRows等:getter,setter在java里面很常用,主要是为了访问控制。3,整数矩阵的加法、乘法。4,Exception的抛出与捕获机制。5,用this调用其它的构造方法以减少冗余代码。6,代码看起来多,但矩阵运算我们以前写过。7,把数据类型修改成double,获得DoubleMatrix.java,以后会很有用。8,getIdentityMatrix:单位矩阵。9,resultMatrix.data[i][i]:成员变量的访问权限:在同一类里面是可以直原创 2021-06-26 10:38:20 · 239 阅读 · 0 评论 -
Java学习第28天~第30天,Huffman编码
1.定义一个内嵌类.2.每个节点的内容包括: 字符 (仅对叶节点有效)、权重 (用的整数, 该字符的个数)、指向子节点父节点的引用. 指向父节点的引用是必须的。3.NUM_CHARS 是指 ASCII 字符集的字符个数. 为方便起见, 仅支持 ASCII。4.inputText 的引入只是想把程序尽可能细分成独立的模块, 这样便于学习和调拭。5.alphabet 仅存 inputText 出现过的字符。6.alphabetLength 完全可以用 alphabet.length() 代替, 但我就原创 2021-06-26 10:35:59 · 60 阅读 · 0 评论 -
java学习第27天,汉诺塔游戏算法
不知道汉诺塔这个游戏大家有没有玩过,非常有意思。算法思想也不复杂。package java21to30;public class D27_Hanoi { static int m = 0;// 移动次数 public static void main(String[] args) { hanoi('a', 'b', 'c', 3); } // 递归实现汉诺塔的函数 public static void hanoi(char A, char B, char C, int n) {原创 2021-06-17 22:56:00 · 68 阅读 · 0 评论 -
java学习第 26 天,二叉树深度遍历的栈实现 (前序和后序)
1,前序与中序的区别, 仅仅在于输出语句的位置不同.2,二叉树的遍历, 总共有 6 种排列:左中右 (中序);左右中 (后序);中左右 (前序);中右左;右左中;右中左.我们平常关心的是前三种, 是因为我们习惯于先左后右. 如果要先右后左, 就相当于左右子树互换, 这个是很容易做到的.这里java代码分成两部分第一部分是队列和算法部分借用以前写过的代码。package java21to30;import java.util.Arrays;public class D24_B原创 2021-06-17 22:31:37 · 76 阅读 · 0 评论 -
java学习第25天,第二节中序遍历
该段代码简短,但是思路复杂,需要好好琢磨一下。public static void main(String args[]) { BinaryCharTree tempTree = manualConstructTree(); System.out.println("\r\nPreorder visit:"); tempTree.preOrderVisit(); System.out.println("\r\nIn-order visit:"); tempTree.inOrderVisi原创 2021-06-15 22:51:28 · 50 阅读 · 0 评论 -
java学习第25天,第一节,通用性对象栈
1,改写栈程序, 里面存放对象.2,该程序应该放在 datastructure.stack 包内.3,还是依靠强制类型转换, 支持不同的数据类型.4,增加了 isEmpty() 方法.package java21to30;public class D25_ObjectStack { public static final int MAX_DEPTH = 15; int depth; Object[] data; public static void main(String[] args原创 2021-06-14 23:10:41 · 1140 阅读 · 2 评论 -
java学习第24天,二叉树的建立
代码的有点难度整个代码需要花费时间来整理思路,一定要搞懂搞透才能开始下一步package java21to30;import java.util.Arrays;public class D24_BinaryCharTree { char value; D24_BinaryCharTree leftChild; D24_BinaryCharTree rightChild; public D24_BinaryCharTree(char paraName) { value = paraNa原创 2021-06-14 22:43:39 · 1119 阅读 · 1 评论 -
java学习第23天,使用具有通用性的队列
队列有两种: 存储二叉树节点的队列; 存储整数的队列. 这样的话, 难道我们要为每种类型单独写一个队列? 这样显然没有充分利用代码的复用性. 实际上, 我们只需要一个存储对象的队列就够啦!1,Java 里面, 所有的类均为 Object 类的 (直接或间接) 子类. 如果不写就默认为直接子类. 例如public class CircleObjectQueue;等价于public class CircleObjectQueue extends Object;2,存储对象的队列, 实际上是存储对象的地原创 2021-06-12 23:26:31 · 66 阅读 · 0 评论 -
java学习第22天,二叉树的存储
二叉树的存储并非一个简单的问题. 引用 (指针) 是无法存储到文件里面的.完全满二叉树的角度广度优先遍历的角度来考虑这个问题: 每个节点都有一个 name 及其在二叉树中的位置. 令根节点的位置为 0; 则第 2 层节点的位置依次为 1 至 2; 第 3 层节点的位置依次为 3 至 6. 以此类推.空使用 0 来表示, 可以用一个向量来存储:[a, b, c, 0, d, e, 0, 0, 0, f, g]优点: 仅需要一个向量, 简单直接.缺点: 对于实际的二叉树, 很多子树为空, 导致大量的原创 2021-06-12 23:07:26 · 87 阅读 · 0 评论 -
java学习第21天,二叉树
二叉树的先序,中序和后序遍历,这里要多看看数据结构。package java21to30;public class D21_BinaryCharTree { char value; D21_BinaryCharTree leftChild; D21_BinaryCharTree rightChild; public static void main(String[] args) { D21_BinaryCharTree tree = manualConstructTree(); Sy原创 2021-06-10 23:20:23 · 80 阅读 · 1 评论 -
java学习第20天,综合任务 2
这是一个阶段性的总结,对于过去二十天所学的概括。1,面向对象与面向过程相比, 有哪些优势? 注: 第 1 - 10 天的程序, 就是面向过程的.答:面向对象是把需要解决的问题分解成各个对象,建立对象的目的是为了描叙某个事物在整个解决问题的步骤中的行为。这个对象在以后的编程中可以复用,继承非常方便。面向过程就是分析出解决问题所需要的步骤,然后把这些步骤用函数一步一步调用来实现某个功能。在处理具体问题的时候会非常复杂。面向过程方法书写的软件在后期会面临软件系统维护代价高昂,缺乏灵活性。2,比较线性表原创 2021-06-09 17:43:05 · 78 阅读 · 1 评论 -
java学习第19天,字符串截取
字符串的操作是写代码的基础,这里很重要多看看package java11to20;public class D19_MyString { public static final int max = 20; int length; char[] data; public static void main(String[] args) { D19_MyString firstStr = new D19_MyString("I love you forever."); D19_MyStri原创 2021-06-08 23:20:13 · 72 阅读 · 0 评论 -
java学习第18天,循环队列
循环队列的判空和判满方法和普通队列完全不一样,这点需要注意package java11to20;public class D18_CircleIntQueue { public static final int max = 13; int[] data; int head; int tail; public static void main(String[] args) { D18_CircleIntQueue cQueue = new D18_CircleIntQueue();原创 2021-06-07 23:40:35 · 49 阅读 · 0 评论 -
java学习第17天,链队列
队列在数据结构中非常基础,尤其是出队和入队的算法很有意思。可以好好看看,多多理解一下package java11to20;public class D17_LinkedQueue { class Node { int data; Node next; public Node(int par) { data = par; next = null; } } Node header; Node tail; public static void main(String原创 2021-06-07 22:38:42 · 60 阅读 · 0 评论 -
java学习第16天,递归算法
递归算法非常基础也非常实用,在实际应用中非常普遍。该代码很简单,但是对于理解递归思想非常好,就是通过一段代码的反复调用来实现某些功能,能够用少量的代码做很多事情,并且易读性很强。package java11to20;public class D16_Recursion { public static void main(String args[]) { int count = 5; System.out.println(String.format("0 到 %s 和为:%s", count,原创 2021-06-07 22:21:03 · 83 阅读 · 0 评论 -
java学习第15天,栈的应用
栈的应用中情况非常多,这段代码很长,在手输入的时候,看着源代码然后再敲上去,而不是复制粘贴。这点非常重要,在手输入的时候能够体会到代码的思想理解其中意思。package java11to20;public class D15_applicationStack { public static final int Max = 25; int depth = 0; char[] data; public static void main(String[] args) { // TODO Aut原创 2021-06-07 22:10:37 · 52 阅读 · 0 评论 -
java学习第14天,理解栈的概念
package java11to20;public class D14_CharStack { public static final int Max = 25; int depth = 0; char[] data; public static void main(String[] args) { // TODO Auto-generated method stub D14_CharStack Stack = new D14_CharStack(); for (char chDa原创 2021-06-03 17:21:36 · 100 阅读 · 0 评论 -
java学习第13天,链表
在实际应用中链表的使用非常普遍,应该用心领会,学习一下代码,弄明白意思package java11to20;public class D13_LinkedList { class Node { int data; Node next; public Node(int Value) { data = Value; next = null; } } Node header; public static void main(String[] args) { //原创 2021-06-02 18:16:04 · 34 阅读 · 0 评论 -
java学习第12天,顺序表(二)
package java11to20;public class D12_SequentialList2 { int[] data; int length = 0; public static int MAX_LENGTH = 20; public static void main(String[] args) { // TODO Auto-generated method stub int[] Array1 = { 1, 3, 5, 61, 11, 6, 8, 9, 11, 23, 1原创 2021-06-01 17:56:21 · 41 阅读 · 0 评论 -
java学习第11天,理解顺序表(一)
顺序表在使用非常常见。toString 这个方法, 在 println 里面用另一个字符串与其相加, 会自动调用 tempFirstList.toString().故意修改了一个名字,使用的时候必须要调用全名。如果没有在程序中重定义这个方法,会报错。有兴趣的可以试试package java11to20;public class D11_SequentialList1 { int[] data; int length = 0; public static int MAX_LENGTH = 20原创 2021-05-31 18:31:24 · 46 阅读 · 0 评论 -
java学习第10天,完成一个小任务
这是对之前java学习代码的一个总结,应用了之前所学的知识。需要好好理解融会贯通。package java1to10;import java.util.Arrays;import java.util.Random;public class D10_Task1 { public static void main(String[] args) { // TODO Auto-generated method stub task1(); } public static void tas原创 2021-05-30 23:46:56 · 53 阅读 · 0 评论 -
java学习第9天,while语句
while语句和for语句,foreach语句这三个语句都是循环语句。但是他们三个各有各的不同,在实际开发中运用的环境也是不一样的,不能一概而论。需要好好理解,在实际应用中学会他们三个方法的不同。while实际应用代码:package java1to10;public class D9_While { public static void main(String[] args) { // TODO Auto-generated method stub whileTest(); }原创 2021-05-29 22:59:23 · 45 阅读 · 0 评论