
数据结构与算法
文章平均质量分 84
数据结构与算法
crazy_xieyi
任何信手拈来的从容,都是厚积薄发的沉淀
展开
-
动态规划之01背包问题和完全背包问题
01背包问题,用二维数组dp[i][j]和一维数组dp[i]来求解,两者有很大区别。在dp数组的含义,dp数组的初始化,以及for循环嵌套顺序以及遍历顺序都是不同的。01背包和完全背包的区别在于,01背包的物品只能使用一次,而完全背包的物品可以无限次使用,所以在遍历顺序上有区别。01背包问题为了每个物品只使用一次,所以倒序遍历背包,而完全背包为正序遍历。因为正序遍历,后一个背包要依赖前一个背包的状态,所以一个物品被加了多次,而倒序遍历,因为前面的背包状态是初始值,所以加了前面的背包状态也是无效。原创 2023-02-13 06:30:00 · 2604 阅读 · 8 评论 -
二叉搜索树之AVL树
左单旋-插入位置在较高右子树的右侧:(parent.bf = 2, cur.bf = 1);右单旋-插入位置在较高左子树的左侧:(parent.bf = -2, cur.bf = -1);左右双旋-插入位置在较高左子树的右侧:(parent.bf = -2, cur.bf = 1);右左双旋-插入位置在较高右子树的左侧:(parent.bf = 2, cur.bf = -1)。一种查询高效且有序的数据结构,而且数据的个数为静态的(即不会改变),可以考虑AVL树,但一个结构经常修改,就不太适合。原创 2023-02-11 06:30:00 · 1205 阅读 · 12 评论 -
浅析哈希源码
解析源码之前的几个疑问?1.HashMap在什么时候开辟的内存?2.不带参数的构造方法,默认哈希表的数组大小是多少?3.HashMap map = new HashMap(19);此时分配的内存是多少?4.一般地,哈希表示数组+链表的方法进行存储,在满足什么条件的时候链表会变成树?5.当HashMap扩容的时候需要注意什么?6.hashcode与equals的区别?原创 2022-11-07 09:46:53 · 692 阅读 · 28 评论 -
数据结构之哈希表
虽然哈希冲突是必然的,但是冲突率是不高的,哈希表复杂度是O(1) 。 java 中利用哈希表实现的 HashMap 和 HashSet。java 中使用的是哈希桶方式解决冲突的。java 会在冲突链表长度大于一定阈值后,将链表转变为搜索树(红黑树)。 java 中计算哈希值实际上是调用的类的 hashCode 方法,进行 key 的相等性比较是调用 key 的 equals 方法,自定义类作为 HashMap 的 key 或者 HashSet 的值,必须重写hashCode 和 equals 方法。原创 2022-11-05 08:52:39 · 833 阅读 · 34 评论 -
数据结构之Map&Set
Map和set是一种专门用来进行搜索的容器或者数据结构,Map和Set是一种适合动态查找的集合容器。其中TreeMap和TreeSet集合背后的数据结构就是搜索树,红黑树。其中TreeSet底层就是一个TreeMap。一般把搜索的数据称为关键字(Key),和关键字对应的称为值(Value),将其称之为Key-value的键值对,所以模型会有两种:1. 纯 key 模型2. Key-Value 模型而Map中存储的就是key-value的键值对,Set中只存储了Key。原创 2022-11-03 08:38:54 · 1331 阅读 · 36 评论 -
数据结构之二叉搜索树
数据结构之二叉搜索树:一、概念二、查找操作三、插入操作四、删除操作五、自实现六、性能分析原创 2022-11-01 08:55:04 · 604 阅读 · 31 评论 -
常见八大排序算法
八大常见排序算法:一、直接插入排序二、希尔排序三、选择排序四、堆排序五、冒泡排序六、快速排序1.递归实现2.非递归实现七、归并排序1.递归实现2.非递归实现八、计数排序目前上述几种排序算法,只有直接插入排序、冒泡排序、归并排序和计数排序是稳定的。原创 2022-10-30 10:15:07 · 755 阅读 · 48 评论 -
八大常见排序算法
八大常见排序算法:一、直接插入排序二、希尔排序三、选择排序四、堆排序五、冒泡排序六、快速排序1.递归实现2.非递归实现七、归并排序1.递归实现2.非递归实现八、计数排序原创 2022-10-28 08:58:36 · 323 阅读 · 16 评论 -
数据结构之堆的应用
JDK1.8中的PriorityQueue底层使用了堆的数据结构,用堆作为底层结构封装了优先级队列。一、Top-k问题 1.前K个最小数(第k个最小数) 2.前K个最大数(第K个最大数)二、堆排序1.从小到大排序(建大根堆)2.从大到小排序(建小跟堆)原创 2022-10-26 08:30:44 · 686 阅读 · 35 评论 -
数据结构之堆
PriorityQueue底层使用了堆的数据结构,而堆实际就是在完全二叉树的基础之上进行了一些元素的调整。一、堆是什么?二、堆的存储方式是什么?三、堆是怎么创建的?四、建堆的时间复杂度是多少?五、堆是怎么进行插入和删除元素的?六、用堆模拟实现优先级队列原创 2022-10-24 08:19:20 · 671 阅读 · 42 评论 -
数据结构之PriorityQueue源码及特性分析 (大小根堆转换、扩容)
PriorityQueue源码分析: 1. 小跟堆源码分析 2.PriorityQueue默认是小堆,如何变成大根堆呢? 3. Integer数据类型是如何变成大根堆的?(自实现比较器) 4. PriorityQueue扩容的源码分析Java集合框架中提供了PriorityQueue和PriorityBlockingQueue两种类型的优先级队列,PriorityQueue是线程不安全的,PriorityBlockingQueue是线程安全的。原创 2022-10-22 08:59:58 · 1823 阅读 · 42 评论 -
数据结构之二叉树
一、二叉树相关概念二、二叉树的性质三、二叉树的基本操作 1.前序遍历 2.中序遍历 3.后序遍历 4.层序遍历 5.获取树中节点的个数 6.获取叶子节点的个数 7.获取第K层节点的个数 8.获取二叉树的高度 9.检测值为value的元素是否存在 10.判断一棵树是不是完全二叉树原创 2022-10-04 08:26:40 · 975 阅读 · 41 评论 -
数据结构之队列
队列只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出的特点,进行插入操作的一端称为队尾,进行删除操作的一端称为队头 。Queue是个接口,在实例化时必须实例化LinkedList的对象,因为LinkedList实现了Queue接口。在Java中,Queue是个接口,底层是通过双向链表实现的。使用单链表模拟实现队列、用数组模拟实现循环队列。原创 2022-10-02 09:21:33 · 1334 阅读 · 40 评论 -
数据结构之链表(LinkedList详解)
LinkedList实现了List接口;LinkedList的底层使用了双向链表;LinkedList没有实现RandomAccess接口,因此LinkedList不支持随机访问; LinkedList的任意位置插入和删除元素时效率比较高,时间复杂度为O(1);ArrayList实质是顺序表,底层是一个数组。LinkedList实质是一个链表。ArrayList顺序表在物理上和逻辑上都是连续的,但是在扩容的时候,可能会造成空间的浪费。而LinkedList在物理上不一定是连续的,在逻辑上是连续的。原创 2022-09-29 08:07:24 · 9297 阅读 · 35 评论 -
ArrayList详解及扩容源码分析
ArrayList在调用不带参数的构造方法时,第一次add的时候,默认容量才是10。而且是按照1.5倍的速度进行扩容。ArrayList底层是使用数组来存储元素的,由于其底层是一段连续空间,当在ArrayList任意位置插入或者删除元素时,就需要将后序元素整体往前或者往后搬移,时间复杂度为O(n),效率比较低,因此ArrayList不适合做任意位置插入和删除比较多的场景。而且,在扩容之后,可能会带来空间的浪费。ArrayList适合在给定了下标位置的情况下进行查找元素,此时时间复杂度可以达到O(1)。原创 2022-09-27 08:11:55 · 1518 阅读 · 31 评论 -
包装类详解(装箱(包)、拆箱(包)、Integer类型缓存)
在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类型。Integer类型把[-128~127]的数据缓存了,这个范围的数据直接取出,不需要新new对象。原创 2022-09-25 08:40:38 · 1708 阅读 · 22 评论 -
对集合、复杂度以及泛型的认识
Java 集合框架 Java Collection Framework ,又被称为容器 container ,是定义在 java.util 包下的一组接口 interfaces 和其实现类 classes 。从两个维度评价一个算法的好坏。时间复杂度:估算程序指令的执行次数(执行时间);空间复杂度:估算所需占用的存储空间。我们一般用大O表示法来描述复杂度。泛型是在JDK1.5引入的新的语法,通俗讲,泛型就是适用于许多许多类型。从代码上讲,就是对类型实现了参数化。原创 2022-09-22 08:38:27 · 1787 阅读 · 52 评论 -
数据结构之栈(使用、自实现、应用及栈与虚拟机栈和栈帧的区别)
栈是一种特殊的线性表,只能在一端进行操作。往栈中添加元素的操作,一般叫做push,入栈。从栈中移除元素的操作,一般叫做pop,出栈(只能移除栈顶元素,也叫做弹出栈顶元素)。遵循先进后出,后进先出的原则。栈的底层是数组。栈的自实现(数组、单链表、双向链表)。栈的应用(浏览器的前进后退、根据逆波兰表达式求值)。栈、虚拟机栈、栈帧之间的区别。原创 2022-08-08 12:28:21 · 672 阅读 · 34 评论 -
数据结构之双向链表
使用双向链表是可以提升链表的综合性能的。双向链表与单向链表的对比,双向链表与动态数组的对比。原创 2022-08-04 10:48:38 · 405 阅读 · 12 评论 -
数据结构之单链表自实现
动态数组有一个很明显的缺点,就是可能会造成内存空间的大量浪费。那么能否做到用到多少内存就申请多少内存呢?那么链表就可以办到这一点。链表是一种链式存储的线性表,所有元素的内存地址不一定是连续的。数据结构和算法动态可视化(Chinese)-VisuAlgo给大家推荐一个神奇的网站,就是上面这个数据结构和算法动态可视化,用起来非常爽,可以帮助大家进一步的理解数据结构和算法。httpshttpshttps。......原创 2022-08-01 20:01:46 · 222 阅读 · 15 评论 -
线性表之动态数组(ArrayList)的自实现
动态数组(ArrayList)的自实现。引入了泛型,使得自实现的动态数组可以存放任何类型的数据,也介绍了一些内存管理上的小细节问题。原创 2022-07-31 20:37:00 · 364 阅读 · 15 评论 -
什么是数据结构?
什么是数据结构?数据结构是计算机存储、组织数据的方式,具体的有:数组、链表、栈、队列、哈希表、二叉树、AVL树、红黑树、B树、堆、Tire、哈夫曼树、并查集、图等,在实际应用中,可以根据使用场景来选择最合适的数据结构。...原创 2022-07-31 13:19:04 · 2793 阅读 · 6 评论 -
如何评价一个算法的好坏?-复杂度
大O表示法来描述复杂度,需要忽略常数、系数和低阶。O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)。用尽量小的存储空间,用尽量少的执行步骤。第64个斐波那契数(n=64),用O(n)计算大约耗时6.4*10^(-8)秒,用O(2^n)计算大约耗时584.94年。...原创 2022-07-29 19:29:19 · 519 阅读 · 4 评论