java数据结构与算法
java数据结构与算法
sweetheart7-7
技术源于热爱 ---------------------- 学习改变命运,知识改变未来 ---------------------- Architect-Road
展开
-
十大常用算法
取自韩顺平数据结构与算法的总结文章目录二分查找算法的非递归实现分治算法动态规划算法KMP算法贪心算法普里姆算法克鲁斯卡尔算法迪杰斯特拉算法弗洛伊德算法马踏棋盘算法二分查找算法的非递归实现二分查找法只适用于从有序的数列中进行查找(比如数字和字母等),将数列排序后再进行查找二分查找法的运行时间为对数时间 O(㏒₂n) ,即查找到需要的目标位置最多只需要㏒₂n 步,假设从[0,99]的队列(100 个数,即 n=100)中寻到目标数 30,则需要查找步数为㏒₂100 , 即最多需要查找 7 次( 2原创 2021-02-09 19:38:35 · 2518 阅读 · 0 评论 -
图的深度优先搜索(DFS)和广度优先搜索算法(BFS)
图为什么不用线性表和树线性表局限于一个直接前驱和一个直接后继的关系树也只能有一个直接前驱也就是父节点当我们需要表示多对多的关系时, 这里我们就用到了图。图是一种数据结构,其中结点可以具有零个或多个相邻元素。两个结点之间的连接称为边。 结点也可以称为顶点。如图:图的常用概念顶点(vertex)边(edge)路径无向图5) 有向图6) 带权图图的表示方式有两种:二维数组表示(邻接矩阵);链表表示(邻接表)。邻接矩阵是表示图形中顶点之间相邻关系的矩阵,对于 n 个顶点的图原创 2021-02-03 22:58:20 · 1530 阅读 · 0 评论 -
B树、B+树和B*树
多路查找树二叉树的操作效率较高,但是也存在问题二叉树需要加载到内存的,如果二叉树的节点少,没有什么问题,但是如果二叉树的节点很多(比如 1 亿), 就存在如下问题:问题 1:在构建二叉树时,需要多次进行 i/o 操作(海量数据存在数据库或文件中),节点海量,构建二叉树时,速度有影响问题 2:节点海量,也会造成二叉树的高度很大,会降低操作速度.多叉树在二叉树中,每个节点有数据项,最多有两个子节点。如果允许每个节点可以有更多的数据项和更多的子节点,就是多叉树(multiway tree)2原创 2021-02-03 17:45:04 · 210 阅读 · 0 评论 -
AVL平衡二叉树
平衡二叉树也叫平衡二叉搜索树(Self-balancing binary search tree)又被称为 AVL 树, 可以保证查询效率较高。具有以下特点:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过 1,并且左右两个子树都是一棵平衡二叉树。平衡二叉树的常用实现方法有红黑树、AVL、替罪羊树、Treap、伸展树等。获取树高度// 返回以当前节点为根节点的树的高度, 此处假设根节点高度为1public int height() { return Math.max(thi.原创 2021-02-02 20:13:00 · 152 阅读 · 0 评论 -
二叉排序树BST
二叉排序树:BST : (Binary Sort(Search) Tree), 对于二叉排序树的任何一个非叶子节点,要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大。特别说明:如果有相同的值,可以将该节点放在左子节点或右子节点对删除结点的各种情况的思路分析:第一种情况:删除叶子节点 (比如:2, 5, 9, 12)思路(1) 需求先去找到要删除的结点 targetNode(2) 找到 targetNode 的 父结点 parent(3) 确定 targetNode 是 p原创 2021-02-02 17:30:02 · 526 阅读 · 0 评论 -
赫夫曼树/编码实现数据的压缩与解压
赫夫曼树路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为 1,则从根结点到第 L 层结点的路径长度为 L-1结点的权及带权路径长度:若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积树的带权路径长度:树的带权路径长度规定为所有叶子结点的带权路径长度之和,记为 WPL(weighted pathlength) ,权值越大的结点原创 2021-01-31 16:24:02 · 260 阅读 · 0 评论 -
堆排序
将二叉树调整为大顶堆对所有非叶子节点从下向上, 从左向右进行调整上浮: k初始指向index对应节点的左子节点令k指向最大的子节点当子节点的值大于父节点时, 让子节点上浮子节点与父节点的值进行交换, 并让index指向子节点,继续下次循环堆排利用了大顶堆和完全二叉树的特点import java.util.Arrays;public class HeapSort { // 基于完全二叉树 public static void main(String[] args)...原创 2021-01-29 19:45:13 · 99 阅读 · 0 评论 -
线索化二叉树
public class ThreadedBinaryTreeDemo { public static void main(String[] args) { //测试中序线索二叉树 HeroNode root = new HeroNode(1, "tom"); HeroNode node2 = new HeroNode(3, "jack"); HeroNode node3 = new HeroNode(6, "smith");...原创 2021-01-29 19:36:35 · 114 阅读 · 0 评论 -
数组实现顺序存储二叉树
顺序存储二叉树的前中后序遍历package com.whb.tree;public class ArrBinaryTreeDemo { public static void main(String[] args) { int[] arr = { 1, 2, 3, 4, 5, 6, 7 }; //创建一个 ArrBinaryTree ArrBinaryTree arrBinaryTree = new ArrBinaryTree(arr); .原创 2021-01-29 19:33:37 · 424 阅读 · 0 评论 -
二叉树及其(前中后)序遍历
前序遍历: 先输出父节点,再遍历左子树和右子树中序遍历: 先遍历左子树,再输出父节点,再遍历右子树后序遍历: 先遍历左子树,再遍历右子树,最后输出父节点看输出父节点的顺序,就确定是前序,中序还是后序对下面二叉树进行前中后续遍历和查找及节点的删除package com.whb.tree;public class BinaryTreeDemo { public static void main(String[] args) { // 先需要创建一颗二叉树 ...原创 2021-01-29 19:27:13 · 127 阅读 · 0 评论 -
哈希表(散列)的实现
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,住址…),当输入该员工的id时,要求查找到该员工的 所有信息.要求: 不使用数据库,尽量节省内存,速度越快越好=>哈希表(散列)package com.whb.hashtab;i原创 2021-01-27 12:50:45 · 241 阅读 · 4 评论 -
常用查找算法
线性查找...按顺序查找即可二分查找此处采用递归的思想package com.whb.search;import java.util.ArrayList;import java.util.List;public class BinarySearch { public static void main(String[] args) { int arr[] = { 1, 8, 10, 89, 1000, 1000, 1000, 1234 }; in原创 2021-01-26 16:26:11 · 99 阅读 · 0 评论 -
常见排序算法
文章目录`冒泡排序``选择排序``插入排序``希尔排序``快速排序``归并排序``基数排序`冒泡排序n个数比较n-1趟,每一趟选出最大的数在一趟中,从前往后相邻两个比较如果前面的比后面的数大,则交换顺序优化:当某一趟比较下来没有交换数据时,说明已经排序好,可以退出循环{-1, 123, 32, 12, 58, 9, 90}第1趟排序的结果为:[-1, 32, 12, 58, 9, 90, 123]第2趟排序的结果为:[-1, 12, 32, 9, 58, 90, 123]第3趟排原创 2021-01-23 13:27:31 · 122 阅读 · 0 评论 -
递归的应用(迷宫问题和八皇后问题)
迷宫问题右下角位置为出路package com.whb.recursion;public class MiGong { public static void main(String[] args) { // 创建二维数组, 模拟迷宫 // 地图 int[][] map = new int[8][7]; // 1 表示墙 for (int i = 0; i < 7; i++) {原创 2021-01-20 10:00:59 · 223 阅读 · 0 评论 -
用数组或链表实现栈及栈的应用(中缀表达式转后缀表达式)
代码实现package com.whb.stack;import java.util.Scanner;public class ArrayStackDemo { public static void main(String[] args) { //测试一下ArrayStack 是否正确 //先创建一个ArrayStack对象->表示栈 ArrayStack stack = new ArrayStack(4); Str.原创 2021-01-20 09:52:28 · 257 阅读 · 2 评论 -
单向链表,双向链表及环形列表解决约瑟夫问题
下面的代码包括了单向链表的逆序打印和将链表逆序,即将链表中的节点逆序连接节点的插入(order by)节点的删除单链表的反转逆序打印利用栈的数据结构特点,遍历链表,将每个节点压入链表中,然后逐个弹出打印package com.whb.linkedlisk;import java.util.Stack;public class SingleLinkedListDemo { public static void main(String[] args) {原创 2021-01-17 18:53:47 · 255 阅读 · 1 评论 -
数组模拟普通队列与环形队列
普通队列package com.whb.queue;import java.util.Scanner;public class ArrayQueueDemo { public static void main(String[] args) { //测试一把 //创建一个队列 ArrayQueue queue = new ArrayQueue(3); char key = ' '; //接收用户输入 Scann原创 2021-01-16 09:30:22 · 157 阅读 · 0 评论 -
二维数组与稀疏数组的互转
当二维数组中有大量的0时,可以用稀疏数组对二位数组进行压缩存储,稀疏数组可以大大的节省存储空间如:普通二维数组0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0原创 2021-01-16 08:28:12 · 174 阅读 · 0 评论