算法
闵浮龙
要么精彩的活,要么卑微的死
展开
-
java实现普里姆算法
一、应用场景-修路问题看一个应用场景和问题:有胜利乡有7个村庄(A,B,C,D,E,F,G),现在需要修路把7个村庄连通各个村庄的距离用边线表示(权) ,比如 A – B 距离 5 公里问:如何修路保证各个村庄都能连通,并且总的修建公路总里程最短?思路: 将 10 条边,连接即可,但是总的里程数不是最小. 正确的思路,就是尽可能的选择少的路线,并且每条路线最小,保证总里程数最少....转载 2019-10-18 11:00:15 · 1272 阅读 · 0 评论 -
java实现贪心算法
一、应用场景-集合覆盖问题假设存在下面需要付费的广播台,以及广播台信号可以覆盖的地区。 如何选择最少的广播台,让所有的地区 都可以接收到信号二、贪心算法介绍贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而 希望能够导致结果是最好或者最优的算法贪婪算法所得到的结果不一定是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结...转载 2019-10-17 20:27:34 · 6308 阅读 · 5 评论 -
java实现KMP 算法
一、应用场景-字符串匹配问题字符串匹配问题:有一个字符串 str1= ““硅硅谷 尚硅谷你尚硅 尚硅谷你尚硅谷你尚硅你好””,和一个子串 str2=“尚硅谷你尚硅你”现在要判断 str1 是否含有 str2, 如果存在,就返回第一次出现的位置, 如果没有,则返回-1二、暴力匹配算法如果用暴力匹配的思路,并假设现在 str1 匹配到 i 位置,子串 str2 匹配到 j 位置,则有:...转载 2019-10-17 16:38:37 · 8689 阅读 · 5 评论 -
java实现堆排序
一、堆排序基本介绍堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复 杂度均为 O(nlogn),它也是不稳定排序。堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆, 注意 : 没有 要求结点的左孩子的值和右孩子的值的大小关系。每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆大顶堆举例说明小顶堆举...转载 2019-09-16 14:37:04 · 500 阅读 · 0 评论 -
线索化二叉树
一、问题将数列 {1, 3, 6, 8, 10, 14 } 构建成一颗二叉树. n+1=7问题分析:当我们对上面的二叉树进行中序遍历时,数列为{8,3,10,1,6,14}但是6,8,10,14这几个节点的左右指针,并没有完全的利用上.如果我们希望充分的利用各个节点的左右指针,让各个节点可以指向自己的前后节点,怎么办? 4) 解决方案-线索二叉树二、线索二叉树基本介绍n 个结...转载 2019-09-12 14:00:12 · 129 阅读 · 0 评论 -
顺序存储二叉树
一、顺序存储二叉树的概念基本说明从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组,看下面的示意图。二、顺序存储二叉树的特点:顺序二叉树通常只考虑完全二叉树第n个元素的左子节点为 2 * n + 1第n个元素的右子节点为 2 * n + 2第 n 个元素的父节点为 (n-1) / 2n : 表示二叉树中的第几个元素(按 0 开始编号...转载 2019-09-11 16:19:09 · 302 阅读 · 0 评论 -
java实现二叉树
一、为什么需要树这种数据结构1) 数组存储方式的分析优点: 通过下标方式访问元素,速度快。对于有序数组,还可使用二分查找提高检索速度。缺点: 如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率较低 [示意图]画出操作示意图:2) 链式存储方式的分析优点: 在一定程度上对数组存储方式有优化(比如:插入一个数值节点,只需要将插入节点,链接到链表中即可,删除效率也很好)。缺点...转载 2019-08-30 18:57:21 · 2649 阅读 · 2 评论 -
java实现哈希表
一、介绍散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通 过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组 叫做散列表。二、google 公司的一个上机题:有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,名字,住址…),当输入该员工的 i...转载 2019-08-10 12:52:06 · 310 阅读 · 0 评论 -
java实现斐波那契(黄金分割法)查找算法
一、介绍黄金分割点是指把一条线段分割为两部分,使其中一部分与全长之比等于另一部分与这部分之比。取其前三位 数字的近似值是 0.618。由于按此比例设计的造型十分美丽,因此称为黄金分割,也称为中外比。这是一个神 奇的数字,会带来意向不大的效果。斐波那契数列{1,1,2,3,5,8,13,21,34,55}发现斐波那契数列的两个相邻数的比例,无限接近黄金分割值 0.618二、原理斐波那契查...转载 2019-08-06 15:59:40 · 867 阅读 · 0 评论 -
java实现赫夫曼树
一、基本介绍给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为 最优二叉树,也称为哈夫曼树(Huffman Tree), 还有的书翻译为霍夫曼树。赫夫曼树是带权路径长度最短的树,权值较大的结点离根较近二、赫夫曼树几个重要概念和举例说明路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的...转载 2019-09-16 19:24:39 · 253 阅读 · 0 评论 -
java实现赫夫曼编码
一、基本介绍赫夫曼编码也翻译为 哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式, 属于一种程序算法赫夫曼编码是赫哈夫曼树在电讯通信中的经典的应用之一。赫夫曼编码广泛地用于数据文件压缩。其压缩率通常在20%~90%之间赫夫曼码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,称之为最佳编码二、原理剖析通信领域中信息的处理方式 1-...转载 2019-09-21 16:08:21 · 762 阅读 · 0 评论 -
java实现二叉排序树
一、需求给你一个数列 (7, 3, 10, 12, 5, 1, 9),要求能够高效的完成对数据的查询和添加二、解决方案分析使用数组数组未排序, 优点:直接在数组尾添加,速度快。 缺点:查找速度慢.数组排序,优点:可以使用二分查找,查找速度快。缺点:为了保证数组有序,在添加新数据时,找到插入位置后,后面的数据需整体移动,速度慢。使用链式存储-链表不管链表是否有序,查找速度都慢,添加数据...转载 2019-09-21 22:28:10 · 518 阅读 · 0 评论 -
java实现平衡二叉树(AVL 树)
一、案例(说明二叉排序树可能的问题)给你一个数列{1,2,3,4,5,6},要求创建一颗二叉排序树(BST), 并分析问题所在.左边 BST 存在的问题分析:左子树全部为空,从形式上看,更像一个单链表.插入速度没有影响查询速度明显降低(因为需要依次比较),不能发挥BST的优势,因为每次还需要比较左子树,其查询速度比单链表还慢解决方案-平衡二叉树(AVL)二、基本介绍平衡二叉树...转载 2019-09-22 18:41:23 · 418 阅读 · 1 评论 -
多路查找树
一、二叉树与B树1、二叉树的问题分析二叉树的操作效率较高,但是也存在问题, 请看下面的二叉树二叉树需要加载到内存的,如果二叉树的节点少,没有什么问题,但是如果二叉树的节点很多(比如1亿),就 存在如下问题:问题1:在构建二叉树时,需要多次进行i/o操作(海量数据存在数据库或文件中),节点海量,构建二叉树时, 速度有影响问题2:节点海量,也会造成二叉树的高度很大,会降低操作速度.2...转载 2019-09-22 23:12:24 · 166 阅读 · 0 评论 -
java实现图
一、图基本介绍1、为什么要有图前面我们学了线性表和树线性表局限于一个直接前驱和一个直接后继的关系树也只能有一个直接前驱也就是父节点当我们需要表示多对多的关系时,这里我们就用到了图。2、图的举例说明图是一种数据结构,其中结点可以具有零个或多个相邻元素。两个结点之间的连接称为边。 结点也可以称为顶点。如图:3、图的常用概念顶点(vertex)边(edge)路径无向图(下...转载 2019-09-24 16:12:00 · 1288 阅读 · 0 评论 -
java实现分治算法
一、分治算法介绍分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或 相似的子问题,再把子问题分成更小的子问题…直到最后子问题可以简单的直接求解,原问题的解即子问题 的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变 换)…分治算法可以求解的一些经典问题 二分搜索 大整数乘法 棋盘覆盖...转载 2019-09-26 11:12:02 · 1231 阅读 · 0 评论 -
java实现动态规划算法
(1) v[i][0]=v[0][j]=0; //表示 填入表 第一行和第一列是 0(2) 当 w[i]> j 时:v[i][j]=v[i-1][j] // 当准备加入新增的商品的容量大于 当前背包的容量时,就直接使用上一个 单元格的装入策略(3) 当 j>=w[i]时: v[i][j]=max{v[i-1][j], v[i]+v[i-1][j-w[i]]}// 当 准备加入的新增的商品的容量小于等于当前背包的容量,// 装入的方式:v[i-1][j]: 就是上一个单元格的装入的最大值v[i]转载 2019-10-04 12:47:00 · 1201 阅读 · 1 评论 -
java实现线性查找算法
有一个数列: {1,8, 10, 89, 1000, 1234} ,判断数列中是否包含此名称【顺序查找】 要求: 如果找到了,就提 示找到,并给出下标值代码实现:package search;/** * @program: text * @description: 线性查找算法 * @author: min * @create: 2019-08-01 11:19 **/publ...转载 2019-08-01 11:24:30 · 635 阅读 · 0 评论 -
java实现插值查找算法
一、介绍1、插值查找算法类似于二分查找,不同的是插值查找每次从自适应 mid 处开始查找。2、将折半查找中的求mid索引的公式,low表示左边索引left,high表示右边索引right. key 就是前面我们讲的 findVal3、int mid = low + (high - low) * (key - arr[low]) / (arr[high] - arr[low]) ;/插值索引...转载 2019-08-04 13:33:04 · 1091 阅读 · 0 评论 -
java实现二分查找算法
一、 要求:请对一个有序数组进行二分查找 {1,8, 10, 89, 1000, 1234} ,输入一个数看看该数组是否存在此数,并且求出下 标,如果没有就提示"没有这个数"。二、思路:三、代码:package search;import java.util.ArrayList;import java.util.List;/** * @program: text * @de...转载 2019-08-02 17:10:23 · 213 阅读 · 0 评论 -
循环打印100以内的素数
/** * 循环打印100以内的素数 * @author Administrator * */ public class ss { public static void main(String[] args) { for (int i = 1; i < 100; i++) { if(isprime(i)) {原创 2017-05-05 16:24:02 · 972 阅读 · 0 评论 -
打印10000以内的回文数字
/** * 打印10000以内的回文数字 * @author Administrator * */public class hws { public static void main(String[] args) { //遍历10~10000 for (int i = 10; i < 10000; i++) { //判断当前原创 2017-05-05 16:56:34 · 1195 阅读 · 0 评论 -
获取任意一个时间的下一天的时间
import java.util.Date;/** * 获取任意一个时间的下一天的时间 * @author Administrator * */public class date { public static void main(String[] args) { Date now = new Date(); //获取当前时间 //原创 2017-05-05 17:18:47 · 591 阅读 · 0 评论 -
时间以固定格式转化为字符串
import java.text.SimpleDateFormat;import java.util.Date;/** * 将某个时间以固定格式转化为字符串 * @author Administrator * */public class zh { public static void main(String[] args) { Date now =new Dat原创 2017-05-05 17:26:19 · 681 阅读 · 0 评论 -
合并排序
与很多有用的算法类似,合并排序基于这样一个技巧:将 2 个大小为 N/2 的已排序序列合并为一个 N 元素已排序序列仅需要 N 次操作。这个方法叫做合并。我们用个简单的例子来看看这是什么意思: 通过此图你可以看到,在 2 个 4元素序列里你只需要迭代一次,就能构建最终的8元素已排序序列,因为两个4元素序列已经排好序了:1) 在两个序列中,比较当前元素(当前=头一次出现的第一个) 2...转载 2018-03-19 13:10:06 · 25833 阅读 · 2 评论 -
java实现简单泡泡屏保动画及点击变实心泡泡
工具类package com.egeo.jframetext;import java.awt.*;import java.awt.geom.Ellipse2D;import java.lang.InterruptedException;public class AlgoVisHelper { //私有化类 private AlgoVisHelper(){} ...转载 2018-05-17 11:54:19 · 2180 阅读 · 0 评论 -
java随机分钱问题可视化
工具类package com.egeo.jframetext;import java.awt.BasicStroke;import java.awt.Color;import java.awt.FontMetrics;import java.awt.Graphics2D;import java.awt.Image;import java.awt.geom.Ellipse2D;...转载 2018-05-18 09:24:22 · 396 阅读 · 0 评论 -
java蒙特卡洛算法求PI值(可视化)及三门问题
工具类package com.egeo.jframetext;import java.awt.BasicStroke;import java.awt.Color;import java.awt.FontMetrics;import java.awt.Graphics2D;import java.awt.Image;import java.awt.geom.Ellipse2D;...转载 2018-05-18 15:32:00 · 1408 阅读 · 0 评论 -
java选择排序可视化
工具类import java.awt.*;import java.awt.geom.Ellipse2D;import java.awt.geom.Rectangle2D;import java.lang.InterruptedException;public class AlgoVisHelper { private AlgoVisHelper(){} pu...转载 2018-05-19 11:46:42 · 822 阅读 · 0 评论 -
java插入排序可视化
工具类import javax.swing.*;import java.awt.*;import java.awt.geom.*;import java.lang.InterruptedException;public class AlgoVisHelper { private AlgoVisHelper(){} public static final Co...转载 2018-05-19 17:35:39 · 284 阅读 · 0 评论 -
归并排序自顶向下及自底向上算法可视化
归并排序自顶向下工具类import javax.swing.*;import java.awt.*;import java.awt.geom.*;import java.lang.InterruptedException;public class AlgoVisHelper { private AlgoVisHelper(){} public sta...转载 2018-05-19 19:44:23 · 636 阅读 · 0 评论 -
双路快速排序算法及三路快速排序算法可视化
双路快速排序算法工具类import java.awt.*;import java.awt.geom.Ellipse2D;import java.awt.geom.Rectangle2D;import java.lang.InterruptedException;public class AlgoVisHelper { private AlgoVisHelper...转载 2018-05-20 11:44:07 · 762 阅读 · 0 评论 -
java深度优先、非递归深度优先、广度优先迷宫求解可视化
本文将从以下几个维度来求解迷宫最终路径1、深度优先递归求解最终路径 2、非递归深度优先走迷宫求解最终路径 3、广度优先走迷宫求解最终路径通用工具类import java.awt.*;import java.awt.geom.Ellipse2D;import java.awt.geom.Rectangle2D;import java.lang.InterruptedExc...转载 2018-05-21 03:11:02 · 1801 阅读 · 4 评论 -
随机队列生成迷宫及按下空格求解
工具类import java.awt.*;import java.awt.geom.Ellipse2D;import java.awt.geom.Rectangle2D;import java.lang.InterruptedException;public class AlgoVisHelper { private AlgoVisHelper(){} p...转载 2018-05-23 06:19:43 · 491 阅读 · 2 评论 -
稀疏数组和队列
一、稀疏 sparsearray 数组1、先看一个实际的需求 编写的五子棋程序中,有存盘退出和续上盘的功能。 分析问题:因为该二维数组的很多值是默认值 0, 因此记录了很多没有意义的数据.->稀疏数组。2、基本介绍当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。稀疏数组的处理方法是:记录数组一共有几行几列,有多少个不同的值把具有不同...转载 2019-06-21 14:04:26 · 225 阅读 · 0 评论 -
java实现基数排序
一、基数排序(桶排序)介绍基数排序(radixsort)属于“分配式排序”(distributionsort),又称“桶子法”(bucketsort)或binsort,顾 名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用基数排序法是属于稳定性的排序,基数排序法的是效率高的稳定性排序法基数排序(RadixSort)是桶排序的扩展基数排序是1887年赫尔曼·...转载 2019-07-29 17:56:19 · 245 阅读 · 0 评论 -
一个for循环实现九九乘法表
/** * 相比网上的2个for循环实现这里采用的是一个for循环高效实现99乘法表 * @author Administrator * */ public class jjcfb { public static void main(String[] args) { //循环,初始化i和j为1 for (int i = 1,j = 1;原创 2017-05-05 16:42:07 · 2158 阅读 · 0 评论