
数据结构
文章平均质量分 77
赵jc
这个作者很懒,什么都没留下…
展开
-
约瑟夫环
约瑟夫环问题描述分析**模拟实现****递推实现**代码实现问题描述约瑟夫问题是个著名的问题:N个人围成一圈,第一个人从1开始报数,报M的将被杀掉,下一个人接着从1开始报。如此反复,最后剩下一个,求最后的胜利者。例如只有三个人,把他们叫做A、B、C,他们围成一圈,从A开始报数,假设报2的人被杀掉。首先A开始报数,他报1。侥幸逃过一劫。然后轮到B报数,他报2。非常惨,他被杀了C接着从1开始报数接着轮到A报数,他报2。也被杀死了。最终胜利者是C分析模拟实现我们可能用链表的方法去模拟这个原创 2021-03-10 19:07:31 · 130 阅读 · 0 评论 -
java--哈希表(hash)
hash哈希的引入哈希冲突避免冲突设计合适的哈希函数负载因子的调节(重点)解决冲突闭散列(开放地址法)开散列(链地址法)重点hash和java类集的关系哈希的引入顺序结构以及二叉搜索树中,元素与其存储位置之间没有对应关系,因此在查找一个元素时,必须要经过多次比较。顺序查找时间复杂度为O(N),二叉搜索树中为树的高度,即O(log2n).哈希的思想是不经过任何比较,一次直接从表中得到要搜索的元素。( 如果构造一种存储结构,通过某种函数(hashFunc)使元素的存储位置与其之间能够建立一一映射的关系,那原创 2021-02-10 17:13:05 · 2111 阅读 · 0 评论 -
Map和Set
Map和Set概念和场景两种模型MapSet概念和场景Map和Set是一种专门用来进行搜索的容器或者数据结构,其搜索的效率与其具体的实例化子类有关。以前常见的 搜索方式有:1.直接遍历,时间复杂度为O(N),元素如果比较多效率会非常慢2.二分查找,时间复杂度为O(log2n) ,但搜索前必须要求序列是有序的上述排序比较适合静态类型的查找,即一般不会对区间进行插入和删除操作了,而现实中的查找比如:1.根据姓名查询考试成绩2.通讯录,即根据姓名查询联系方式3.不重复集合,即需要先搜原创 2021-02-06 21:04:03 · 416 阅读 · 3 评论 -
Java--二叉搜索树
二叉搜索树概念重要操作查找插入删除(重点)总结概念二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树(二叉树的性质嘛)如下图便是一个二叉搜索树重要操作查找核心代码public BSNode search(int val) { if (root == null) return null;原创 2021-02-04 19:29:36 · 143 阅读 · 0 评论 -
Java基本排序总结(Sort)
这里写目录标题什么是排序排序的定义排序的相关术语排序的分类算法分析直接插入排序算法描述算法分析实现代码堆排序算法描述算法分析实现代码二级目录二级目录三级目录什么是排序排序的定义对一序列对象根据某个关键字进行排序(通俗点来说就是吧一堆数据按照从小到大(升序),或者从大到小排列(降序))排序的相关术语稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面内排序:所有排序操作都在内存中完成外排序:由于数据太大,因此把数据原创 2021-02-02 18:38:37 · 1568 阅读 · 1 评论 -
TopK问题
TopK问题问题描述分析及代码排序堆问题描述什么是 Top K 问题?简单来说就是在一堆数据里面找到前 K 大(当然也可以是前 K 小)的数。我们下面都以找K小为例(K大类似)分析及代码排序看到问题我们首先想到的是将数据排个序,然后返回前k个数据,我们这里重点讲一下基于快排的解法。如果我们了解快速排序算法的话,知道其原理是每次寻找一个数值,将数组中所有小于这个数的值放在其左侧,所有大于其数值的数放在其右侧。因此调用一次partion之后,设其返回值为p,则比第p个数字小的所有数字在数组的左侧,比原创 2021-01-31 20:27:26 · 194 阅读 · 0 评论 -
Java--堆(优先级队列)
堆/优先级队列引入堆(heap)一级目录二级目录三级目录引入二叉树的顺序存储存储方式使用数组保存二叉树结构,即将二叉树用层序遍历方式放入数组中。一般只适合表示完全二叉树,因为非完全二叉树会有空间的浪费。这种方式的主要用法就是堆的表示。2. 下标关系已知双亲(parent)的下标,则: 左孩子(left)下标 = 2 * parent + 1;右孩子(right)下标 = 2 * parent + 2;已知孩子(不区分左右)(child)下标,则: 双亲(parent)下标 = (chil原创 2021-01-30 17:12:28 · 219 阅读 · 0 评论 -
Java--二叉树
二叉树树树的概念树的相关性质树的表示形式树的应用二叉树(非常重要☆)二叉树的概念二叉树的基本形态特殊的二叉树满二叉树完全二叉树二叉树的性质二叉树的存储顺序存储链式存储二叉树的遍历前序遍历中序遍历后续遍历层序遍历一级目录二级目录三级目录树树的概念在学习二叉树之前我们先来了解一下树。树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看 起来像一棵倒挂的树,也就是说它是根在上,而叶子在下的。它具有以下的特点:有一个特殊的节点,称为根节点,根节点原创 2021-01-28 17:31:08 · 305 阅读 · 1 评论 -
Java集合之栈(顺序表实现)
栈Stack栈的相关定义实现栈的相关定义栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈 顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。压栈:栈的插入操作叫做进栈/压栈/入栈,向栈顶压入数据。出栈:栈的删除操作叫做出栈。从栈顶弹出数据。实现1.利用顺序表实现,即使用尾插 + 尾删的方式实现2.利用链表实现,则头尾皆可相对来说,顺序表的实现上要更为简单一些,所以我们优先用顺序表实现栈原创 2021-01-23 19:09:40 · 432 阅读 · 0 评论 -
Java集合之队列(Queue)
队列Queue队列的概念队列的分类普通队列优先级队列双端队列队列的实现单链表实现普通队列数组实现循环队列队列的概念队列:只允许在一端进行插入数据操作,在另一端进行删除操作的特殊线性表,队列具有先进先出FIFO(First In First Out)的特点(栈只可以在一端进行插入删除操作,而队列可以在两端进行操作)入队列:进行插入操作的一端称为队尾(Tail/Rear)出队列:进行删除操作的一端称为队头(Head/Front)队列的分类普通队列普通队列:只有先进先出的特点。优先级队列原创 2021-01-24 19:03:48 · 537 阅读 · 0 评论 -
双向链表java实现
双向链表其实就比单链表多了一个前驱而已(用来存放上一个节点的位置)但要注意的是头结点的prev为null,最后一个结点的next域为null。实现代码如下public class ListNode { public int val; public ListNode next; public ListNode prev; //alt+insert -> Constructor public ListNode(int val) {原创 2021-01-10 21:37:49 · 227 阅读 · 0 评论 -
顺序表的实现
顺序表的概念及结构顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改等。顺序表一般可以分为:静态顺序表:使用定长数组存储动态顺序表:使用动态开辟的数组存储。静态顺序表适用于确定知道需要存多少数据的场景.静态顺序表的定长数组导致N定大了,空间开多了浪费,开少了不够用.相比之下动态顺序表更灵活, 根据需要动态的分配空间大小.接口实现我们来实现一个动态顺序表. 以下是需要支持的接口.public class SeqList {原创 2020-12-29 18:41:05 · 532 阅读 · 0 评论 -
时间复杂度和空间复杂度
在聊时间复杂度和空间复杂度之前我们先来了解一下算法的效率吧。算法的效率算法效率分析分为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度,而空间效率被称作空间复杂度。 时间复杂度主要衡量的是一个算法的运行速度,而空间复杂度主要衡量一个算法所需要的额外空间,在计算机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再特别关注一个算法的空间复杂度。时间复杂度时间复杂度的概念大O的渐进表原创 2020-12-29 18:26:04 · 391 阅读 · 0 评论 -
单链表的实现
之前的实现的顺序表有如下缺点顺序表中间/头部的插入删除,时间复杂度为O(N)增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后增容到200,我们再继续插入了5个数据,后面没有数据插入了,那么就浪费了95个数据空间。那么 如何解决以上问题呢?我们就需要用链表来解决了,我们就来聊一下链表。链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的 。概念肯能听起来有点绕,我们来举一原创 2021-01-02 11:03:42 · 818 阅读 · 0 评论