数据结构与算法java
ShakeSharkPP
这个作者很懒,什么都没留下…
展开
-
数据结构与算法 27 马踏棋盘 骑士周游 贪心算法优化
马踏棋盘代码实现思想实际上是图的深度优先搜索(回溯)创建棋盘 chessBoard,是一个二维数组将当前位置设置为已经访问,然后根据当前位置,计算马儿还能走那些位置,并放入到一个集合中(ArrayList),最多有8个位置。每走一步,就 step+1遍历ArrayList中存放的所有位置,看看哪个可以走通;如果走通,则继续;走不通,就回溯判断马是否完成了任务 step 和应该走的步数(整个棋盘的格数-1)比较,如果没有达到数量,则表示没有完成任务,将整个棋盘置0注意:马不同的走法会得到不同原创 2020-06-25 13:01:51 · 304 阅读 · 0 评论 -
数据结构与算法 26 弗洛伊德算法
弗洛伊德(Floyd)算法用于寻找给定的加权图中各个顶点间的最短路径,时间复杂度较高:立方阶,将每个顶点都看作是出发点,求到其它点的最短距离狄杰斯特拉算法是计算图中某一个顶点到其它顶点的最短路径,选定被访问顶点算法思路设置顶点vi到顶点vk的最短路径已知Lik,顶点vk到vj的最短路径已知为Lkj,顶点vi到vj的路径为Lij,则vi到vj的最短路径为:min((Lik+Lkj),Lij),vk的取值为图中所有顶点,则可获得vi到vj的最短路径至于vi到vk的最短路径Lik或者vk原创 2020-06-24 09:16:30 · 212 阅读 · 0 评论 -
数据结构与算法 25 狄杰斯特拉算法 dijkstra
迪杰斯特拉算法Dijkstra算法:用于计算一个节点到其它节点的最短路径,主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),知道扩展到终点为止应用:最短路径问题七个村庄(A,B,C,D,E,F,G)现在有六个邮差,从G点出发,需要分别把邮件分别送到A,B,C,D,E,F六个村庄,计算G村庄到其它各个村庄的最短距离dijkstra算法过程设置出发点为v,顶点集合V{v1,v2,vi…},v到V中各顶点的距离构成距离集合Dis,Dis{d1,d2,di…},Dis集合记录着v到图中各顶点的距原创 2020-06-24 04:23:07 · 441 阅读 · 0 评论 -
数据结构与算法 24 普里姆算法 修路问题 克鲁斯卡尔算法 kruskal 公交站问题
普里姆算法修路问题,给定村庄和距离,求将所有村庄联通,并且总的修建公路总里程最短?最小生成树最小生成树 Minimun Cost Spanning Tree给定一个带权的无向连通图,如何选取一颗生成树,使树上所有边上权的总和为最小,就叫最小生成树N个顶点,一定有 N-1 条边包含全部顶点N-1 条边都在图中求最小生成树的算法主要是普里姆算法和克鲁斯卡尔算法普里姆算法思路普里姆(prim)算法求最小生成树,也就是在包含 n 个顶点的连通图中,找出只有(n-1)条边包含所有 n 个顶原创 2020-06-23 11:56:07 · 356 阅读 · 0 评论 -
数据结构与算法 23 贪心算法
贪心算法集合覆盖问题:选择最少的广播台,让所有的地区都可以接受到信号贪心算法是指在对问题进行求解时,在每一步选择中都采取最好或者最优的选择,从而希望能够导致结果是最好或最优的算法贪心算法得到的结果不一定是最优的,但都是相对金丝猴最优解的结果集合覆盖如何找出覆盖所有地区的广播台的集合?使用穷举法实现,列出每个可能的广播台的集合,这时称为幂集。假设有n个广播台,则广播台的组合共有 2^n-1个,假设每秒可以计算10个子集广播台数量n子集总数2^n需要的时间5323.2s原创 2020-06-22 12:58:29 · 100 阅读 · 0 评论 -
数据结构与算法 22 十大算法 分治算法 汉诺塔问题 动态规划 背包问题 字符串匹配 暴力匹配 kmp算法
分治算法divide and conquer将复杂问题分为两个或多个相同或相似的子问题,再把子问题分成更小的子问题,直到最后的子问题可以简单的直接求解,原问题的解即子问题的解的合并。应用:快速排序、归并排序、傅立叶变换、汉诺塔基本步骤:分治算法在每一层递归上都有三个步骤分解:将原问题分解为若干个规模较小,互相独立,与原问题形式相同的子问题解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题合并:将各个子问题的解合并为原问题的解汉诺塔问题如果有一个盘,A - C如果原创 2020-06-22 06:36:20 · 246 阅读 · 0 评论 -
数据结构与算法 21 图结构 深度优先遍历 广度优先遍历
图概念顶点 vertex边 edge路径无向图:顶点之间的连接没有方向有向图:顶点之间的连接有方向带权图:边带有权值,也叫网图的表示方法二维数组表示(邻接矩阵);链表表示(邻接表)邻接矩阵:表示图形中顶点之间相邻关系的矩阵,对于n个顶点的图而言,矩阵是row和col表示的1…n个点邻接表:邻接矩阵需要为每个顶点都分配n个边的空间,其实有很多边都是不存在的,会造成空间的一定损失邻接表的实现只关心存在的边,不关系不存在的边,因此没有空间浪费,邻接表由数组+链表组成代码实现原创 2020-06-21 09:59:47 · 149 阅读 · 0 评论 -
数据结构与算法 20 多路查找树 多叉树 B树 B+树 B*树
多路查找树二叉树的问题分析二叉树需要加载到内存,如果节点较多,会存在一下午问题:构建二叉树时,需要多次机械能 i/o 操作(海量数据存在数据库或文件中),节点海量,构建二叉树时,速度有影响节点海量,也会造成二叉树的高度很大,会降低操作速度多叉树如果允许每个节点可以有更多的数据项和更多的子节点,就是多叉树(multiway tree)多叉树通过重新组织节点,减少树的高度,能对二叉树进行优化B 树通过重新组织节点,降低树的高度,并且减少 i/o 读写次数来提升效率。文件系原创 2020-06-21 04:18:52 · 151 阅读 · 0 评论 -
数据结构与算法 19 平衡二叉树 左旋转 右旋转 双旋转
平衡二叉树AVL树BST存在的问题:如果给数列 {1,2,3,4,5,6} 构建二叉树,左子树全部为空,从形式上看,更像是一个单链表,插入速度没有影响,查询速度明显降低。解决方案:平衡二叉树平衡二叉树也称为平衡二叉搜索树(self-balancing binary search tree),又被称为 AVL 树,可以保证查询效率较高特点:它是一颗空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一颗平衡二叉树。平衡二叉树的常用实现方法有红黑树、AVL、替罪羊树、Treap、伸原创 2020-06-21 01:43:07 · 227 阅读 · 0 评论 -
数据结构与算法 18 二叉排序树 创建、变量、删除
二叉排序树Binary Search Tree对于二叉排序树的任何一个非叶子节点,要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大如果有相同的值,可以将该节点放在左子节点或右子节点二叉排序树的创建和遍历中序遍历二叉排序树package tree.binarysearchtree;public class BinarySearchTreeDemo01 { public static void main(String[] args) { int[] arr原创 2020-06-20 09:47:14 · 112 阅读 · 0 评论 -
数据结构与算法 17 赫夫曼编码 数据解压 文件压缩 文件解压
赫夫曼编码数据解压byte[] --> Stringpackage tree.huffmancode;import java.util.*;public class HuffmanCodeDemo { public static void main(String[] args) { String content = "i like like like java do you like a java"; byte[] contentBytes = c原创 2020-06-20 03:41:31 · 192 阅读 · 0 评论 -
数据结构与算法 16 赫夫曼树 赫夫曼编码 数据压缩
赫夫曼树给定n个权值作为n个叶子节点,构造一颗二叉树,若该树的带权路径长度 weighted path length达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)哈夫曼树是带权路径长度最短的树,权值较大的节点离根较近若规定根节点的层数为1,则从跟节点到第L层节点的路径长度为L-1节点的带权路径长度:从根节点到该节点之间的路径长度与该节点的权的乘积树的带权路径长度(WPL):所有叶子节点的带权路径长度之和,WPL最小的就是赫夫曼树创建思路从原创 2020-06-19 10:47:19 · 269 阅读 · 0 评论 -
数据结构与算法 15 顺序存储二叉树 线索化二叉树 堆排序
顺序存储二叉树二叉树的节点以数组的方式存放顺序二叉树通常只考了完全二叉树第 n 个元素的左子节点为 2*n+1第 n 个元素的右子节点为 2*n+2第 n 个元素的父节点为 (n-1)/ 2 (向下取整)n:表示二叉树中的第几个元素(按0开始编号)package search;import java.util.ArrayList;public class ArrayBinaryTree { public static void main(String[] args) {原创 2020-06-19 02:10:29 · 168 阅读 · 0 评论 -
数据结构与算法 14 二叉树查找指定节点
二叉树查找指定的节点前序查找思路先判断当前节点的 id 是否等于要查找的如果相等,则返回当前节点定义一个节点变量存储结果,用于返回如果不等,则判断当前节点的左子节点是否为空,如果不为空,则递归前序查找如果左递归前序查找,找到节点,则返回,否则继续判断,当前节点的右子节点是否为空,如果不为空,则继续向右递归前 序查找// preorder traverse search // return Node if find, or return null public HeroNod原创 2020-06-18 02:21:01 · 881 阅读 · 0 评论 -
数据结构与算法 13 二叉树的遍历 前序遍历 中序遍历 后序遍历
树结构数据存储结构数组存储下标访问,速度快,有序数组可以使用二分查找等算法加快查找速度检索具体的值,或者按一定顺序插入值会整体移动,效率较低插入元素:数组需要扩容,每次在底层都需要创建新的数组,要将原来的数据拷贝到新的数据并插入新的数据链式存储插入、删除效率较高(不需要拷贝整个数组)数据查询效率较低,需要从头开始遍历树存储能够提高数据存储、读取的效率比如利用二叉排序树,既可以保证数据的检索速度,也可以保证数据的插入、删除、修改速度二叉树原创 2020-06-17 13:56:56 · 148 阅读 · 0 评论 -
数据结构与算法 12 哈希表 增删改查操作
哈希表(散列)哈希表:不使用数据库;节省内存;速度快 — 存储、查找数据根据键值码值直接进行访问的数据结构,通过把关键码值映射到表中一个位置来访问记录,以加快查找到速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表查找数据:java 程序 — 缓存层(1. 缓存产品 redis、memcache;2.自己写:哈希表:数组+链表/数组+二叉树)— 数据库将常用的数据从数据库加载到哈希表中,可以有多级缓存,提升查找效率问题要求:当新员工来报道,将其信息(id、年龄、性别、名字)加入,当输原创 2020-06-17 07:10:39 · 546 阅读 · 0 评论 -
数据结构与算法 11 查找算法 线性查找 二分查找 插值查找 斐波那契(黄金分割点)查找
查找算法常用查找算法顺序(线性)查找二分查找/折半查找 (需要是有序数组)递归/非递归插值查找斐波那契查找/黄金分割点查找线性查找package search;import java.util.ArrayList;public class SequenceSearch { public static void main(String[] args) { int arr[] = {1,5,3,6,9,2,3,-1}; ArrayList re原创 2020-06-17 01:58:59 · 235 阅读 · 0 评论 -
数据结构与算法 10 排序算法 快速排序 基数排序 归并排序
排序算法快速排序对冒泡法的改进时间复杂度:O(nlogn)基本思想:通过一趟排序将要排序的数据分割成两个独立的部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行package sort;import java.util.Arrays;public class QuickSort { public static void main(String[] args) { int[] arr = {原创 2020-06-16 03:41:46 · 203 阅读 · 0 评论 -
数据结构与算法 09 排序算法 时间复杂度 冒泡排序 希尔排序 插入排序 选择排序
排序算法分类内部排序:将需要处理的数据加载到内存中进行排序;插入排序:直接插入排序 希尔排序选择排序:简单选择排序 堆排序交换排序:冒泡排序 快速排序归并排序基数排序 - 桶排序升级版外部排序:数据量过大,无法全部加载到内存中,需要借助外部存储进行排序(内存与外存结合)算法的时间复杂度事后统计:程序运行的时间;需要运行程序、依赖于计算机的硬件、软件等环境因素事前估算的方法:分析算法的时间复杂度时间频度时间频度:一个算法花费的时间与算法的执行次数成正比例,一个算法原创 2020-06-15 06:31:19 · 336 阅读 · 1 评论 -
数据结构与算法 08 递归 迷宫问题 八皇后问题
递归 recursion递归调用规则:当程序执行到一个方法时,就会开辟一个独立的空间(栈)每个空间的数据(局部变量)是独立的调用自身方法,向上继续开辟空间自顶向下进行执行package recursion;public class Demo00 { public static void main(String[] args) { test(4); } public static void test(int n){ if(n>2原创 2020-06-14 07:32:44 · 177 阅读 · 0 评论 -
数据结构与算法java - 07 中缀表达式 前缀表达式 后缀表达式 逆波兰表达式 逆波兰计算器 中缀表达式转为逆波兰表达式
前缀表达式Prefix expression 波兰表达式,运算符都位于操作数之前从右向左扫描表达式,遇到数字时,将数字压入堆栈;遇到运算符时,弹出栈顶的两个数,用运算符对他们做相应的计算(栈顶元素和次顶元素),并将结果入栈,重复上述过程直到表达式的最左端举例:(3+4)×5-6 prefix expression: -×+3456从右向左扫描,将 6,5,4,3 压入栈遇到 + 弹出 3、4,计算 3+4 得到7,将 7 入栈接下来是 ×,弹出 7、5,计算 7 × 5,将 3原创 2020-06-09 07:14:16 · 323 阅读 · 2 评论 -
数据结构与算法java - 06 栈的实现 中缀表达式的综合计算器实现 问题分析与解决
栈 stack先入后出 FILO-FIRST IN LAST OUT 有序列表限制线性表中的元素的插入和删除只能在线性表的同一端进行。允许插入和删除的一端,为变化的一端,称为栈顶 top,另一端为固定的一端,称为栈底 bottom最先放入栈中的元素在栈底,最后放入的在栈顶删除元素,最后放入的元素最先被删除,最先放入的元素最后被删除出栈:pop入栈:push应用场景子程序的调用处理递归调用表达式的转换(中缀转后缀)二叉树的遍历图形的深度优先搜索 depth -原创 2020-06-09 02:41:51 · 205 阅读 · 1 评论 -
java高级语言 - GUI 03 画笔 鼠标监听 窗口监听 键盘监听
画笔 paintpackage com.zepei;import java.awt.*;public class TestMyPaint { public static void main(String[] args) { new MyPaint().loadFrame(); }}class MyPaint extends Frame{ public void loadFrame(){ setBounds(200,200,600,500原创 2020-06-08 05:52:34 · 172 阅读 · 0 评论 -
数据结构与算法java - 05 环形单向链表 约瑟夫问题
单向环形链表Josephu 约瑟夫环问题编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m的那个人出列,他的下一位又从1开始报数,报到m的那个人出列,以此类推,直到所有人出列,由此产生一个出队编号的序列构建单向环形链表先创建第一个节点,让 first 指向该节点,并形成环形后面当每创建一个新的节点,就把该节点加入到已有的环形链表中即可遍历环形链表先让一个辅助指针(变量),指向 first 节点然后通过一个 while 循环变量该环形原创 2020-06-07 13:56:35 · 112 阅读 · 0 评论 -
数据结构与算法java - 04 双向链表 增删改查
双向链表单链表的缺点单向链表查找只能是一个方向,双向链表可以向前或者向后查找单向链表不能自我删除,需要靠辅助节点;双向链表可以自我删除双向链表操作每个节点都有指向前一个节点的 pre 和指向下一个节点的 next// create double linked listclass HeroNode2{ public int id; public String name; public String nickname; public HeroNode2 nex原创 2020-06-07 08:36:55 · 106 阅读 · 0 评论 -
数据结构与算法java - 03 链表,单向链表,逆序打印单向链表
链表Linked List 有序链表是以节点的方式来存储,链式存储每个节点包含 data 域, next 域:指向下一个节点链表的各个节点不一定是连续存放链表分带头节点的链表和没有头节点的链表,根据需求而定单向链表head 节点:不存放具体的数据;表示单链表头添加(创建)先创建一个 head 头节点,作用是表示单链表的头每添加一个节点,直接加入到链表的最后遍历通过一个辅助变量,帮助遍历列表单向链表的创建,添加,遍历class HeroNode{}: 定义变量,构原创 2020-06-06 08:43:08 · 117 阅读 · 0 评论 -
数据结构与算法02 -- 队列,数组实现队列,环形队列
队列队列是一个有序列表,可以用数组或是链表来实现先进先出队列的输出、输入是分别从前后端来处理,因此需要两个变量 front 以及 rear 记录队列前后端的下标,front 会随着数据输出而改变,而 rear 则是随着数据输入而改变。maxSize记录该队列的最大容量数据存入队列addQueue当 front == rear 时,即队列为空,将尾指针往后移若尾指针 rear 小于队列的最大下标 maxSize-1,则将数据存入 rear 所指的数组元素中,否则无法存入数据。rea原创 2020-06-04 13:58:37 · 100 阅读 · 0 评论 -
数据结构与算法01 - 稀疏数组
数据结构与算法 01线性结构和非线性结构线性结构最常用的数据结构,特点是数据元素之间存在一对一的线形关系两种不同的存储结构:顺序存结构储和链式存储结构顺序存储的线形表称为顺序表,顺序表中的存储元素是连续的(地址)链式存储的线性表称为链表,链表中的存储元素不一定是连续的,元素节点中存放数据元素以及相邻元素的地址信息线性结构常见的有:数组、队列、链表和栈非线性结构二维数组,多维数组,广义表,树结构,图结构稀疏数组sparse array二维数组中很多值的默认值为0,记录了很多原创 2020-06-03 12:39:30 · 139 阅读 · 0 评论