数据结构
文章平均质量分 96
bugcode.online
路漫漫其修远兮,吾将上下而求索!
展开
-
ConcurrentHashMap源码解析
1. ConcurrentHashMap 1.7不使用HashMap是因为在多线程情况下会形成环形数据结构,不使用HashTable是因为使用的是重量级锁,效率比较低。segment在jdk1.7中是分段锁,在jdk1.8中没有segment对象1. 存储结构Java 7 中 ConcurrentHashMap 的存储结构如上图,ConcurrnetHashMap 由很多个 Segment 组合,而每一个 Segment 是一个类似于 HashMap 的结构,所以每一个 HashMap 的内部可转载 2021-09-01 14:25:46 · 515 阅读 · 0 评论 -
数据结构-选择排序(简单选择排序,堆排序)
目录1,简单选择排序1.1,简单选择排序思想1.2,选择排序的时间复杂度分析1.3,简单选择排序代码实现2,堆排序2.1,什么是堆排序2.2,堆排序的思想2.3,堆排序时间复杂度分析2.4,代码实现1,简单选择排序1.1,简单选择排序思想选择排序(Selection sort)是一种简单直观的排序算法。 简单选择排序算法的比较次数和初始的序列排列顺序无关。 它的基本思想是:首先在未排序的数列中找到最小(or最大)元素,然后将其存放到数列的起始位置;接着,.原创 2020-12-09 09:24:18 · 2111 阅读 · 0 评论 -
字符串匹配KMP算法
1,什么是字符串匹配假设现在随机输入一个长度为m的主串T,另外输入一个长度为n(n≤m)的字符串P,我们来判断字符串P是否是主串T的一个子串(即能否从T中随机取出与P同长的一段字符串,与P完全匹配)。这就是字符串问题的简单描述。1.1,蛮力法匹配蛮力法的思想:假设我们把子串和主串从第一个位置开始逐个字符进行匹配,如果相匹配的字符发现相等,也就是P[i]=T[j],那么我们就另i++,j++,逐个字符向后面进行匹配,但是如果P[i]!=T[j]的话,我们就重新设置j=0,i=i-j+1,重新开始匹原创 2020-12-07 11:23:04 · 989 阅读 · 1 评论 -
剑指Offer-数组去重
1,查找数组中的重复数字题目描述:1.1,思路一这个题目是一道简单题目,最容易想到的是对数组中的元素一趟排序操作,然后在扫描一趟数组,就可以查找出重复的元素。但是这样的话排序是这里面最耗时间的地方,排序一个长度为n的数组的时间复杂度是o(nlogn)。代码实现:/** * 排序方法查找数组中的重复元素 * @param arr 待排序数组 * @return 查找到重复元素就返回,否则返回-1 */ public static int dupli原创 2020-12-05 20:28:22 · 548 阅读 · 0 评论 -
ArrayList源码解读
目录1,ArrayList的简介2,ArrayList的源码分析2.1,ArrayList的数据结构2.2,类中的属性2.2,ArrayList的构造函数2.3,核心方法2.3.1,add()方法2.3.2,add(int index, E element),在特定位置添加元素2.3.3,remove(int)方法2.3.4,remove(Object)2.3.5,clear()方法2.3.6,indexOf(Object o),查找某一个对象的下标索引2原创 2020-11-23 08:26:55 · 515 阅读 · 0 评论 -
HashTable1.8源码解读
目录1,哈希表的简介1.1,HashTable的构造函数1.2,HashTable的属性说明1.3,HashTable的PAI2,HashTable的数据结构2.1,HashTable的内部类2.2,HashTable中重要方法分析2.2.1,put()方法2.2.2,addEntry()方法2.2.3,rehash()方法2.2.4,get()方法2.2.5,remove()删除元素方法2.3,哈希别中其他方法说明2.3.1,clear()方法2原创 2020-11-20 13:40:31 · 586 阅读 · 2 评论 -
数据结构-插入排序(直接插入排序,二分插入排序,希尔排序)
1,插入排序思想插入排序是一种简单直观的排序方法,其基本思想是每次将一个待排序的记录按其关键字大小插入到前面己排好序的子序列中,直到全部记录插入完成。由插入排序的思想可以引申出三个重要的排序算法:直接插入排序、折半插入排序和希尔排序。2,直接插入排序2.1,直接插入排序根据上面的插入排序思想,不难得出一种最简单也最直观的直接插入排序算法。假设在排序过程中,待排序表L [1...n ] 在某次排序过程中的某一时刻状态如下:有序序列L[1,2.........i-1] L(i)原创 2020-11-16 09:28:35 · 1178 阅读 · 0 评论 -
数据结构-(2-3树,2-3-4树,B-树,B+树)
目录1,二叉树存在问题分析2,多叉树B树的介绍2.1,2-3树和2-3-4树的介绍2.2,B树的查找2.3,B树的创建和插入2.4,B树的删除3,B+树3.1,m 阶的B+树与m阶的B树的主要差异1,二叉树存在问题分析虽然我们说二叉排序树,平衡二叉树的查找操作效率较高,但是也存在问题, 请看下面的二叉树。二叉树需要加载到内存的,如果二叉树的节点少,没有什么问题,但是如果二叉树的节点很多(比如1亿), 就存在如下问题: 问题1:在构建二叉树时,需要多次进行i/原创 2020-11-16 09:26:35 · 2258 阅读 · 0 评论 -
数据结构-平衡二叉树(AVL树)
目录1,平衡二叉树的介绍1.1,二叉排序树存在的问题1.2,平衡二叉树1.3,平衡二叉树的创建1.4,平衡二叉树的查找2,代码实现2.1,平衡二叉树的节点类型2.2,LL旋转(单右旋转)2.3,RR旋转(单左旋转)2.4,向avl树中添加一个节点2.5,求左右子树的高度2.6,求平衡二叉树的高度2.7,中序遍历二叉树2.8,创建一颗平衡二叉树3,测试代码1,平衡二叉树的介绍1.1,二叉排序树存在的问题在介绍平衡二叉树之前,我们先来看看.原创 2020-11-15 15:13:00 · 2800 阅读 · 1 评论 -
数据结构-二叉排序树(BST树)
1,二叉排序树介绍二叉排序树(Binary Sort Tree)或者是一颗空树;或者是具有如下性质的二叉树:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树又分别为二叉排序树。显然二叉排序树的定义是一个递归形式的定义,所以后面景禹要讲的插入、查找和删除都是基于递归的形式。特别说明:如果有相同的值,可以将该节点放在左子节点或右子节点1.1,二叉排序树的构建假设我们有初始的无序...原创 2020-11-15 11:44:50 · 10067 阅读 · 2 评论 -
数据结构-红黑树原理
目录1,R-B-Tree的简介1.1,红黑树的特性2,红黑树的基本操作(一) 左旋和右旋和变色2.1,红黑树的基本操作(二) 添加2.2,红黑树的基本操作(三) 删除2.2.1,删除小结2.2.2,删除案例1,R-B-Tree的简介R-B Tree,全称是Red-Black Tree,又称为“红黑树”,红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。红黑树本质上是一种二叉查找树,但它在二叉查找树的基础上额外添加了一个标记(颜色),同时具有原创 2020-11-15 11:05:55 · 476 阅读 · 0 评论 -
HashMap1.7源码解读分析(一)
1,HashMap的使用声明一个HashMap集合。 向结合中添加元素,以键值对的形式。 获取集合中的某一个元素。 遍历结合元素(三种方式)。public class TestHashMap { public static void main(String[] args) {// 1 声明一个HashMap对象 Map<String,Integer> hashMap=new HashMap<String, Integer>();原创 2020-11-13 16:51:37 · 381 阅读 · 0 评论 -
赫夫曼编码(Java版)
目录1,赫夫曼树的介绍1.1,为什么会需要赫夫曼树1.2,赫夫曼树的构建1.3,字符传输案例2,创建赫夫曼编码2.1,赫夫曼树的节点类型2.1,将字节数组转换为赫夫曼树的节点类型2.2,创建一棵赫夫曼树2.3,构建赫夫曼编码表2.4,压缩数据2.5,压缩数据方法封装2.6,遍历操作2.7,解压缩2.7.1,将byte转换为字符串2.7.2,解压缩操作3,文件压缩3.1,文件压缩3.2,文件解压缩4,测试代码1,赫夫曼树的介绍原创 2020-11-11 12:14:27 · 1206 阅读 · 1 评论 -
Java集合系列-Collection&Map(一)
目录1,Java集合概要2,Collection接口的介绍3,List接口介绍4,Set集接口介绍5,AbstractCollection抽象类介绍6,AbstractList抽象类介绍7,AbstractSet抽象集介绍8,Iterator迭代器接口介绍9,ListIterator子接口介绍1,Java集合概要Collection是一个接口,Collection下面主要有三个接口分支,List,Set,Queue。 为了方便,我们抽象..原创 2020-11-10 11:56:39 · 396 阅读 · 0 评论 -
数据结构-二叉树(一 链式存储)(Java版)
目录1,二叉树的介绍1.1,树的定义1.2,概念解释2,二叉树2.1,二叉树的特点2.2,二叉树的性质2.3,斜树2.4,满二叉树2.5,完全二叉树3,二叉树的实现3.1,二叉树的节点类型3.2,二叉树遍历操作(递归实现)3.2.1,前序遍历递归实现3.2.2,中序遍历递归实现3.2.3,后序遍历递归实现3.3,二叉树的遍历操作(非递归实现)3.3.1,前序遍历非递归实现3.3.2,中序遍历非递归实现3.3.3,后序遍历非递归实现.原创 2020-11-07 11:37:44 · 493 阅读 · 0 评论 -
数据结构-查找算法(Java版)
目录1,查找算法概述1.1,查找算法的分类1.2,查找的性能衡量指标-平均查找长度(Average Search Length,ASL)1.3,查找性能2,查找算法实现2.1,顺序查找2.1.1,顺序查找复杂度分析2.1.2,代码实现2.2,二分查找算法2.2.1,复杂度分析2.2.2,二分查找代码实现2.2.3,算法改进2.3,插值查找算法2.3.1,代码实现2.4,斐波那契(黄金分割法)查找算法2.4.1,斐波那锲查找算法原理2.4..原创 2020-11-06 21:52:29 · 720 阅读 · 0 评论 -
数据结构-哈希表(Java版)
目录1,什么是哈希表1.1,如何解决哈希碰撞问题1.2,哈希表有什么优势呢?2,链表的实现2.1,哈希表中的节点类型2.2,链表的定义2.2.1,链表的节点定义2.2.2,向链表末尾添加一个元素2.2.3,在链表中查找一个元素2.2.4,在链表中删除一个元素2.2.5,打印链表3,哈希表的实现3.1,定义一个哈希表3.2,向哈希表中添加一个元素3.3,获取元素索引3.4,哈希表的遍历3.5,在哈希表中查找一个元素3.6,在哈希表中删除一原创 2020-11-06 20:50:20 · 287 阅读 · 0 评论 -
数据结构-循环链表(三)(Java版)
目录1,什么是循环链表2,循环链表的实现2.1,循环链表节点的定义2.2,循环链表的实现2.2.1,定义一个循环链表2.2.2,向循环链表末尾添加一个元素2.2.3,打印循环链表2.2.4,根据元素值删除循环链表中的一个节点2.2.5,约瑟夫环问题的实现1,什么是循环链表循环链表是一种链式存储结构,它的最后一个结点指向头结点,形成一个环。因此,从循环链表中的任何一个结点出发都能找到任何其他结点。下面使用一张说明什么是循环链表:循环链表在逻辑上形成的是一个环,是原创 2020-11-06 20:18:33 · 441 阅读 · 0 评论 -
数据结构-双向链表(二)(Java版)
目录1,什么是双向链表?2,双向链表的实现2.1,双向链表的节点类型2.2,双向链表的实现2.2.1,定义一个双向链表2.2.2,向双向链表的末尾插入一个元素2.2.3,向双向链表的头添加一个元素2.2.4,根据索引向双向链表中任意一个位置插入一个元素2.2.5,根据元素值删除双向链表中的一个节点2.2.6,遍历双向链表1,什么是双向链表?双向链表(double linked list)是在单链表的每个结点中,再设置一个指向其前驱结点的指针。所以在双向链表中.原创 2020-11-06 19:39:24 · 341 阅读 · 0 评论 -
数据结构-单链表(一)(Java版)
目录1,什么是单链表?2,单链表的实现2.1,单链表的节点类型2.2,单链表的实现2.2.1,定义一个单链表2.2.1,头插法插入一个节点2.2.2,采用尾插法插入一个节点2.2.3,删除单链表中的一个节点2.2.4,打印出一条单链表3,关于单链表面试题目简单练习3.1,查找单链表中第k个节点3.2,单链表的反转3.3,从尾到头打印单链表3.4,合并两个有序的单链表3.5,单链表的小结1,什么是单链表?单链表 [LinkedList]:由各原创 2020-11-06 17:44:31 · 190 阅读 · 0 评论 -
数据结构-交换排序(冒泡算法,快速排序)
1,冒泡排序思想冒泡算法是一种基于交换思想的排序算法,算法每次都和相邻的两个元素比较,把比较结果比较大的哪一个元素逐渐的交换到最后的位置,经过n-1趟比较后,整个序列有序。可以看到,冒泡算法的每一趟排序都有一个元素被放到最终的位置,下面我们通过一个例子看看冒泡排序的过程。2,冒泡排序过程分析首先看我们的原始数据,每次都把前面的一个元素和后面的一个元素比较,如果前面元素小于后面元素,不发生交换,如果前面元素大于后面元素,就发生交换,直到遍历完所有的元素,此时我们的第一趟排序完成,从结果来看,我原创 2020-10-28 12:20:38 · 913 阅读 · 0 评论 -
队列(java版)
1,什么是队列队列是一个有序列表,可以用数组或是链表来实现。 遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出,只允许在一端进行插入操作,而在另一端进行删除操作的线性表。 队列是一种先进先出(First in First Out)的线性表,简称FIFO。允许插入的一端称为队尾,允许删除的一端称为队头。假设队列是q=(a1,a2,…,an),那么a1就是队头元素,而an是队尾元素。这样我们就可以删除时,总是从a1开始,而插入时,列在最后。这也比较符合我们通常生活中的习惯,排在第一个原创 2020-10-24 17:21:50 · 237 阅读 · 0 评论 -
算法分析——分治策略
1 分治策略概念分治法是讲一个复杂的问题分成两个或者更多的相同或者相似的问题,这些子问题相互独立或者形式相同,再把子问题分解成更小的子问题,一直这样循环下去,直到最后子问题可以简单的直接求解,原问题的解即子问题解得合并。例1.1给定一个顺序表,编写一个求出其最大值与最小值的分治算法。分析:假设我们的数据按顺序的存放在一个整型数组中,如果数组大小为1,那么就可以直接给出结果,如果大小...原创 2018-11-02 12:17:06 · 608 阅读 · 0 评论 -
数据结构-归并排序
1,二路归并排序设计思路与快速排序一样,归并排序也是基于分治策略的排序,(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。归并排序将待排序的元素分成两个长度相等的子序列,分别为每一个子序列排序,然后把子序列合并成一个总的序列。合并两个子序列的过程称为二路归并。(注:二路归并算法是一种稳定排序算法,他的运...原创 2018-10-19 14:51:07 · 5970 阅读 · 0 评论 -
数据结构-线性表(链表)(c++版)
目录1,单链表的基本概念与特点2, 单链表的特点3,单链表的结构定义及其方法的实现 3.1 单链表结构的定义3.2方法的基本实现3.3 单链表的插入删除操作讲解3.4 单链表的删除算法3.5 单链表的顺序访问与尾递归3.6 尾插法建立单链表(递归方法实现)3.7 头插法建立单链表(递归实现)3.8 非递归算法实现链表的头插法和尾插法1,...原创 2018-09-30 22:35:06 · 676 阅读 · 0 评论 -
数据结构-线性表(顺序表)(c++版)
目录1,顺序表的基本概念及特点:1.1静态存储:1.2动态存储表示2,顺序表的基本操作(动态)3,顺序表的应用演示:3.1 集合的并运算,合并集合LA与LB,结果存于LA中,重复元素只留一个。3.2 求顺序表LA与LB中公共的元素,结果存于LA中1,顺序表的基本概念及特点:1,把线性表中元素按照其逻辑顺序依次存储在一块连续的存储空间中,就得到了顺序表,它是用一维...原创 2018-09-02 15:43:34 · 421 阅读 · 0 评论