
数据结构与算法
子木_Lee
长风破浪会有时,直挂云帆济沧海
展开
-
稀疏数组
【需求】编写五子棋程序,使其实现退出和续上盘的功能【分析】续上盘功能可以通过IO技术,将得到的数组存储到文件中,复盘时,再从文件中读取【关于稀疏数组】【思路梳理】【代码实现】package suanfa;import javax.print.DocFlavor;import java.io.*;public class SparseArray...原创 2019-08-22 11:18:59 · 195 阅读 · 0 评论 -
链表——单向链表的创建与顺序插入
【简介】链表是有序的列表,它在内存中是存储如下:链表是以节点的方式来存储,是链式存储 每个节点包含 data 域, next 域:指向下一个节点. 如图:链表的各个节点不一定是连续存储. 链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定【单项链表】单链表(带头结点) 逻辑结构示意图如下【实例演示】使用带head头的单向链表实现 –水浒英雄...原创 2019-09-03 15:03:25 · 2464 阅读 · 2 评论 -
队列——数组实现环形队列
【目的】数组实现环形队列【思路分析】1. front 变量的含义做一个调整: front 就指向队列的第一个元素, 也就是说 arr[front] 就是队列的第一个元素 front 的初始值 = 02. rear 变量的含义做一个调整:rear 指向队列的最后一个元素的后一个位置. 因为希望空出一个空间做为约定.rear 的初始值 = 03. 当队列满时,条件...转载 2019-09-02 18:46:05 · 304 阅读 · 0 评论 -
克鲁斯卡尔算法
【问题导入】【算法简介】1)克鲁斯卡尔(Kruskal)算法,是用来求加权连通图的最小生成树的算法。2)基本思想:按照权值从小到大的顺序选择n-1条边,并保证这n-1条边不构成回路3)具体做法:首先构造一个只含n个顶点的森林,然后依权值从小到大从连通网中选择边加入到森林中,并使森林中不产生回路,直至森林变成一棵树为止【题目分析】第1步:将边<E,F>...原创 2019-08-29 11:08:11 · 17033 阅读 · 1 评论 -
二叉树的遍历
【遍历方式简介】前序遍历: 先输出父节点,再遍历左子树和右子树中序遍历: 先遍历左子树,再输出父节点,再遍历右子树后序遍历: 先遍历左子树,再遍历右子树,最后输出父节点【代码片段】创建二叉树结点class HeroNode { private int no; private String name; private HeroNode left; //默认null...原创 2019-08-28 16:07:37 · 223 阅读 · 0 评论 -
普利姆算法
【问题导入】1)有胜利乡有7个村庄(A, B, C, D, E, F, G) ,现在需要修路把7个村庄连通2)各个村庄的距离用边线表示(权) ,比如 A – B 距离 5公里3)问:如何修路保证各个村庄都能连通,并且总的修建公路总里程最短?【思路分析】修路问题本质就是就是最小生成树问题, 先介绍一下最小生成树(Minimum Cost Spanning Tree),简...原创 2019-08-27 15:55:30 · 2820 阅读 · 1 评论 -
贪心算法
【简介】1)贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法2)贪婪算法所得到的结果不一定是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果【应用实例】——集合覆盖假设存在如下表的需要付费的广播台,以及广播台信号可以覆盖的地区。 如何选择最少的广播台,让所有的地区都可以接...原创 2019-08-27 14:33:21 · 285 阅读 · 0 评论 -
KMP算法
【简介】1)KMP是一个解决模式串在文本串是否出现过,如果出现过,最早出现的位置的经典算法2)Knuth-Morris-Pratt 字符串查找算法,简称为 “KMP算法”,常用于在一个文本串S内查找一个模式串P 的出现位置,这个算法由Donald Knuth、Vaughan Pratt、James H. Morris三人于1977年联合发表,故取这3人的姓氏命名此算法.3)KMP方法...原创 2019-08-27 12:20:08 · 142 阅读 · 0 评论 -
动态规划算法
【简介】1)动态规划(Dynamic Programming)算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法2)动态规划算法与分治算法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。3)与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。 ( 即下一个子阶段的求解是建立...原创 2019-08-26 13:56:55 · 270 阅读 · 0 评论 -
分治算法
【简介】分治算法字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)……【应用场景】 二分搜索 大整数乘法 棋盘覆盖 合并排序 ...原创 2019-08-26 11:22:52 · 234 阅读 · 0 评论 -
二分查找(非递归实现)
【简介】1)二分查找法只适用于从有序的数列中进行查找(比如数字和字母等),将数列排序后再进行查找2)二分查找法的运行时间为对数时间O(㏒₂n) ,即查找到需要的目标位置最多只需要㏒₂n步,假设从[0,99]的队列(100个数,即n=100)中寻到目标数30,则需要查找步数为㏒₂100 , 即最多需要查找7次( 2^6 < 100 < 2^7)【说明】运用非递归方式,...原创 2019-08-26 10:42:17 · 396 阅读 · 0 评论 -
队列——数组实现非环形简单队列
【主题】数组实现非环形简单队列【队列介绍】队列是一个有序链表,可以用数组或是链表来实现 遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出 示意图:(使用数组模拟队列示意图)【思路】【代码实现】队列代码package suanfa;public class ArrayQueue { private int maxSize...原创 2019-08-22 14:32:44 · 354 阅读 · 0 评论 -
链表——单向链表的增删改查
【目的】实现单向链表的修改、删除操作【代码实现】链表的定义//定义链表class SingleLinkedList2{ //初始化一个头结点 private HeroNode head = new HeroNode(0,"" , ""); //添加结点 public void add(HeroNode heroNode) { HeroNode temp...原创 2019-09-03 16:30:33 · 332 阅读 · 0 评论