
数据结构
文章平均质量分 55
学习笔记
阿瞒有我良计15
这个作者很懒,什么都没留下…
展开
-
二叉树详解
树结构相对线性表就比较复杂了,要存储表示起来就比较麻烦了,实际中树有很多种表示方式,如:双亲表示法,孩子表示法、孩子兄弟表示法等等。上图给出了几种特殊的二叉树形态,从左往右依次是:空树、只有根节点的二叉树、节点只有左子树、节点只有右子树、节点的左右子树均存在,一般二叉树都是由上述基本形态结合而形成的。比如:假设一棵完全二叉树中总共有1000个节点,则该二叉树中_____个叶子节点,_____个非叶子节点,_____个节点只有左孩子,_____个只有右孩子。原创 2023-07-21 19:14:45 · 93 阅读 · 0 评论 -
动态规划(刷题)
定义:动态规划是分治思想的延伸,通俗一点来说就是大事化小,小事化无的艺术。在将大问题化解为小问题的分治过程中,保存对这些小问题已经处理好的结果,并供后面处理更大规模的问题时直接使用这些结果。答案一:使用递归(通过不了,因为这道题考的就不是递归,递归复杂度高,所以要用动态规划思想来做)动态规划的本质,是对问题状态的定义和状态转移方程的定义(状态以及状态之间的递推关系)适用场景:最大值/最小值, 可不可行, 是不是,方案个数。答案三:对答案二做空间上的优化。答案:好难,没理解,痛苦。答案二:(优化算法)原创 2023-07-01 15:01:17 · 214 阅读 · 0 评论 -
栈和队列详解
2.将中缀表达式转为后缀表达式,输入a + b* c / d - a + f / b 输出 a b c * d / + a - f b / +队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。从左往右先乘除后加减,加括号把每个括号里面对应的运算符都移到对应的括号后边去除掉所有的括号,结果就是后缀表达式。从左往右先乘除后加减,加括号把每个括号里面对应的运算符都移到对应的括号后边去除掉所有的括号,结果就是后缀表达式。原创 2023-07-20 22:17:20 · 85 阅读 · 0 评论 -
集合框架及背后的数据结构
1.hashset实现了set接口,它不允许集合中出现重复元素,当我们提到hashset的时候,第一件事就是在将对象存储在hashset之前,要确保重写hashCode()方法和equals方法,这样才能比较对象的值是否相等,确保集合中没有存储相同的对象,如果不重写上述两个方法,那么将使用下面方法默认实现:public boolean add(Object obj)方法用在Set添加元素时,如果元素值重复时返回“false”,如果添加成功则返回"true".若equals()不相等则认为他们不相等。原创 2023-03-03 20:13:57 · 726 阅读 · 0 评论 -
快速排序.
【代码】快速排序.原创 2023-03-02 17:33:08 · 119 阅读 · 1 评论 -
选择排序.
【代码】选择排序.原创 2023-03-01 11:53:55 · 67 阅读 · 0 评论 -
计数排序.
【代码】计数排序.原创 2023-02-28 22:57:40 · 228 阅读 · 0 评论 -
希尔排序.
【代码】希尔排序.原创 2023-02-28 20:54:16 · 66 阅读 · 0 评论 -
插入排序.
【代码】插入排序。原创 2023-02-28 20:49:29 · 70 阅读 · 0 评论 -
阻塞式队列-生产者消费者模型
比如过年一家人一起包饺子. 一般都是有明确分工, 比如一个人负责擀饺子皮, 其他人负责包. 擀饺子皮的人就是 "生产者", 包饺子的人就是 "消费者".擀饺子皮的人不关心包饺子的人是谁(能包就行, 无论是手工包, 借助工具, 还是机器包), 包饺子的人也不关心擀饺子皮的人是谁(有饺子皮就行, 无论是用擀面杖擀的, 还是拿罐头瓶擀, 还是直接从超市买的)并且A需要知道B提供的接口是什么.B也得知道A是通过啥方式来调用的~~(耦合比较强)如果A收到的请求突然暴增了,此时B收到的请求也会暴增!原创 2023-02-10 14:49:30 · 474 阅读 · 0 评论 -
LRUCache详解
Cache的容量有限,因此当Cache的容量用完后,而又有新的内容需要添加进来时, 就需要挑选并舍弃原有的部分内容,从而腾出空间来放新内容。其实,LRU译成最久未使用会更形象, 因为该算法每次替换掉的就是一段时间内最久没有使用过的内容。实现LRU Cache的方法和思路很多,但是要保持高效实现O(1)的put和get,那么使用双向链表和哈希表的搭配是最高效和经典的。LRU是Least Recently Used的缩写,意思是最近最少使用,它是一种Cache替换算法。原创 2022-12-25 10:52:13 · 8186 阅读 · 0 评论 -
并查集详解
某公司今年校招全国总共招生10人,西安招4人,成都招3人,武汉招3人,10个人来自不同的学校,起先互不相识,每个学生都是一个独立的小团体,现给这些学生进行编号:{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};编号为4和9的同学属于1号小分队,该小分队有3人(包含队长1),编号为3和5的同学属于2号小分队,该小分队有3个人(包含队长1)。西安学生小分队s1={0,6,7,8},成都学生小分队s2={1,4,9},武汉学生小分队s3={2,3,5}就相互认识了,10个人形成了三个小团体。原创 2022-12-24 14:00:45 · 733 阅读 · 0 评论 -
海量数据处理
和第二种解法一样,都能用0,1标识出现几次,这属于编码细节了,总体思路就是原来能表示8个数据,现在用俩个比特位标识。把数字哈希到对应的小文件当中,一样的数字肯定是在一起的,遍历每个小文件,统计数字出现的次数,此时,在内存中就能够知道,哪个数字出现了一次。用俩个bitSet,00代表0次,01代表1次,10代表2次,11代表多次,和第二题解法一样。2.遍历A文件的第一个文件,将第一个文件数据读取出来,存放到bitSet当中。3.遍历B文件的第一个文件,每次读取一个数据,看bitSet中,之前是否存在。原创 2022-12-23 20:20:40 · 1014 阅读 · 0 评论 -
布隆过滤器
布隆过滤器的误判是指多个输入经过哈希之后在相同的bit位置1了,这样就无法判断究竟是哪个输入产生的,因此误判的根源在于相同的 bit 位被多次映射且置 1。布隆过滤器是由布隆(Burton Howard Bloom)在1970年提出的 一种紧凑型的、比较巧妙的概率型数据结构,特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”,它是用多个哈希函数,将一个数据映射到位图结构中。1. 增加和查询元素的时间复杂度为:O(K), (K为哈希函数的个数,一般比较小),与数据量大小无关。原创 2022-12-23 12:15:07 · 1035 阅读 · 0 评论 -
位图详解.
给40亿个不重复的无符号整数,没排过序。40亿个整数存放160亿个字节,用到位图只需要4 000 000 000 / 8 个字节。数据是否在给定的整形数据中,结果是在或者不在,刚好是两种状态,那么可以使用一个二进制比。特位来代表数据是否存在的信息,如果二进制比特位为1,代表存在,为0代表不存在。海量数据,整数,数据无重复的场景。也就是说,我用476兆就能把40亿个数据表示出来,这就是位图的作用。10个整数本应该存放40个字节,用到位图只需要3个字节。面临同样的问题,电脑的运行内存16个G,放不下。原创 2022-12-22 15:56:07 · 548 阅读 · 0 评论 -
红黑树详解
1.概念红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。2.性质最长路径最多是最短路径的2倍每个结点不是红色就是黑色根节点是黑色的如果一个结点是红色的,则它的俩个孩子结点是黑色的【没有俩个连续的红色结点】对于每个结点,从该节点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点每个叶子结点都是黑色的(此处的叶子结点指的是空结点)3.实现原创 2022-12-22 09:23:24 · 900 阅读 · 1 评论 -
AVL树详解
如果一颗二叉树是高度平衡的,它就是AVL树,如果它有n个节点,其高度可以保持在O(log2^n),搜索的时间复杂度O(log2^n)。二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。插入:AVL必须要保证严格平衡,插入一次数据就可能需要(左单旋,右单旋,左右双旋,右左双旋)1 (需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度。删除:和二叉搜索树删除一样,然后再更新平衡因子,出现不平衡,在进行旋转。原创 2022-12-20 09:21:54 · 497 阅读 · 0 评论 -
二叉搜索树详解
二叉搜索树作为一种经典的数据结构,它既有链表的快速插入与删除操作的特点,又有数组快速查找的优势;所以应用十分广泛,例如在文件系统和数据库系统一般会采用这种数据结构进行高效率的排序与检索操作。1.二叉搜索树中最左侧的节点是树中最小的节点,最右侧节点一定是树中最大的节点。2.采用中序遍历遍历二叉搜索树,可以得到一个有序的序列。原创 2022-12-19 14:59:23 · 309 阅读 · 0 评论 -
插入排序的实现
【代码】插入排序的实现。原创 2022-10-24 21:08:47 · 149 阅读 · 0 评论 -
实现单链表
【代码】实现单链表。原创 2022-10-23 20:07:55 · 159 阅读 · 0 评论 -
实现顺序表
1.顺序表的底层是数组。(既然顺序表的底层是数组,那你要顺序表干嘛?查: (给定关键字) O (N) (给定下标)O (1)错误示例:(当数组元素为0时候就跳出循环,并且打印count)使用myArrayList.usedSize即可解决上述问题。这样的话,有效数据是6。上面的代码就错了,有效数据还是3。当前这个数组中有多少个有效数据,不要自己数,让程序来。改:(给定下标) O (1)原创 2022-10-22 15:42:08 · 318 阅读 · 0 评论 -
十大经典排序算法
排序算法是《数据结构与算法》中最基本的算法之一。排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。用一张图概括:关于稳定性排序的稳定性是指在排序算法中,对于相等的元素,它们在排序后的相对顺序是否保持不变。如果一个排序算法具有稳定性,那么当两个元素相等时,它们在排序后的位置将不会改变。原创 2022-10-18 21:20:01 · 86 阅读 · 0 评论