
学习
imn
这个作者很懒,什么都没留下…
展开
-
Dijkstra算法
Dijkstra算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径。它的主要特点是以起始点为中心向外层层扩展(广度优先),直到扩展到终点为止。算法过程太麻烦不写了,直接上代码理解。import java.util.Arrays;public class DijkstraAlgorithm { public static void main(String[] args) { ...原创 2020-03-31 20:18:19 · 126 阅读 · 0 评论 -
Kruskal算法
Kruskal算法也是用来求最小生成树的算法。基本思想:按照权值从小到大的顺序选择n-1条边,并保证这n-1条边不构成回路。感觉好难,五个小时了bug还没解决,代码先放在这儿,以后再改。package Kruskal;import java.util.Arrays;public class KruskalCase { private int edgeNum;// 边的个数 pri...原创 2020-03-30 22:15:52 · 235 阅读 · 0 评论 -
Prim算法
Prim算法求最小生成树,也就是在包含n个顶点的连通图中,找出只有(n-1)条边包含所有n个顶点的连通子图,也就是所谓极小连通图。思路看着有点长,不好理解,直接上代码吧。import java.util.Arrays;public class PrimAlgorithm { public static void main(String[] args) { // TODO Auto-g...原创 2020-03-29 21:40:49 · 110 阅读 · 0 评论 -
贪心算法
贪心算法是指在对问题进行求解时,在每一步中都采取最好或者最优的选择,从而希望能够导致结果是最好或者最优的算法。贪心算法所得到的结果不一定是最优的结果,但是相对近似最优解的结果。应用举例:集合覆盖问题。import java.util.ArrayList;import java.util.HashMap;import java.util.HashSet;public class Greed...原创 2020-03-28 21:07:28 · 132 阅读 · 0 评论 -
KMP算法
KMP算法利用之前判断过信息,通过一个next数组,保存模式串中前后最长公共子序列的长度,每次回溯时,通过next数组找到,前面匹配过的位置,省区了大量的计算时间。import java.util.Arrays;public class KMPAlgorithm { public static void main(String[] args) { // TODO Auto-gener...原创 2020-03-27 20:17:25 · 171 阅读 · 0 评论 -
动态规划算法
动态规划算法(Dynamic Programming)算法也是将大问题划分为小问题进行解决,与分治算法类似,但适用于动态规划求解的问题,经分解得到子问题往往不是互相独立的(即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解)。动态规划可以通过填表的方式来逐步推进,得到最优解。这儿用背包问题演示一次。背包问题主要是指一个给定容量的背包、若干具有一定价值和重量的物品,如何选择物品...原创 2020-03-26 19:50:27 · 110 阅读 · 0 评论 -
分治算法
分治算法可以求解的一些经典问题有:二分搜索、大整数乘法、棋盘覆盖、合并排序、快速排序、线性时间选择、最接近点对问题、循环赛日程表、汉诺塔。。。这儿以汉诺塔游戏示例:1)、如果是有一个盘,A→C如果我们有n>=2情况,我们总是可以看作是两个盘 :1、最下边的盘 2、上面的所有盘1)先把最上面的盘A→B2)把最下边的盘A→C3)把B塔的所有盘从B→Cpublic class Hano...原创 2020-03-18 19:52:36 · 99 阅读 · 0 评论 -
二分查找算法(非递归)
二分查找法的运行时间为对数时间O(log₂n)public class BinarySearchNoRecursion { public static void main(String[] args) { int[] arr = { 12, 15, 17, 42, 46, 100 }; int index = binarySearch(arr, 100); System.out.p...原创 2020-03-17 19:34:49 · 137 阅读 · 0 评论 -
图的广度优先遍历
广度优先遍历需要使用一个队列以保存访问过的结点的顺序,以便按顺序访问这些结点的邻接结点。步骤:(1)访问初始结点v并标记结点v为已访问。(2)结点v入队列。(3)当队列非空时继续执行,否则算法结束。(4)出队列,取得队头结点u。(5)查找结点u的第一个邻接结点w。(6)若结点u的邻接结点w不存在,则转到步骤3;否则循环执行以下三个步骤:6.1若结点w尚未被访问,则访问结点w并标记为...原创 2020-03-16 21:06:14 · 107 阅读 · 0 评论 -
图的深度遍历
所谓图的遍历,即是对结点的访问。每次都在访问完当前结点后首先访问当前结点的第一个邻接结点即深度优先遍历。算法步骤:(1)访问初始结点v,并标记结点v为已访问。(2)查找结点v的第一个邻接结点w。(3)若w存在,则继续执行4,如果w不存在,即回到第1步,将从v的下一个结点继续。(4)若w未被访问,则对w进行深度优先遍历递归(即把w当作另一个v,然后进行步骤123).(5)查找结点v的w邻...原创 2020-03-15 19:53:47 · 134 阅读 · 0 评论 -
图
图是一种数据结构,其中结点可以具有零个或多个相邻元素。两个结点之间的连接称为边。结点也可以称为顶点。图的表示方式有两种:二维数组表示(邻接矩阵);链表表示(邻接表)。这儿我使用二维数组表示了一张图。import java.util.*;public class Graph { private ArrayList<String> vertexList;// 存储顶点集合 pr...原创 2020-03-14 18:47:26 · 79 阅读 · 0 评论 -
平衡二叉树(AVL树)
平衡二叉树也叫做平衡二叉搜索树(Self-balancing binary search tree)又被称为AVL树,具有以下特点:它是一棵空树或它的左右两个子树的高度差绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。平衡二叉树的常用实现方法有红黑树、AVL、替罪羊树、Treap、伸展树等。下面这段代码用左旋转和右旋转的方法构建了一个平衡二叉树public class AVLTreeDemo...原创 2020-03-13 17:21:22 · 144 阅读 · 0 评论 -
二叉排序树(BST(Binary Sort Tree))
对于二叉排序树的任何一个非叶子结点,要求左子结点的值比当前结点的值小,右子结点的值比当前结点的值大。如果有相同的值,可以将该结点放在左子结点或右子结点。在代码实现的过程中,注意删除的结点是叶子结点还是非叶子结点以及方法。在delRightTreeMin这个方法中个人有点小疑问,已经进行了删除操作的值还可以在该方法中return返回吗?public class BinarySortTreeDemo...原创 2020-03-12 19:03:01 · 184 阅读 · 0 评论 -
赫夫曼编码压缩实例
昨天只完成了赫夫曼编码表的生成实现,今天补了一些没有学过的知识,举出了一个压缩的实例,并将赫夫曼编码的方法封装。import java.util.*;public class HuffmanCode { public static void main(String[] args) { // TODO Auto-generated method stub String str = ...原创 2020-03-11 20:49:12 · 238 阅读 · 0 评论 -
赫夫曼编码
赫夫曼编码是一种无损编码,尽管生成的赫夫曼树不同,也不会有二义性,最后得到的编码可能会因为不同的赫夫曼树有所不同,但是得到的压缩编码长度是一样的,这里我们先以一个字符串为例生成其对应的赫夫曼编码表。import java.util.*;public class HuffmanCode { public static void main(String[] args) { // TODO...原创 2020-03-10 20:38:08 · 77 阅读 · 0 评论 -
赫夫曼树(Huffman Tree)
给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也叫做赫夫曼树。路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目成为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1。结点的权及带权路径长度:若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结...原创 2020-03-09 18:27:14 · 109 阅读 · 0 评论 -
堆排序
堆排序是基于完全二叉树实现的,一个二叉树其父结点均大于子结点称为大顶堆,可以实现升序排序。堆顶的根结点就是整个序列的最大值,将其与末尾元素交换,末尾就成为最大值。然后将剩余n-1个元素重新构造成一个堆,重复上述操作即可得到升序排序。注意是从最后一个非叶子结点开始比较得到大顶堆。最后一个非叶子结点的序号为arr.length/2-1。import java.util.Arrays;publi...原创 2020-03-08 20:27:08 · 67 阅读 · 0 评论 -
线索化二叉树
每一个结点的左指针指向其左子结点或前驱结点,右指针指向其右子结点或后继结点,这样可以构成一个线索化二叉树。为了方便后续的操作,我们需要将其指针指向的两种类型区分开。同时在遍历的过程中,由于我们无法由子结点得到前驱结点或者父结点,需要一个pre结点保存遍历的前一个结点。public class ThreadedBinaryTreeDemo { public static void main(...原创 2020-03-07 18:16:22 · 132 阅读 · 0 评论 -
顺序存储二叉树的遍历
顺序存储二叉树一个结点下标为n,则其左结点的下标为2*n+1,右结点下标为2*n+2,一个结点的父结点下标为(n-1)/2,因此可以利用递归很容易的写出其遍历方式,这里给出前序遍历示例://顺序存储二叉树前遍历public class ArrBinaryTreeDemo { public static void main(String[] args) { int[] arr = { ...原创 2020-03-06 20:05:42 · 347 阅读 · 0 评论 -
二叉树
写了一个二叉树,可以完成增删查的功能,但不够完善,后续会进行改进。特别注意如果要对查找操作计数,注意计数的代码所在位置。另外有地方可以进行优化:例如在进行删除操作的时候,即便在对树的左结点遍历时完成了删除操作该代码仍然将右结点进行了遍历。class BinaryTreeDemo { public static void main(String[] args) { BinaryTree b...原创 2020-03-05 20:28:23 · 88 阅读 · 0 评论 -
写一个哈希表
增删改查操作需要在链表里写一个方法再在哈希表中写出,最后测试,第一次写仅实现增查功能,在输出方面有瑕疵。import java.util.Scanner;public class HashTabDemo { public static void main(String[] args) { HashTab hashTab = new HashTab(10); String key =...原创 2020-03-04 20:12:52 · 138 阅读 · 0 评论 -
双链表
写了一个双链表,上次的问题依然存在,第一个链表使用addByOrder()方法,第二个链表使用add()方法仍然添加了无关节点,初步推测是add()方法有问题public class DoubleLinkedListDemo { public static void main(String[] args) { // TODO Auto-generated method stub Bo...原创 2020-03-03 16:13:15 · 78 阅读 · 0 评论 -
单链表
做了一个单链表,可以实现增删改查逆序打印反转合并等操作,但遗留了两个问题:1、如何将两个未按序号排序的链表按顺序合并?2、下面这个程序为什么会出问题?假设我创建一个节点A·在链表1里调用add()方法将A连接到链表1中。·在链表2里再次调用add方法添加A节点,却将A节点及后面的节点全部添加到链表2中,这是我们不希望看到的,可是原因是什么呢?问题见主方法最后一部分注释处,为使程序正常运...原创 2020-03-02 22:45:30 · 171 阅读 · 0 评论 -
数据结构----队列测试
根据网上的教程,写了一个队列,该队列无法循环使用,取出队列中的数据后show出来的仍然是原队列,在此将草稿列出import java.util.Scanner;public class ArrayQueueDemo { public static void main(String[] args) { ArrayQueue queue=new ArrayQueue(3); char k...原创 2020-03-01 20:21:03 · 247 阅读 · 0 评论