最后释放的时候应该是唤醒小于等于0的节点吧
深入浅出java同步器AQS简书 占小狼转载请注明原创出处,谢谢! 前言 在java.util.concurrent.locks包中有很多Lock的实现类,常用的有ReentrantLock、ReadW...
最后释放的时候应该是唤醒小于等于0的节点吧
深入浅出java同步器AQS简书 占小狼转载请注明原创出处,谢谢! 前言 在java.util.concurrent.locks包中有很多Lock的实现类,常用的有ReentrantLock、ReadW...
图是一种非线性结构,其示意图如下图所示 图的几个概念 图中的每个元素被称为顶点(vertex) 顶点和顶点之间的连线称为边(edge) 每个顶点上相连的边数被称为度(degr...
在了解过堆的基础知识之后,我们看下堆排序堆排序是指将给定的一串数据通过建堆之后再排序输出的过程。可以大致分为建堆和排序两个大步骤 建堆 建堆是指将给定数组原地按找堆的要求排列...
堆是一种特殊的树,那么堆有什么样的特点呢? 堆是一颗完全二叉树 堆必须满足其任意节点都要大于等于(或小于等于)其左右子节点(大于等于还是小于等于取决于要构建一个大顶堆还是小顶...
红黑树是平衡二叉查找树的一种,所以在讲红黑树之前,我们要先了解下什么是平衡二叉查找树。首先我们知道什么是二叉查找树,二叉查找树在极端情况下,可能会变成链表,这个时候就需要平衡...
二叉查找树是二叉树中比较常见且常用的类型,也叫二叉搜索树。二叉查找树要求二叉树中的任意一个节点满足以下要求 左子树中的每个节点的值都小于该节点 右子树中的每个节点的值都大于该...
在学习二叉树之前,我们需要先知道什么是树? 树 树这个数据结构其实很有意思,因为他就是一颗倒挂的树。肯定有很多人都玩过蚂蚁森林,种过梭梭树,数据结构中的树结构其实就很像梭梭树...
散列表(Hash Table)也称哈希表,散列表用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,由数组演化而来。 散列函数 散列表的核心就是散列函...
经典的二分查找很好理解,也很好实现,那一起来看下二分查找的变形问题。常见的二分查找变形问题有: 查找第一个等于待查找值的元素下标 查找最后一个等于待查找值的元素下标 查找第一...
二分查找(Binary Search)也叫折半查找,是一种日常生活中也很常见的查找方式。 举个生活中的小例子,我女朋友很喜欢让我猜她买的东西的价格。比如一个商品,肉眼估值大概...
我们知道快速排序在最坏情况下的时间复杂度是O(n^2),那有没有办法优化它呢? 最坏情况的影响因素 我们知道,快速排序的时间复杂度其实和分区点的位置有关的,如果每次分区点都在...
快速排序简称快排,它的核心思想也是分治,但是和归并完全不一样。 快排的执行逻辑是这样的: 随机指定给定数组的任意一个元素p(经典快排是选择最后一个元素),以该元素为分区点。 ...
什么是归并排序 归并排序的核心思维就是分治,分而治之。将大问题分解成小问题,解决完小问题,大问题也就解决了。眼熟吗?没错,和递归的思想很相似,所以归并排序一般也是用递归实现的...
什么是冒泡排序 冒泡排序的特点是每次都是相邻的两个数进行比较,是一个比较简单的排序算法其实现如下 冒泡排序是稳定排序吗? 从代码中我们可以看出,相邻的两个元素相等时,我们是不...
如何分析排序算法 从时间角度看1.1 需要考虑最好情况、最坏情况、平均情况的时间复杂度我们分析排序算法,从时间角度分析的话,需要分析最好情况、最坏情况、平均情况的时间复杂度。...
递归是我最开始接触编程时候的噩梦,还记得当时被c语言书上的斐波那契数列支配的恐怖。。。 什么是递归 递归是一种很常见且常用的编程技巧,利用递归,我们可以把大问题拆解成若干个小...
队列其实和栈的特性刚好相反,队列是先进先出的,这个特性很容易就想到排队。 队列的基本操作 入队(enqueue),即从队尾插入一个元素 出队(dequeue),即从队首取出一...
栈是一种很有意思的数据结构,它的特点是先入后出。大家可以想象一下弹夹,先被压入弹夹的子弹反而会后射出。 栈的特点 先入后出 只能从一端入栈或出栈 栈的构造 可以看出不管是入栈...