![](https://img-blog.csdnimg.cn/20190902213011519.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构与算法
文章平均质量分 79
程序等于数据结构加算法
算法:时间复杂度+空间复杂度
swadian2008
不积跬步,无以至千里;不积小流,无以成江海
展开
-
数据结构之二叉树(Binary Tree)详解
二叉树(Binary Tree)是一种常见的树状数据结构,它由一组节点组成,这些节点通过边连接起来。每个节点最多可以有两个子节点,分别称为左子节点和右子节点。二叉树的特点包括:每个节点最多有两个子节点。这两个子节点可以为空(null),也可以存在一个或两个子节点。左子节点和右子节点的顺序是有意义的,即左子节点在右子节点之前或之后。每个节点通常包含一个值(或称为关键字)以及其他辅助信息。原创 2023-06-06 12:19:00 · 1591 阅读 · 0 评论 -
Java 数据结构之队列(Queue)详解
但需要注意的是,由于数组的容量是固定的,当队列已满时,无法再添加新的元素,除非进行元素的出队操作。通过enqueue()方法将元素入队,dequeue()方法将元素出队,peek()方法返回队列头部元素,size()方法返回队列当前元素个数,isEmpty()方法和isFull()方法检查队列是否为空或已满。Deque接口还提供了一些其他方法,如size()用于返回双端队列中的元素个数,isEmpty()用于判断双端队列是否为空,clear()用于清空双端队列中的所有元素等。原创 2022-09-11 12:04:45 · 27115 阅读 · 0 评论 -
排序算法之快速排序
快速排序的排序错误主要是因为在选取枢轴元素时的不合理选择导致的,例如选择的枢轴元素恰好是当前待排序数组中的最大或最小元素,或者枢轴元素与其他元素相同且在排序过程中没有特殊处理。它的基本思想是通过一趟排序将待排数据分割成独立的两部分,其中一部分的所有元素都比另一部分的所有元素小,然后再分别对这两部分继续进行排序,重复这个过程,直到所有的数据都排好序。需要注意的是,在实际应用中,由于快速排序是一种原地排序算法,因此它对于内存的消耗相对较小,同时由于它的时间复杂度较低,因此它广泛应用于各种场合。原创 2023-05-24 16:03:42 · 925 阅读 · 1 评论 -
排序算法之归并排序
数据移动次数要求较高的场合:相比于快速排序和堆排序,归并排序需要移动的数据元素的次数较少,因此在数据移动次数要求较高的场合中,归并排序是更加适合的算法。数据移动次数较少:相比于快速排序和堆排序,归并排序需要移动的数据元素的次数较少,因此在数据移动次数要求较高的场合中,归并排序是更加适合的算法。大规模数据的排序:归并排序的时间复杂度为 O(nlogn),相比于其他排序算法,它更适合对于大规模数据的排序,如对于海量数据的外部排序。稳定性:归并排序是一种稳定排序算法,不会改变相等元素之间的相对顺序。原创 2023-06-01 16:02:46 · 359 阅读 · 0 评论 -
排序算法之希尔排序
在每个gap值下,我们对数组进行插入排序,具体实现是使用一个内部的循环,从gap位置开始,逐个和前面的元素进行比较和交换。循环的条件是j >= gap && arr[j - gap] > temp,即当前元素前面还有元素,且前面的元素比当前元素大,我们就将前面的元素向后移动一位,同时j向前移动gap个位置。由于希尔排序先将数据进行分组,每组再使用插入排序,因此在排序前期能够快速消除大量的逆序对,减少后续的排序工作量。不过希尔排序的实现相对于插入排序要复杂一些,需要对增量序列的选择进行一定的优化。原创 2023-05-22 09:58:58 · 441 阅读 · 0 评论 -
排序算法之选择排序
虽然其时间复杂度较高,但是选择排序的空间复杂度比较低,仅为O(1),且其实现较为简单,因此在数据量较小时,选择排序仍然是一个可行的排序算法。然而,选择排序的缺点也很明显。它的时间复杂度为O(n^2),其中n为序列长度,因此在数据规模较大的情况下,它的效率比较低,甚至可能无法承受。重复上述步骤,直到未排序序列中的所有元素都被放置到已排序序列的末尾,即排序完成。然后,从未排序序列中剩余的元素中找到最小的元素,将其放在已排序序列的末尾。首先,找到未排序序列中最小的元素,将其放在已排序序列的末尾。原创 2023-05-08 18:13:56 · 431 阅读 · 0 评论 -
数据结构之数组和列表
数组是用于储存多个数据的集合,可以通过来访问数组中具体的元素。但是因为数组在连续的,所以数组在程序中使用起来就具有局限性。数组最大的优势就是可以,在数组中,每个数据(仅表示位置,没有业务逻辑语义,比如不适合表示学号,身份证号等),因此,往往在实际开发中,不直接使用数组,而是,比如 Java 中的 ArrayList。原创 2020-04-08 22:04:48 · 1630 阅读 · 1 评论 -
Apache工具类Pair和Triple详解
org.apache.commons.lang3 工具包依赖Apache Commons Lang3 是一个 Java 工具库,提供了许多实用的类和方法,可以帮助开发人员更加便捷地编写 Java 程序。该库提供了一些常见的工具类,包括:ArrayUtils:提供了一系列静态方法来操作数组,例如数组的复制、查找、比较等操作。StringUtils:提供了一系列静态方法来操作字符串,例如字符串的比较、替换、分割等操作。ObjectUtils:提供了一些静态方法来操作对象,例如对象的比较、空值检查等操作。原创 2022-08-22 17:28:19 · 2574 阅读 · 0 评论 -
反转链表的Java实现
目录1、迭代法2、递归方式反转链表:输入:1->2->3->4->5输出:5->4->3->2->11、迭代法思路:遍历整个链表,当链表不为空时,每次取链表的第一个Node作为当前节点,修改当前Node的指针,重复此步骤,步骤解析如下:Java代码的具体实现步骤 public static ListNode reverseNode_1(ListNode node) { ListNode previ原创 2022-05-11 23:01:28 · 6291 阅读 · 0 评论 -
递归算法和斐波那契数列
目录1、递归算法(1)什么是递归?(2)递归的三要素2、斐波那契数列(1)什么是斐波拉契数列?(2)用递归方法求解斐波那契数列1、递归算法(1)什么是递归?递归主要是指在函数的定义中使用函数自身的方法。顾名思义,递归主要包含两个意思,递和归,这个是递归思想的精华所在。递归就是有去(递去)有回(归来)。“有去” 是指递归问题可以分解成若干个规模较小、与原问题形式相同的子问题,这些子问题可以和原问题用相同的方法来求解。“有回” 是指这些问题的演化过程是一个从大到小,并且最原创 2022-05-08 21:43:03 · 2275 阅读 · 0 评论 -
漏桶算法和令牌桶算法
目录1、漏桶算法2、令牌桶算法3、两种算法的区别4、限流工具类RateLimiter4.1 RateLimiter demo4.2 主要接口常用的限流算法有两种:漏桶算法和令牌桶算法。1、漏桶算法漏桶算法思路很简单,请求先进入到漏桶里,漏桶以固定的速度出水,也就是处理请求,当水加的过快,则会直接溢出,也就是拒绝请求,可以看出漏桶算法能强行限制数据的传输速率。漏桶算法示意图但是对于很多场景来说,除了要求能够限制数据的平均传输速率外,还要求允许某种程度的突发传输。这原创 2022-03-25 14:46:11 · 10001 阅读 · 4 评论 -
数据结构之Hash表——修改中
目录1、哈希表的定义2、Hash函数(1)键值对和Entry(2)哈希表如何存数据3、Hash冲突4、哈希表的扩容5、哈希表如何读取数据哈希表是个简单的东西,远没有我们想象的那么复杂,至于复杂hash函数的建立和解决hash冲突的办法,基本都是数学家该考虑的事,我们大可不必花太多时间纠结这些东西1、哈希表的定义散列表(Hash table,也叫哈希表),是根据键(key)而直接访问在内存存储位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射原创 2021-07-20 19:28:41 · 1117 阅读 · 0 评论 -
排序算法之插入排序
相比于冒泡排序,插入排序在处理大规模数据时效率更高,因为其每次只需要将一个元素插入到已排序部分,而冒泡排序需要不断交换相邻两个元素的位置,所以插入排序的交换次数更少。总的来说,插入排序适合处理小规模数据和基本有序的数据,但是当数据量较大时,效率较低。插入排序的稳定性较好,但是如果出现相同元素时,排序后相对位置不变,可能会导致相对较慢的排序速度。在数据量较小时,插入排序的效率比较高,且排序过程中占用的内存空间较小。数据量较小时,插入排序的效率较高,因此可以用于小规模数据的排序。和已排序部分中的元素,将。原创 2020-09-10 18:55:02 · 157 阅读 · 0 评论 -
排序算法之冒泡排序
在最坏情况下,冒泡排序需要进行n-1轮比较和交换,每轮比较需要进行n-i次,因此总的比较次数为n(n-1)/2次,时间复杂度为O(n^2)。冒泡排序是一种简单的排序算法,其基本思想是对待排序的序列进行多次遍历,每次遍历都将相邻的元素进行比较,如果顺序不对就交换它们的位置,这样就可以将最大(或最小)的元素逐渐“冒泡”到序列的最后面。上述代码中,使用了一个布尔型的标志位flag,如果在一轮遍历中没有进行任何交换,则说明待排序序列已经有序,此时可以提前结束循环,避免不必要的比较操作,从而优化算法的时间复杂度。原创 2020-09-10 18:09:54 · 127 阅读 · 0 评论 -
平衡二叉树和AVL树-代码实现
目录一、平衡二叉树二、计算节点的高度和平衡因子1、计算节点高度2、计算平衡因子3、节点高度和平衡因子的维护三、检查二分搜索树性质和平衡性四、旋转操作1、旋转操作的基本原理2、左旋转(LL)和右旋转(RR)的实现3、LR和RL五、AVL树的删除六、完整的AVL树的代码实现七、基于AVL树的映射和集合的实现1、基于AVL树实现的映射(Map)2、基于AVL树实现的集合(Set)一、平衡二叉树为什么需要平衡二叉树?前边我们说到过二分搜索树,二原创 2020-05-25 20:29:27 · 873 阅读 · 2 评论 -
并查集-代码实现
一、并查集并查集解决的的问题——网络间节点的连接状态。使用并查集可以快速的判断两个节点之间是否是相连接的。不同于求解两点之间的路径,并查集不关心两点之间是通过怎样的路径进行连接,正因为它没有求解其他不必要的结果,因此它的效率快。首先我们定义一个并查集的接口:public interface UF { int getSize(); // 判断两个元素是否是相连的 boolean isConnected(int p, int q); // 将两个元素合并在一起原创 2020-05-13 21:11:15 · 477 阅读 · 0 评论 -
Trie/字典树/前缀树-代码实现
目录一、什么是Trie?二、Trie的实现-字典树三、Trie和前缀搜索一、什么是Trie?字典:如果有n个条目,使用树结构,查询的时间复杂度为O(logn),如果有100万个条目(2^20)logn大约为20;Trie:查询每个条目的时间复杂度和字典中一共有多少条目无关!时间复杂度为O(w),w为字符串的长度。Trie结构图:把字符串存成一个一个的字符,形成一颗多叉树...原创 2020-05-06 20:47:56 · 267 阅读 · 0 评论 -
线段树(区间树)-查询和更新
一、为什么需要使用线段树在一个区间内,需要同时实现两个操作:更新+查询,如果我们仅仅使用数组来实现,它的时间复杂度时O(n)级别的,相对来说,如果我们使用线段树,便可以获得更好的时间复杂度和更高的执行效率。例如,我们需要在一个数组中,求一个区间内的元素的和,如果我们使用数组来进行实现,需要找到数组中所有的这些元素,然后进行一个一个的遍历求和操作,如果数据量很大的化,这种操作时比较低效的...原创 2020-04-29 19:18:04 · 2069 阅读 · 0 评论 -
优先队列和堆-代码实现
一、优先队列普通队列:先进先出,后进后出优先队列:出队顺序和入队顺序无关,和优先级相关。使用优先队列的动态场景所谓的动态,就是队列中的数据是不确定的,其中的元素是不断变化的,无法预知所有数据,无法对一个整体进行排序,因此我们需要使用优先队列。所谓的优先队列,其实就是一个队列,它的接口跟队列是一样的对于队列的实现,我们可以使用不同的底层数据结构,如图:底层使用...原创 2020-05-06 18:56:45 · 281 阅读 · 0 评论 -
集合和映射-代码实现
存储过程存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。存储过程的优点1. 运行速度:对于很简单的sql,存储过程没有什么...原创 2020-04-24 21:40:23 · 309 阅读 · 0 评论 -
二分搜索树-代码实现
一、树树结构,跟之前的数组和链表不同,它是一种非线性结构的数据结构。使用树结构可以很大程度上的提高我们的搜索效率,生活场景中有很多运用树结构的例子。比如文件搜索,如果我们需要找照片相关的数据,就会直接去照片文件下查找,而不会去选择其他的文件夹。这样做避免搜索了很多不必要的文件,从而大大提高了搜索的效率。1、二叉树二叉树和链表一样,是一种动态的数据结构,即不要一开始就指定数据结构的大...原创 2020-05-06 19:01:46 · 327 阅读 · 0 评论 -
链表与递归-代码实现
一、链表的使用:LeetCode例题删除链表中等于给定值val的所有元素。示例:给定 1->2->6->3->4->5->6,val = 6;返回:1->2->3->4->5。ListNode为题中给出的链表代码public class ListNode { public int val; public ...原创 2020-05-06 18:59:14 · 381 阅读 · 0 评论 -
链表结构-代码实现
链表Linked List动态数组、栈和队列底层是依托静态数组实现的,靠resize()解决固定容量问题,而链表是一种真正的动态数据结构。链表的数据存储再节点(Node)中。如下所示代码,节点包含两部分的内容,一部分是存储真正的数据E e;另一部分就是节点本身,代表的是当前节点的下一个节点。public class Node { E e; Node next;}...原创 2020-04-12 16:05:39 · 476 阅读 · 0 评论 -
数据结构之栈(Stack)的实现详解
堆栈是一种线性数据结构,其插入新元素和删除现有元素都发生在堆栈的顶部。栈(Stack)按照"后进先出"(Last-In-First-Out,LIFO)的原则存储和访问数据。栈类似于现实生活中的堆叠物体,比如一摞书或者一堆盘子。原创 2020-04-09 21:09:18 · 3011 阅读 · 0 评论 -
十分钟搞定时间复杂度(算法的时间复杂度)
算法复杂度算法复杂度分为时间复杂度和空间复杂度。其作用: 时间复杂度是指执行算法所需要的计算工作量;而空间复杂度是指执行这个算法所需要的内存空间。时间复杂度一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度,记为T(n)。一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n)原创 2020-03-24 19:40:00 · 30713 阅读 · 12 评论 -
数据结构:八大数据结构分类
数据结构是计算机科学中用来组织和存储数据的一种方式。以下是常见的一些数据结构:数组(Array):一组连续的内存空间,用来存储相同类型的数据。可以根据下标随机访问元素。但是在数组中插入或删除元素比较困难,因为需要移动后面的元素。栈(Stack):一种后进先出的数据结构。只允许在栈顶插入和删除元素。通常用数组或链表实现。队列(Queue):一种先进先出的数据结构。只允许在队尾插入元素,在队头删除元素。通常用数组或链表实现。原创 2020-03-24 14:40:42 · 5041 阅读 · 1 评论