数据结构
木易三水良
这个作者很懒,什么都没留下…
展开
-
SkipList(JAVA代码实现)
public class SkipList { // 结点“晋升”的概率 private static final double PROMOTE_RATE = 0.3; private Node head, tail; private int maxLevel; public SkipList() { head = new Node(Integer.MIN_VALUE); tail = new Node(Integer.MAX_原创 2020-12-11 11:20:51 · 128 阅读 · 0 评论 -
斐波那契查找 java代码实现(包含普通和递归两种)
package com.itheima.security.springboot.algorithm.search;import java.util.Arrays;/** * @description: * @Author: muyi * @CreateDate: 2020/12/2 12:00 */public class FibonacciSearch { /** * 斐波那契数组的长度 */ private final static int FIB原创 2020-12-02 14:45:49 · 229 阅读 · 0 评论 -
一篇文章让你彻底搞懂红黑树(带图带代码)
1、概念及特性在满足排序二叉树的前提下,红黑树还满足以下5个特征:1、每个节点要么是黑色,要么是红色;2、根节点都是黑色,如下图中的节点40;3、每个叶子节点(NIL)都是黑色;4、每个红色结点的两个子结点一定都是黑色(即在任一条到达叶子节点的路径上不可能连续经过两个红色节点);5、任意一结点到每个叶子结点的路径都包含数量相同的黑结点,所以红黑树也是黑色完美平衡树。如下图的黑高 = 3。备注:从特性5可以看出,除开NIL节点的情况下,任一节点不可能只存在一个黑色的子节点。原创 2020-08-10 16:56:27 · 1180 阅读 · 0 评论 -
数据结构——多路查找树概念
目录二叉树问题分析多叉树B树的基本介绍2-3树构建规则应用举例B+树的介绍B*树的介绍二叉树问题分析二叉树的操作效率高,但是也存在问题,如下:二叉树需要加载到内存的,如果二叉树的节点少,没有问题,但是如果二叉树的节点很多(比如1亿),就存在以下问题:问题一:在构建二叉树时,需要多次进行I/O操作(海量数据存在数据库或文件中),节点海量,构建树时...原创 2020-03-01 14:40:11 · 228 阅读 · 0 评论 -
数据结构——平衡二叉树(AVL)
基本介绍1)、平衡二叉树也叫平衡二叉搜索树(Self-balancing binary search tree)又被称为AVL树,可以保证查询效率较高。2)、具有以下特点:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。平衡二叉树的常用实现方法有红黑树、AVL、替罪羊树、Treap、伸展树等。3)、如下:思路分析单旋转-左旋转单旋转-...原创 2020-02-28 22:14:07 · 210 阅读 · 0 评论 -
数据结构——二叉排序树(BST)
基本介绍:二叉排序树BST(Binary Sort(Search) Tree),对于二叉排序树的任何一个非叶子节点要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大。特别说明:如果有相同的值,可以将该节点放在左子节点或右子节点,如果二叉排序树中存在节点值相同的时候,示例代码中给出的获取节点的方法,只会返回第一个相同值的节点,这就致使在进行删除操作的时候会报栈溢出(StackOve...原创 2020-02-25 22:50:36 · 766 阅读 · 0 评论 -
数据结构——赫夫曼编码(算法)
基本介绍:1)、赫夫曼编码也译为哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,属于一种程序算法。2)、赫夫曼编码是赫夫曼树在电讯通信中经典的应用之一。3)、赫夫曼编码广泛地用于数据文件压缩,其压缩率通常在20%~90%之间。4)、赫夫曼码是可变字长编码(VLC) 的一种。Huffman于1952年提出一种编码方法,称之为最佳编码。原理剖析:通信领域中...原创 2020-02-23 22:45:58 · 1862 阅读 · 1 评论 -
数据结构——赫夫曼树
基本介绍:1)、给定n个权值作为n个叶子节点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree),有的译为霍夫曼树。2)、赫夫曼树是带权路径长短最短的树,权值较大的节点离根较近。重要概念:1)、路径:在一棵树中,从一个节点往下可以达到的孩子或孩子节点之间的通路,称为路径。2)、路径长度:通路中分支的数目称为...原创 2020-02-22 15:21:37 · 373 阅读 · 0 评论 -
数据结构——堆排序(算法)
基本介绍1)、堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最好、最坏、平均时间复杂度均为O(nlogn),它也是不稳定排序。2)、堆是具有以下性质的完全二叉树:每个节点的值都大于或等于其左右孩子节点的值,称为大顶堆,注意:没有要求节点的左孩子的值和右孩子的值的大小关系。3)、每个节点的值都小于或等于其左右孩子节点的值,称为小顶堆。4)、大堆顶举例说明,堆数据...原创 2020-02-19 12:07:02 · 1321 阅读 · 0 评论 -
数据结构——二叉树(顺序存储二叉树)
1、概念:从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组,如下图所示:2、特点:1、顺序二叉树通常考虑完全二叉树;2、第n个元素的左子节点为 2*n+1;3、第n个元素的右子节点为 2*n+2;4、第n个元素的父节点为 (n-1)/2;5、n:标识二叉树的第几个元素(按0开始编号,如上图所示)3、示例代码:二叉树数组类...原创 2020-02-03 15:58:58 · 351 阅读 · 0 评论 -
数据结构——二叉树(基础)
1、树存在意义:1)数组的存储方式的分析优点:通过下标方式访问元素,速度快,对于有序数组,还可使用二分查找提高检索速度。缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率低。2)链式存储方式的分析优点:在一定程度上对数组存储方式有优化(比如:插入一个数值节点,只需要将插入节点,连接到链表即可,删除效率也很好)。缺点:在进行检索时,效率仍然很低,检索某个值,需要从头节...原创 2020-02-03 15:26:20 · 122 阅读 · 0 评论 -
数据结构——HashTable
基本介绍散列表(hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构,也就是说,它通过关键码值映射到表中的一个位置来访问记录,以加快查找的速度。这个映射函数叫散列函数,存放记录的数组叫散列表。哈希表管理学生信息概图示例代码学生信息类@Datapublic class Student { private int id; ...原创 2020-01-20 11:54:07 · 1358 阅读 · 0 评论 -
数据结构——插值查找(算法)
基本思想插值查找算法类似于二分查找,所以数组同样要求必须有序,不同的是插值查找每次从自适应mid处开始查找。 有序数组中值与索引之间类似于线性关系,故通过公式求自适应索引。二分查找中秋mid索引的公式,左边索引 left,右边索引 right,待查找值 findValueeg:数组 arr = {1,3,5,7,......91,93,95,97,99}50 个数:假如我们查找...原创 2020-01-19 12:24:53 · 279 阅读 · 0 评论 -
数据结构——二分查找(算法)
基本思想:二分查找要求数组必须有序,如果数组无序,需对数组进行排序操作 首先确定数组中间值的下标:mid = (left+right)/2; 让需要查找的值findValue与arr[mid]进行比较:findValue>arr[mid]:说明要查找的值位于mid的右边,递归向右查找,此时left = mid+1,right不变; findValue<arr[mid]:说明...原创 2020-01-19 11:41:00 · 518 阅读 · 0 评论 -
数据结构——顺序(线性)查找(算法)
概述依次对数组的元素进行遍历,当数组指定位置元素与要查找的值相等时,返回指定位置即可。不需要数组有序实例代码:查找在数组的第一个元素位置 /** * 获取查找到的第一个元素的位置 * * @param array 数组 * @param value 要查找的值 * @return 查找到,返回index,未查找到返回-1 ...原创 2020-01-19 10:38:13 · 180 阅读 · 0 评论 -
数据结构——归并排序(算法)
基本介绍:归并排序(MERGE-SORT)是利用归并的思想事项的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案“修补”在一起,即分而治之)。基本思想:可以看到这种结构很想一颗完全二叉树,本文的归并排序我们采用递归去实现(也可以采用迭代的方式去实现)...原创 2020-01-17 14:40:02 · 292 阅读 · 0 评论 -
数据结构——希尔排序(算法)
基本介绍:希尔排序是希尔(Donald Shell)于1959年提出的一种算法,希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更搞笑的版本,也称为缩小增量排序。基本思想:希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序,随着增量主键减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。希尔排序方式:对有序序列在插入时...原创 2020-01-17 12:24:23 · 239 阅读 · 0 评论 -
数据结构——栈(中缀表达式转前缀表达式)
接上篇数据结构——栈(中缀表达式转后缀表达式)这里再做一个前缀表达式的总结:初始化两个栈:运算符栈S1和储存中间结果的栈S2;从右至左扫描中缀表达式;遇到操作数时,将其压入S2;遇到运算符时,比较其与S1栈顶运算符的优先级:4.1 如果S1为空或栈顶运算符为右括号“)”,则直接将此运算符入栈;4.2 否则,若优先级比栈顶运算符的较高或相等,也将运算符压入S1;4.3 否则,将S1...原创 2020-01-09 12:11:46 · 1010 阅读 · 0 评论 -
数据结构——栈(中缀表达式转后缀表达式)
从左至有扫描表达式,遇到数字时,将数据直接压入栈,遇到操作符时,将栈顶的两个数据取出,进行相应的计算操作,将操作结果再入栈。最终栈中仅存在一个计算结果。代码示例: 中缀表达式→后缀表达式→并计算出表达式结果public class Operation { /*四则运算符优先级规则*/ private final static int ADD = 1; private f...原创 2020-01-08 17:31:00 · 400 阅读 · 0 评论 -
数据结构——单向环形链表
###单向环形链表特点:1、最后一个元素的next域指向第一个元素(first)2、通过中间变量对链表进行遍历,如果中间变量的next域与first相等,证明链表已遍历完毕;3、对节点进行添加,由于first节点是固定不变的,需要借助中间变量进行移动,可将节点添加至链表的任意位置。数据使用类@Datapublic class Person { private int no;...原创 2020-01-07 11:09:08 · 184 阅读 · 0 评论 -
数据结构——双向链表
双向链表最大的特点:每个节点内有两个数据域(指针),一个pre之前该节点的前一个节点,一个next指向该节点的下一个节点(如果为null,则表示该节点为该链表的末端节点)双向链表数据类@Slf4jpublic class DoubleLinkedList { /*头节点,不做存储数据使用*/ private HeroNode2 headNode = new HeroNode...原创 2020-01-06 17:55:09 · 303 阅读 · 0 评论 -
数据结构——稀疏数组
当一个数组中大部分元素为0或者同一个值的数组时,可以使用稀疏数组来保存该数组,稀疏数组的处理方式:1)记录数组一共有几行几列,有多少个不同的值2)把具有不同元素值的元素的行、列及值记录子啊一个小规模的数组中,从而缩小程序的规模以下代码实现二维数组的产生、转变成稀疏数组、稀疏数组存文件、读取文件稀疏数组、恢复成二维数组的过程(绝大多数值以0为例)package com.exam...原创 2019-12-31 11:10:27 · 110 阅读 · 1 评论 -
数据结构——单向链表
单向链表学习总结,import lombok.extern.slf4j.Slf4j;import org.springframework.util.ObjectUtils;import java.util.Stack;/** * @Author 木易三水良 * @Date 2020/1/2 13:29 * @description: */public class Singl...原创 2020-01-03 15:03:05 · 107 阅读 · 0 评论 -
数据结构——环形队列
思路:1、front:指向队列的第一个元素,即array[front]就是队列的第一个元素,front的初始值是0;2、rear:指向队列的最后一个元素的后一个位置,空出一个空间做为约定(实际存储数据会比最大容量小1),rear的初始值是0;3、maxSize:队列的最大容量;4、队列满的条件是:(rear+1)%maxSize == front ;5、队列为空的条件:rear...原创 2019-12-31 15:07:30 · 341 阅读 · 0 评论