摘要:锁原理 AQS 源码分析:有了 synchronized 为什么还要重复造轮子 [toc] 并发编程之美系列目录: 在前两篇文章中,我们主要是分析在并发编程问题上,计算机硬件、操作系统和编程语言分别提供了那些支持: 1. 计算机硬件: CAS 原子操作是基于已有的状态更新成另一个状态,如 count
阅读全文
摘要:Java 算法 跳表:为什么 Redis 一定要用跳表来实现有序集合? [toc] __数据结构与算法之美目录()__ 推荐文章: √《 "Skip Lists: A Probabilistic Alternative to Balanced Trees" 》 "【Redis 源码分析 skipli
阅读全文
摘要:Java 数据结构 HashMap 源码解读:如何设计工业级的散列表 [toc] __数据结构与算法目录()__ 在 "Java 数据结构 散列表原理" 一文中,提到评价一个散列表的标准有三个:散列函数、散列冲突、加载因子(动态扩容)三个指标。那像 HashMap 这样工业级的散列表应该具有哪些特性
阅读全文
摘要:Java数据结构 散列表原理 [toc] __数据结构与算法目录()__ 散列表(Hash table) 也叫哈希表,借助散列函数对数组进行扩展,利用的是数组支持按照下标随机访问元素的特性。散列表两个核心问题是散列函数和散列冲突。散列函数有 MD5、SHA、CRC 等哈希算法。散列冲突开放寻址法和链
阅读全文
摘要:Java 算法 二分法查找 [toc] __数据结构与算法之美目录()__ 二分法查找是一种非常高效的查找方式,时间复杂度为 O(logn)。 唐纳德·克努特(Donald E.Knuth)在《计算机程序设计艺术》的第 3 卷《排序和查找》中说到:"尽管第一个二分查找算法于 1946 年出现,然而第
阅读全文
摘要:Java 排序算法 线性排序:桶排序和基数排序 [toc] __数据结构与算法目录()__ 前面我们介绍了时间复杂度分为 O(n2) 和 O(nlogn) 的排序算法,本文介绍的则是复杂度分为 O(n) 的排序算法:桶排序和基数排序。线性排序时间、空间复杂度分析起来也很简单,但是对要排序的数据要求很
阅读全文
摘要:Java 排序算法 为什么快速排序要比归并排序更受欢迎呢? [toc] __数据结构与算法目录()__ 上一节分析了冒泡排序、选择排序、插入排序这三种排序算法,它们的时间复杂度都是 O(n2),适合小规模数据排序。今天,本文继续分析两种时间复杂度为 O(nlogn) 的排序算法:归并排序和快速排序。
阅读全文
摘要:Java 排序算法 为什么插入排序要比冒泡排序更受欢迎呢 [toc] __数据结构与算法之美目录()__ 对于大多数程序员来说,我们学习的第一个算法,可能就是排序。大部分编程语言中,也都提供了排序函数。在平常的项目中,我们也经常会用到排序。排序算法太多了,有很多可能连名字都没听说过,比如猴子排序、睡
阅读全文
摘要:Java 算法 递归算法 [toc] __数据结构与算法之美目录()__ 递归本质是借助栈的数据结构,加上一个简单的逻辑算法实现。 递归是一种应用非常广泛的算法,很多数据结构和算法都要用到递归,比如 DFS 深度优先搜索、前中后序二叉树遍历等等。所以,搞懂递归非常重要,否则,后面复杂一些的数据结构和
阅读全文
摘要:Java 数据结构 队列 [toc] __数据结构与算法目录()__ 我们今天要讲的数据结构是队列,比如 Java 线程池任务就是队列实现的。 1. 什么是队列 和栈一样,队列也是一种操作受限的线性结构。使用队列时,在一端插入元素,而在另一端删除元素。 1.1 队列的主要特性 队列中的数据元素遵守
阅读全文
摘要:Java 数据结构 栈 [toc] __数据结构与算法之美目录:__ 我们今天要讲的数据结构是栈,比如浏览器的前进后退功能就可以用栈来实现。 1. 什么是栈 栈是一种先进后出的线性存储结构,先进先出就是队列结构。 栈(stack)是限制插入和删除只能在一个位置上进行的线性表,该位置是表的末端,叫作栈
阅读全文
摘要:Java 数据结构 数组 [toc] __数据结构与算法目录()__ 1. 什么是数组 数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。 1. 线性表(Linear List)。顾名思义,线性表就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前
阅读全文
摘要:Java 算法(一)贪心算法 __数据结构与算法目录()__ 一、贪心算法 什么是贪心算法?是指在对问题进行求解时,总是做出当前看来是最好的选择。也就是说,不从整体最优上加以考虑,所得出的结果仅仅是某种意义上的局部最优解。 __因此贪心算法不会对所有问题都能得到整体最优解,但对于很多问题能产生整体最
阅读全文
摘要:Java数据结构 散列表原理 [toc] __数据结构与算法目录()__ 散列表(Hash table) 也叫哈希表,借助散列函数对数组进行扩展,利用的是数组支持按照下标随机访问元素的特性。散列表两个核心问题是散列函数和散列冲突。散列函数有 MD5、SHA、CRC 等哈希算法。散列冲突开放寻址法和链
阅读全文
摘要:Java数据结构和算法(七)B+ 树 __数据结构与算法目录()__ 我们都知道二叉查找树的查找的时间复杂度是 O(logN),其查找效率已经足够高了,那为什么还有 B 树和 B+ 树的出现呢?难道它两的时间复杂度比二叉查找树还小吗?答案当然不是, B 树和 B+ 树的出现是因为另外一个问题,那就是
阅读全文
摘要:Java 数据结构 堆和堆排序:为什么快排比堆排序性能好 [toc] __数据结构与算法目录()__ 关于二叉树这种数据结构在实现软件工程中的应用,前面我们已经介绍了红黑树,下面我们再介绍另一种常见的二叉树 堆。 红黑树:基于平衡二叉查找树的动态数据结构,用于快速插入和查找数据,其时间复杂度都是 O
阅读全文
摘要:Java 数据结构 红黑树:为什么工程中使用的平衡二叉查找树都是红黑树? [toc] __数据结构与算法目录()__ 1. 平衡二叉查找树 平衡二叉树:二叉树中任意一个节点的左右子树的高度相差不能大于 1。 从这个定义来看,完全二叉树、满二叉树其实都是平衡二叉树。常用的平衡二叉查找树的实现有两种:
阅读全文
摘要:Java数据结构和算法(一)线性结构之单链表 单链表的结构如上:最后一个节点的 next=null。下面看一下代码。 __(1) 链表的基本操作__ __(2) 取出中间节点__ 偶数节点取中间两个节点的前一个节点,奇数节点取正中间的节点 __(3) 链表反转__ 测试一把: __(4) 有序链表的
阅读全文
摘要:Java数据结构和算法(一)线性结构 __数据结构与算法目录()__ __线性表__ 是一种逻辑结构,相同数据类型的 n 个数据元素的有限序列,除第一个元素外,每个元素有且仅有个直接前驱,除最后一个元素外,每个元素有且仅有一个直接后继。 一、基本概念 __线性表具有以下特点:__ 元素个数有限 逻辑
阅读全文
摘要:数据结构与算法之美 学习资源推荐 《数据结构与算法分析:Java语言描述》 LeetCode: 数据结构可视化网站: 数据结构可视化网站: 1. [Java数据结构和算法 概述篇] "1.1 Java 数据结构和算法 复杂度分析" [1.2 Java 数据结构和算法 数据结构总结] [1.3 Jav
阅读全文