
数据结构和算法
刷题前最后的倔强!
cj1561435010
这个作者很懒,什么都没留下…
展开
-
手写布隆过滤器(Bloom Filter)
一、特点 布隆过滤器是一种概率形的数据结构,通过布隆过滤器可以知道一个元素一定不存在或者可能存在。 优点:空间和时间都要远远超过一般算法。 缺点:会存在一定的误判,而且删除困难。  原创 2020-12-20 15:05:07 · 574 阅读 · 1 评论 -
字典树---Trie
一、字典树简介 Trie也叫做字典树、前缀树、单词查找树。 Trie搜索字符串的效率主要跟字符串的长度有关。 前缀搜索的时候,用Trie就是典...原创 2020-03-05 15:08:14 · 162 阅读 · 0 评论 -
有向图的最短路径算法(Dijkstra+BellmanFord+Floyd)
一、最短路径简介 所谓最短路径问题是指:如果从图中某一顶点(源点)到达另一顶点(终点)的路径可能不止一条,如何找到一条路径使得沿此路径上各边的权值总和(称为路径长度)达到最小。 路径规划就是最短路径的典型应用。二、Dijk...原创 2020-03-13 13:34:30 · 8329 阅读 · 0 评论 -
有向无环图的拓扑排序及最小生成树算法(Prim+Kruskal)
一、拓扑排序1、拓扑排序目标对于有向无环图,拓扑排序的目标其实就是找出依赖关系的顺序。上面那幅图的拓扑排序就是A B C D E F 或 A B D C E F。2、算法思路先找到入度为0的顶点依次入队,每次从队头出队一个顶点(可以看成是从这幅图中删除),由此更新该顶点出度边终点的入度信息,一旦有新的入度为0的顶点就立刻将这个点入队,直到队列为空。由此出队的顺序其实就是拓扑排序的结果...原创 2020-03-13 10:49:59 · 2076 阅读 · 0 评论 -
并查集(Union Find)
一、关于查询和连接数据结构的比较 动态数组 链表 平衡二叉树 Set 并查集 查询是否在同一村庄的时间复杂度 O(n) O(n) O(n)---需要遍历每棵树的所有结点 O(n) O(k) 合并两个村庄的时间复杂度 O(n) O(n) O(n)---需要将一棵树上所有结点都挪到另一棵树上 O(n) O(...原创 2020-03-13 10:20:48 · 134 阅读 · 0 评论 -
图的概述及DFS与BFS
一、图的基本概念1、图的组成及应用场景 图由顶点(vertex)和边(edge)组成,通常表示为 G = (V, E) ,G表示一个图,V是顶点集,E是边集 。顶点集V有穷且非空 ,任意两个顶点之间都可以用边来表示它们之间的关系,边集E可以是空的。 ...原创 2020-03-12 21:21:44 · 195 阅读 · 0 评论 -
十大排序算法+史上最强排序算法(附java实现)
详细介绍十一大排序算法,堪称史上经典,并给出java语言的实现!原创 2020-03-08 20:44:41 · 724 阅读 · 0 评论 -
二叉树的前序、中序、后序遍历实现(递归+非递归)
把LeetCode上二叉树的三序遍历做了,有个问题。本来想直接将LinkedList清空再重新放的,结果怎么搞都不行。还是对C语言指针概念匮乏啊,汇编也没学过的我哭qq。不过我通过重新new对象还是达到了想要的结果。 List&...原创 2020-03-06 11:33:07 · 266 阅读 · 0 评论 -
哈夫曼树(HuffmanTree)
一、哈夫曼树简介1、构建哈夫曼树 计算每个字符出现的概率,将这个概率做为权值之比。 利用这些带权值的字符构建出哈夫曼树。 具体构建步骤:&nb...原创 2020-03-05 17:17:35 · 1106 阅读 · 0 评论 -
重写PriorityQueue
PriorityQueue其实就是优先队列。一、优先队列简介 普通的队列就是FIFO(先进先出),而优先级队列是按照优先级的高低依次出队的,而且每次出队的时候会将优先级最高的元素作为队头优先出队。 &nb...原创 2020-03-05 14:46:51 · 486 阅读 · 0 评论 -
完全二叉堆及典型应用
一、关于最大值数据结构的比较 获取最大值的平均时间复杂度 删除最大值的平均时间复杂度 尾部添加元素的平均时间复杂度 动态数组 O(N) O(N) O(1) 双向链表 O(N) O(N) O(1) 平衡的二叉搜索树 O(log N) O(log N) O(log N) 最大堆 O(1) ...原创 2020-03-04 20:25:40 · 538 阅读 · 0 评论 -
重写HashMap和LinkedHashMap
一、TreeMap和HashMap比较 TreeMap HashMap 增加的平均时间复杂度 O(log N) O(1) 删除的平均时间复杂度 O(log N) O(1) 查询的平均时间复杂度 O(log N) O(1) 而且TreeMap中存放的元素要求必须可以比较大小,而HashMap没有这个要求。二、...原创 2020-03-04 11:49:04 · 494 阅读 · 0 评论 -
重写TreeSet和TreeMap
又写了一遍红黑树,写了两遍其实感觉也不是很复杂,旋转的代码写完了并且写正确了之后,手写红黑树还不是信手拈来。原创 2020-03-02 10:06:25 · 192 阅读 · 0 评论 -
深度解析红黑树
工欲善其事必先利其器,要想搞懂红黑树,还要先学习B树。红黑树和四阶B树是完全对应的。一、B树1、简述及特点 B树其实就是多路的搜索树,常用于文件系统,数据库实现(一般是好几百阶),Linux进程调度等等。 &nb...原创 2020-02-29 16:47:13 · 748 阅读 · 0 评论 -
AVL树(自平衡的二叉搜索树)
平衡二叉搜索树如果添加数据的时候数据随机分布的话,插入结点的时间复杂度会是O(h)、O(logN)。但是考虑下面两种极端情况,当数据从小到大或者从大到小插入的时候,裂开,复杂度直接变为O(N),而且二叉搜索树变得和普通链表一样了。不但插入结点会凉凉,删除结点可能也会变成链表,考虑下面情况:其实出现上述情况的根源还是二叉搜索树失衡了。AVL树(自平衡)特点:每个结点的平衡因子的绝对值...原创 2020-02-26 21:00:32 · 239 阅读 · 0 评论 -
二叉搜索树(BST)
一、二叉搜索树简介 二叉搜索树也叫二叉排序树、二叉查找树。Binary Search Tree满足下面三个条件: 1、任意一个结点的值都大于其左子树...原创 2020-02-25 22:26:21 · 279 阅读 · 0 评论 -
循环队列(普通+双端)
一、普通循环队列1、普通循环队列明细 循环队列是针对顺序队列中最大化利用内存空间的一种解决方法,可以解决当队列(数组)不可再插入新元素但队列的实际可用空间并未占满的问题。 相比普通的队列,多了个指向队头的索引,而且也是只能在头部删...原创 2020-02-24 17:02:34 · 523 阅读 · 0 评论 -
重写Stack与Queue以及浏览器前进和后退的本质
一、Stack1、栈明细 栈是一种特殊的线性表,只能在栈顶插入和删除元素(入栈和出栈),相当于只有栈顶一端才对用户可见。遵循后进先出LIFO原则(Last In First Out)与FILO原则(First In Last Out)。 &n...原创 2020-02-24 12:35:43 · 353 阅读 · 0 评论 -
循环链表(单向+双向)及典型应用场景
一、单向循环链表1、单向循环链表明细 单向循环链表其实就是尾结点有指向头结点的指针,一般链表尾结点指向的都是空。 添加结点的时候尾部情况和普通情况一样,不需要特殊处理(因为尾部有指向头结点的指针)。头部添加结点的时候还需要对第一次...原创 2020-02-23 14:26:31 · 5860 阅读 · 0 评论 -
重写ArrayList与LinkedList
设计结构图:接口代码: public interface List<E> { public static final int ELEMENT_NOT_FOUND = -1; //接口里面默认的成员变量就是public static final int size(); boolean isEmpty(); boolean co...原创 2020-02-21 19:41:34 · 236 阅读 · 0 评论