02 2020 档案

摘要:弗洛伊德算法和迪杰斯特拉算法类似,是计算一个图中各个顶点之间的最短路径,每一个顶点都是出发顶点 记录两个顶点的距离,如果有经过某一顶点所得到的距离比直接连接这两个顶点的距离小则更新,否则不变 实现为:使用双层循环当中间顶点不变,出发和终点的点进行循环,最后使用一层循环更新中间顶点,总共使用三层循环, 阅读全文
posted @ 2020-02-28 11:10 Axs 阅读(252) 评论(0) 推荐(0)
摘要:迪杰斯特拉算法是求最短路径的算法,计算图中一个顶点到其他顶点的最短路径,应用了广度优先的思想,由一个点扩散直到终点为止 过程: 设置出发顶点为v,集合为V,距离集合为Dis 从Dis中选取最小值移除di,同时移除对应的V的顶点vi 比较v到V中顶点的距离值,与v通过的vi到集合V中顶点的距离值,保留 阅读全文
posted @ 2020-02-28 10:47 Axs 阅读(382) 评论(0) 推荐(0)
摘要:同样是求最小生成树克鲁斯卡尔算法的思想则转变了一下,以边为目标去生成最小数 这种感觉就像是结果等于10式子2*5也行,20/2也行,方式不同只看最后的结果 思想:按照权值的大小从小到大排序,选择n-1条边,并且不构成回路 过程:构造一个只含有n个节点的森林,然后从权值最小到最大选择边加入到森林中,使 阅读全文
posted @ 2020-02-27 11:37 Axs 阅读(841) 评论(0) 推荐(0)
摘要:普里姆算法的应用场景为修路问题,就是用最小的路径连接所有节点 转换一下就是最小生成树(MST)的问题:给定一个带权的无向连接图,如何选取一颗生成树,使树上的所有的边上权的总和为最小,就是最小生成树 普里姆算法求最小生成树:在包含n个顶点的连接图中,找出只有(n-1)条边并包含所有n个顶点的连通子图, 阅读全文
posted @ 2020-02-27 11:18 Axs 阅读(526) 评论(0) 推荐(0)
摘要:骑士周游问题实际上是图的深度优先搜索(DFS)的应用,使用回溯的方式来解决步骤过于繁琐,一旦走错就要回溯 为了减少运算次数,使用贪心算法进行优化:根据当前一步的所有的下一步的选择位置进行递减排序 减少回溯次数 import java.awt.*; import java.util.ArrayList 阅读全文
posted @ 2020-02-26 11:54 Axs 阅读(610) 评论(0) 推荐(1)
摘要:贪心算法是指对于解决问题的每一步都作出最优解,从而希望得到最后的结果也是最优解,但是最后结果不一定都是最优解,大部分都是最接近最优解的结果 具体在百度百科的基本思路里有很好的解释,这里就不详写了 用贪心算法解决覆盖问题: import java.util.ArrayList; import java 阅读全文
posted @ 2020-02-26 11:50 Axs 阅读(169) 评论(0) 推荐(0)
摘要:暴力匹配算法虽然写起来简单但是效率太低了,一旦出现不匹配就要从头匹配,怎么能让字符串匹配不对的时候有效的往后移动呢?这时候就出现3个大神,分别提出最后联合发表了这个算法——KMP算法,有效的解决了这个问题。 KMP算法的核心就是如何有效的后移,这张表的计算方法如下 如字符串:A B C D A B 阅读全文
posted @ 2020-02-25 11:01 Axs 阅读(127) 评论(0) 推荐(0)
摘要:暴力匹配的方式很简单,就是一个个的对比,当有一个不对的时候则将要找的数据从头计算,被找的数据继续往下寻找,直到被找数据对比完成,找到返回下标,没有返回 -1 public class ViolenceMatch { public static void main(String[] args) { S 阅读全文
posted @ 2020-02-25 10:27 Axs 阅读(705) 评论(0) 推荐(0)
摘要:动态规划算法和分治算法类似,不同在于分解为子问题并不是互相独立的,而是一步步逼近最终答案 动态规划可以通过填表的方式逐步推进,而动态规划算法最佳实现就是背包问题 背包问题就是最大,最小价值的问题,即怎么买(装,放)可以达到最大,最小价值 public class KnapsackProblem { 阅读全文
posted @ 2020-02-25 10:21 Axs 阅读(269) 评论(0) 推荐(0)
摘要:分治算法的核心是把一个大的问题分解成若干个小问题,互相独立,与原问题形式相同的子问题,若小问题规模较小则直接解决,否则递归解决各个小问题,然后将各个子问题的解合并为原问题的解 像快速排序,归并排序等问题都用到了分治算法思想,其中比较著名的问题是解决汉诺塔 public class Hanoitowe 阅读全文
posted @ 2020-02-24 10:28 Axs 阅读(187) 评论(0) 推荐(0)
摘要:public class BinarySearchNoRecur { public static void main(String[] args) { int[] arr = {1, 3, 8, 10, 11, 67, 100}; System.out.println(binarySearch(ar 阅读全文
posted @ 2020-02-24 10:19 Axs 阅读(220) 评论(0) 推荐(0)
摘要:图也是一种数据结构,用来表示多对多的关系,两个节点(顶点)之间的连接称之为边 从一个顶点到另一个顶点的所经过的边连起来称之为路径 图的两种表现方式:二维数组(邻接矩阵),链表(邻接表) 图的深度优先遍历(DFS): 访问初始顶点找到最近的一个顶点,再以这个顶点为初始顶点继续找最近的顶点,以递归的方式 阅读全文
posted @ 2020-02-18 21:34 Axs 阅读(140) 评论(0) 推荐(0)
摘要:当二叉树的数据量非常大的时候他的速度就会有一定的影响这时候就引进了多叉树 多叉树通过对树的高度进行缩减来达到优化的目的 2-3树是最简单的B-树,特点如下 所有叶子节点都在同一层 有两个子节点的叫二节点,此节点要么有2个子节点要么没有 有三个子节点的叫三节点,此节点要么有3个子节点要么没有 2-3树 阅读全文
posted @ 2020-02-17 10:53 Axs 阅读(181) 评论(0) 推荐(0)
摘要:平衡二叉树是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树 平衡二叉树解决了二叉排序树的查询效率问题(连续递增数据创建二叉排序树时),平衡二叉树的实现方法有红黑树,AVL树,替罪羊树等 平衡二叉树的难点在于左右旋转,这里用 new 代表新节点 old 代表旧 阅读全文
posted @ 2020-02-14 15:54 Axs 阅读(112) 评论(0) 推荐(0)
摘要:二叉排序树对于任何一个非叶子节点都要求比左子节点大,比右子节点下,相同可放入左子节点或右子节点 对于删除情况,直接删除叶子节点和删除只有一颗子树的情况都比较好处理,对于第3种情况删除2棵子树详细记录一下 找到要删除的节点的父节点和他右子树找到最小值,最小值记录在临时变量里,删除最小节点,替换 pub 阅读全文
posted @ 2020-02-13 11:57 Axs 阅读(157) 评论(0) 推荐(0)
摘要:赫夫曼编码用于数据文件的压缩,压缩率在20%~90%之间,称之为最佳编码 将原始数据转换为ASCII编码后再转二进制属于定长编码 同样数据使用变长编码,按照各个字符出现次数进行编码,出现次数越多则编码越小(字符的编码都不能是其他字符编码的前缀,这样的编码叫做前缀编码),从而实现数据的压缩 步骤:和创 阅读全文
posted @ 2020-02-12 12:34 Axs 阅读(332) 评论(0) 推荐(0)
摘要:给定N个权值作为N个叶子节点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为赫夫曼树 赫夫曼树是带权路径长度最短的树,权值较大的结点离根较近 节点的带权路径长度为:从根节点到该节点之间的路径长度与该节点的权的乘机 树的带权路径长度(WPL):所有叶子节点的带权路径长 阅读全文
posted @ 2020-02-12 12:18 Axs 阅读(181) 评论(0) 推荐(0)
摘要:堆排序属于不稳定排序,时间复杂度为O(nlogn),是利用堆这种数据结构设计的排序算法,是一种选择排序 堆是一个近似完全二叉树的结构,每个节点值都大于或等于左右节点为大顶堆,小于等于为小顶堆 升序排序大顶堆,降序排序小顶堆 思想和方法:将原始数据构 n 造成大顶堆,此时最大值为根节点,然后与末尾的原 阅读全文
posted @ 2020-02-11 13:35 Axs 阅读(136) 评论(0) 推荐(0)
摘要:线索化二叉树的特点是:每一个节点都有前驱和后继节点(第一个和最后一个除外)所以查找某一节点会很容易 缺点:也很明显就是在插入新节点和删除时过于麻烦,实际应用需自己取舍 public class ThreadedBinaryTreeDemo { public static void main(Stri 阅读全文
posted @ 2020-02-10 12:02 Axs 阅读(189) 评论(0) 推荐(0)
摘要:特点: 1.只考虑完全二叉树 2.第n个的左节点为2*n+1 3.第n个的右节点为2*n+2 4.第n个的父节点为(n-1)/2 n为第几个元素 public class ArrBinaryTreeDemo { public static void main(String[] args) { int 阅读全文
posted @ 2020-02-09 12:24 Axs 阅读(189) 评论(0) 推荐(0)
摘要:前序遍历:根节点,左子树,右子树 中序遍历:左子树,根节点,右子树 后序遍历:左子树,右子树,根节点 二叉树的遍历规则:在前中后序遍历中先左子树,后右子树的规则不变,变的只有根节点的顺序 public class BinaryTreeDemo { public static void main(St 阅读全文
posted @ 2020-02-09 12:15 Axs 阅读(115) 评论(0) 推荐(0)
摘要:哈希表(散列表)根据关键码值(Key)直接访问,加快查找的速度。 简单来说就是把数据分组,在进行查找的时候直接在对应的组里进行查找,以此减少查找数据时对不必要查找数据时所浪费的时间 package hashtab; import java.util.Scanner; public class Has 阅读全文
posted @ 2020-02-09 12:08 Axs 阅读(168) 评论(0) 推荐(0)
摘要:斐波那契查找是属于二分查找的一种,提高了查找效率 查找方式在百度词条中已经说的很清楚了这里就不再写了,直接走代码,体验一下0.618的神奇 import java.util.Arrays; public class FibonacciSearch { public static int maxSiz 阅读全文
posted @ 2020-02-08 11:54 Axs 阅读(192) 评论(0) 推荐(0)
摘要:插值查找算法类似于二分查找,不同的是插值查找的每次从自适应mid出开始,这和二分查找升级版用到的是一个方法 int mid = left + (right - left) * (findVal - arr[left]) / (arr[right] - arr[left]); 含义:预测数字出现的位置 阅读全文
posted @ 2020-02-08 10:42 Axs 阅读(164) 评论(0) 推荐(0)