![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
rookie123222
这个作者很懒,什么都没留下…
展开
-
时间复杂度
常用的时间复杂度所耗费的时间大小依次是:原创 2021-06-29 10:59:13 · 64 阅读 · 0 评论 -
马踏棋盘问题(骑士周游问题)
问题:给定一个棋盘,马需要走完棋盘的每一个格子,问马的路径?(马只能“日”字移动)代码:public class HorseChess { //棋盘的边界 private static int X; private static int Y; private static boolean visited[][];//长度为X*Y private static boolean finished; public static void m...原创 2021-08-04 22:06:56 · 123 阅读 · 0 评论 -
最短路径问题(Dijkstra迪杰斯特拉、Floyd弗洛伊德算法)
题目:找出出发顶点到其他点的最短距离Dijkstra迪杰斯特拉算法:第一步:由出发顶点,遍历其他顶点并更新距离表,找出距离最近的点第二步:由第一步中距离最近的点为入口,遍历其他顶点并更新距离表,找出最近的点……重复第二步直到所有顶点都找完。更新距离表:动态规划思想,比较加入改点与不加该店的距离代码实现:public class DijkstraAlgorithm { public static void main(String[] args) { ...原创 2021-08-04 22:02:23 · 190 阅读 · 0 评论 -
最小生成树:prim普里姆算法+Kruskal科鲁斯卡尔算法(修路问题为例)
Prim算法:普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树。意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex ),且其所有边的权值之和亦为最小。最小生成树:题目(修路问题):public class primAlgorithm { public static void main(String[] args) { char[] data = new char[]{'A', 'B', '..原创 2021-08-01 11:15:12 · 628 阅读 · 0 评论 -
贪心算法(以集合覆盖问题为例)
概念:贪心算法一般按如下步骤进行:①建立数学模型来描述问题②把求解的问题分成若干个子问题③对每个子问题求解,得到子问题的局部最优解④把子问题的解局部最优解合成原来解问题的一个解题目及思路:第一次选覆盖地区最多的台(最优解),再将该台中包含的地区在其他台中划掉;第二次选覆盖地区最多的台(最优解),在将该台中包含的地区在其他台中划掉……...原创 2021-07-31 19:31:01 · 431 阅读 · 0 评论 -
KMP搜索算法
部分匹配表前缀=后缀的个数如“bread”,前缀 b,br,bre,brea,bread;后缀d,ad,ead,read,bread匹配规则public class Match { public static void main(String[] args) { String str2 = "ACACABAC"; String str1="ABCDACACACACABAC"; int[] ints = kmpMatc...原创 2021-07-31 15:32:00 · 204 阅读 · 0 评论 -
十大算法(二分查找,分治算法,动态规划算法)
二分查找:不适用递归,而用循环完成;public class BinarySearch { public static void main(String[] args) { int arr[]={1,3,8,10,11,67,100}; int target = binary(arr, 8); System.out.println(target); } public static int binary(int[] arr,i原创 2021-07-30 11:26:47 · 142 阅读 · 0 评论 -
图(概念,深度优先遍历,广度优先遍历)
基本概念(5)有向图:顶点的连接有方向,比如只能A->B,不能B->A (6) 带权图:边带权值邻接矩阵:邻接表:图的遍历:从已知的连通图的某一顶点出发,沿着一些边访遍图中所有的顶点,且使每个顶点仅被访问一次。深度优先遍历(DFS)://DFS public void DFS(int[][] edges,int v){ System.out.println(getValueByIndex(v)); ...原创 2021-07-28 22:35:09 · 107 阅读 · 0 评论 -
多叉树(2-3树,B树)
基本概念:B树:通过重新组织结点,降低树的高度,并且减少i/o读写次数来提升效率;特点:所有叶子都在同一层多叉树:每个结点可以有更多数据项,更多子结点。2-3树:最简单的B-树;有两个子结点的结点叫二结点,二结点要么没有子结点,要么有两个子结点;三结点同理234树:B+树:B*树:...原创 2021-07-27 16:47:27 · 150 阅读 · 0 评论 -
平衡二叉树(AVL)
基础概念AVL树是一颗空树或者左右两个子树的高度差的绝对值不超过1,且左右两颗子树都是平衡二叉树。结点深度://返回以该结点为根结点的树高度 public int height() { return Math.max((left == null) ? 0 : left.height(), (right == null) ? 0 : right.height()) + 1; }左旋转:private void leftRotate() {..原创 2021-07-27 16:32:15 · 82 阅读 · 0 评论 -
二叉排序树(BST) 添加结点,删除结点
基本概念:从根结点开始比较,比该结点大放在右子结点;比该结点小放在左子结点中序遍历:从小到大排序代码://二叉排序树class BinarySortTree { private Node root; public void add(Node node) { if (root == null) root = node; else root.add(node); } public void infix原创 2021-07-23 21:03:33 · 170 阅读 · 0 评论 -
Huffman霍夫曼树,霍夫曼编码
霍夫曼树基本概念:路径:从一个结点往下到孩子或孙子结点之间的同理路径长度:如结点1到结点7的路径长度=2结点的权:将结点的某一属性值作为结点的权带权路径长度:从根节点到该结点*该结点的权;如结点1到结点7的带权路径长度:7*2=14的带权路径长度(WPL):该树的所有叶子结点的带权路径长度之和霍夫曼树:给定n个权值,构造一颗二叉树并由这n个权值作为数的叶子结点,且该树的带权路径长度(WPL)达最小,这样的二叉树成为最优二叉树,也叫霍夫曼树霍夫曼树特点:权值越大的叶子结点.原创 2021-07-22 11:53:02 · 1962 阅读 · 0 评论 -
堆排序(以大顶堆为例)
注意:(1)大顶堆:子树中,父节点>两个子结点;两个子结点顺序没有要求。 大顶堆对应升序排序(数字大的放在后面)(2)小顶堆:子树中,父节点<两个子结点;对应降序排序(3)使用二叉树的思想,但实际是在操作数组public class HeapSort { public static void main(String[] args) { int arr[] = {4, 6, 8, 5, 9, 10, 2, -10}; h...原创 2021-07-20 11:32:23 · 353 阅读 · 0 评论 -
线索二叉树(以中序为例)
基本介绍:(1)线索二叉树需为完全二叉树;加上了线索的二叉树为线索二叉树,根据线索性质不同,分为前序线索二叉树、中序线索二叉树、后序线索二叉树(2)结点的前一个结点为前驱结点;结点的后一个结点为后继结点如8的前驱结点为null,后继结点为3中序线索化:中序遍历:4,2,5,1,6,3Thread(4):设置4.left=null ,pre=4Thread(2):设置4.right=2,pre=2Thread(5):设置5.left=2,pre=5Threa..原创 2021-07-20 11:25:36 · 747 阅读 · 0 评论 -
顺序存储二叉树(数组)
class ArrayBinaryTree { public int arr[]; public ArrayBinaryTree(int[] arr) { this.arr = arr; } //重载前序遍历 public void preOrder() { preOrder(0); } //顺序存储二叉树的前序遍历 public void preOrder(int index) { ...原创 2021-07-19 15:53:02 · 92 阅读 · 0 评论 -
二叉树(遍历,查找,删除)
遍历前序遍历:root 开始,输出,向左递归->向右递归 中序遍历:root开始,向左递归->输出->向右递归 后续遍历:root开始,向左递归->向右递归->输出//前序遍历 public void preOrder(){ System.out.println(this); //递归向左子树前序遍历 if (this.left!=null) this.left.preOrd..原创 2021-07-18 16:29:43 · 61 阅读 · 0 评论 -
利用哈希表存储管理数据
public class Hash { public static void main(String[] args) { HashTable hashTable = new HashTable(7); String key=""; Scanner scanner=new Scanner(System.in); while (true) { System.out.println("add:添加雇员"); .原创 2021-07-16 10:58:00 · 324 阅读 · 0 评论 -
查找(二分法,插值,斐波那契)
二分法查找:mid=1/2//考虑只有一个值符合查找要求 public static int binarySearch(int arr[],int left,int right,int finalVal){ int mid=(left+right)/2; if (left>right) return -1; if (finalVal<arr[mid]){ return binaryS原创 2021-07-15 20:11:26 · 96 阅读 · 0 评论 -
排序(冒泡,选择,插入,希尔排序,快速排序,归并,基数)
注意:1.数组输出:使用tostring方法Arrays.toString(arr)2.某方法执行的时间:long l1 = System.currentTimeMillis();shellSort(arr1);long l2 = System.currentTimeMillis();冒泡排序//冒泡排序:相邻两个值比较,较大的数放后面 public static void bublleSort(int arr[]){ boolean flag=fa原创 2021-07-12 16:43:42 · 72 阅读 · 0 评论 -
排序的概念及分类
排序的分类:1.内部排序:将需要处理的数据都加载到内部存储器(内存)中进行排序2.外部排序:数据量过大,无法全部加载到内存中,则需要借助外部存储(文件)进行排序3.常见的排序算法分类...原创 2021-07-10 16:11:59 · 221 阅读 · 0 评论 -
递归问题:迷宫+八皇后
迷宫:public class Maze { public static void main(String[] args) { int[][]map=new int[8][7]; //使用1表示墙,上下全部置为1 for (int i=0;i<7;i++){ map[0][i]=1; map[7][i]=1; } //左右置为1 for (int原创 2021-07-10 11:33:58 · 67 阅读 · 0 评论 -
逆波兰(后缀)计算器,可处理小数,括号
注意点:1.String :(1)split()方法:空字符串分割 split("") 将字符串分割为一个一个并放入String[ ]数组中非空字符串举例:"2:3:4:5".split(":") //将返回["2", "3", "4", "5"]"|a|b|c".split("|") //将返回["", "a", "b", "c"]"hello".split("", 3) //数组长度为3,可返回 ["h", "e", "l"](2)str=n...原创 2021-07-07 17:07:33 · 160 阅读 · 0 评论 -
栈实现加减乘除计算器
注意点:1.char型与int型:可以比较,可以加减(char型转换为int型)2.String与char型的拼接:String s1='a'+"";3.可能出现脚标越界的情况,要用if将情况考虑完整public class StackPra { public static void main(String[] args) { String expression="6-12+36"; //两个栈,一个数栈,一个符号栈 ArraySt.原创 2021-07-06 20:07:07 · 156 阅读 · 0 评论 -
栈的增删改查:数组、链表的方式实现
数组:class ArrayStack{ private int maxSize; private int[] stack;//栈空间 private int top=-1; public ArrayStack(int maxSize){ this.maxSize=maxSize; stack=new int[maxSize]; } public boolean isFull(){ return top=原创 2021-07-05 11:03:56 · 74 阅读 · 0 评论 -
环形链表+Josepfu问题
public class Josepfu { public static void main(String[] args) { JosepfuQue(10,3,1); } //Josepfu问题:n个小孩,从k个开始从1报数,报到m的小孩出列,下一个小孩继续从1开始报数 public static void JosepfuQue(int n,int k,int m){ CircleSingleLink c1 = new CircleSingleLink().原创 2021-07-03 16:57:11 · 53 阅读 · 0 评论 -
双向链表的增删改查
1.注意判断temp==null 的位置,应考虑放在最前面,防止出现空指针异常;2.双向链表的自我删除(实则为两个指针更改,原数据域保留,两个指针保留),注意待删除的结点是否为最后一个结点;3.添加结点时,注意判断添加的结点是否为最后一个结点;//创建双向链表的类class DoubleLink{ //头结点 private HeroNode2 head = new HeroNode2(0, "", ""); public HeroNode2 getHead()...原创 2021-07-01 11:51:07 · 176 阅读 · 0 评论 -
(线性表的链式存储)单链表的增删改查及面试题
//添加演示public static void main(String[] args) { HeroNode heroNode1 = new HeroNode(1, "宋江", "及时雨"); HeroNode heroNode3 = new HeroNode(3, "吴用", "智多星"); HeroNode heroNode4 = new HeroNode(3, "林冲", "豹子头"); HeroNode heroNode7 = n.原创 2021-06-29 17:13:37 · 121 阅读 · 0 评论 -
(线性表的顺序存储)数组模拟环形队列实现
public static void main(String[] args) { ArrayQueue1 aq = new ArrayQueue1(4); char key=' '; Scanner scanner = new Scanner(System.in); boolean loop =true; while (loop){ System.out.println("s(show): 显示队列").原创 2021-06-29 15:49:00 · 53 阅读 · 0 评论