
数据结构教程
文章平均质量分 95
数据结构用于组织和存储数据,以便在执行数据操作时有效地使用它。深入了解数据结构的需求和应用,以及复杂性分析、排序和搜索算法。本数据结构教程将指导您从初级到高级轻松学习数据结构。还可以学习 Python、C、C++ 和 Java 中数据结构的实现。
新华
从事核电安全级仪控系统软件研发,目前正在研发安全级嵌入式实时操作系统......
展开
-
树:稀疏矩阵
我们可以将每个非零元素视为一个三元组,即大小为 3 的整数数组,其中第一个元素是非零元素的行号,第二个元素是列号,第三个元素是值,所有非零元素都可以表示为这样的三元组相互叠加,从而形成 N。这种表示是稀疏矩阵的另一种线性表示,除了三重表示之外,其中稀疏矩阵的每个非零元素都由链表节点表示,其中有关稀疏矩阵的非零元素的信息,即稀疏矩阵中从左到右计数的行号。除了数组之外,链表也是以压缩形式存储稀疏矩阵的不错选择,其中链表的每个节点正好有四个条目,其中包含行号、列号、非零元素的值以及下一个节点的指针,即。原创 2024-01-24 05:45:00 · 2316 阅读 · 0 评论 -
树:伸展树
二叉搜索树中左子树的值小于根节点的值,右子树的值大于根节点的值。当要搜索的项目是根节点或根节点的左子节点时,我们使用锯齿形旋转。在这种情况下,首先,我们执行了锯齿形旋转,然后执行了锯齿形旋转。假设我们得到了一个具有不同节点的二叉搜索树,我们知道在二叉搜索树中,左边的元素比根节点小,右边的元素比根节点大。这种旋转类似于之字形旋转,唯一的区别是这里每个节点向左移动一个位置,然后向当前位置的右侧移动一个位置。在本例中,首先,我们执行了锯齿形旋转,然后执行了锯齿形旋转。下面给出的旋转是我们将在张开树中执行的旋转。原创 2024-01-24 05:30:00 · 866 阅读 · 0 评论 -
树:B+ 树
树只是一个平衡的二叉搜索树,其中所有数据都存储在叶节点中,而内部节点只存储索引。找到要删除的节点并将其从叶节点中删除,但我们还需要将其从指向此节点的索引中删除。,其中所有叶节点都处于同一级别,以及存储在内部节点中的某些值如何充当指向叶节点中存在的实际数据的指针。现在,从子节点中提取一个透视表,以插入到父节点和子节点的父节点的键中。根节点至少具有两个子节点。除根节点外,每个节点最多可以有 m 个子节点,最小可以有�/2。直到我们到达一个叶子节点,我们继续遍历树,如果叶子节点满了,我们就把叶子节点一分为二!原创 2024-01-24 05:15:00 · 1075 阅读 · 0 评论 -
树:数据结构中的 B 树
在这里,密钥 32 将从节点 [32, 41] 中删除。由于该节点只有 MIN 键,没有左同级键,我们将尝试从它的右同级 [53, 61, 64] 借用,它有多个 MIN 键。因此,右同级 (53) 的第一个键被移动到分隔键的位置,分隔符键被移动到下溢节点(发生删除的节点)。因此,左同级 (10) 的最后一个键被移动到分隔键的位置,分隔键被移动到下溢节点(发生删除的节点)。但是,与 BST 不同,B 树不是做出 2 向决策(向左或向右),而是在每个节点上做出 n 向决策,其中 n 是节点的子节点数。原创 2024-01-24 05:00:00 · 1241 阅读 · 0 评论 -
树:Treaps
中完成,因为在每个节点上,人们可以根据比较删除树的一半,因此需要对数比较才能到达正确的节点(要添加或删除元素的位置)。函数在 BST 中搜索正确的位置,并在正确的位置添加节点,即根据 BST 和堆属性向右添加,并在添加后根据需要进行必要的旋转,对于旋转,将分别编写。(每个节点最多有 2 个子节点),这样左边的子节点存储的键小于根节点,右边的子节点存储的键大于根键,这对所有节点递归有效。是节点数,因为必须遍历路径中的所有节点才能到达正确的节点,在最坏的情况下可能是最后一个节点,例如,假设我们想在树中添加。原创 2024-01-23 06:00:00 · 954 阅读 · 0 评论 -
树:数据结构中的循环队列
为了从列表中删除 frontNode,我们更新前端指针以指向下一个元素,如果列表变为空,则为 NULL。为了将元素排队,我们检查队列是否已满,如果已满,则退出。循环队列中的队列操作类似于基本队列,其优点是,一旦到达队列结束且队列未完全满,即可将队列指针从队列端移动到队列开始。列表:这一步是检查列表是否为空,如果为 true,我们让 front 指针或 head 指针指向新创建的块。队列指针(前指针和后指针)将开始从 0 移动到 N-1(队列的最大大小 = N),到达 N-1 后,它们回到 0,再次从。原创 2024-01-23 05:45:00 · 866 阅读 · 0 评论 -
树:优先级队列
就像我们形成的任何队列一样,队列中第一个站的人将首先被处理,同样,即使在计算机科学队列中,也适用相同的规则。要插入元素,将遍历列表,直到找到要插入的元素的合适位置,以保持链表的整体顺序。但是,在优先级队列中,队列中的每个项目都分配了一个优先级,并且根据分配给它们的此优先级值将项目取消排队或删除。(这样一来,优先级最高的元素被移动到队列的开头,而优先级最低的元素被移动到队列的后面)。对于删除,优先级最高的元素将首先从优先级队列中删除,而优先级最高的元素位于列表的顶部,因此它将被简单地删除。原创 2024-01-23 05:30:00 · 949 阅读 · 0 评论 -
树:堆数据结构
我们创建了一个名为 heapify() 的函数,该函数的工作原理是将树划分为更小的子树,然后将每个子树中父树的值与子树的值进行比较。并且,此数组中元素的索引可用于查找任何节点的父节点或子节点。这里需要注意的一件有趣的事情是,如果所有子节点都已经堆叠,则可以堆叠节点。如果在完整的二叉树中,所有节点(包括根节点)都小于其各自的子节点,则称为最小堆。所有完整的二叉树都是完整的二叉树,但是,所有完整的二叉树都不是完整的二叉树。如果在完整的二叉树中,所有节点(包括根节点)都大于其各自的子节点,则称为。原创 2024-01-23 05:15:00 · 923 阅读 · 0 评论 -
树:后缀树
在 trie 数据结构中,给定字符串中所有字符串的每个字母表一个接一个地遍历,每个节点代表一个字母表。如果两个或多个单词以相同的子字符串开头,则相同的子字符串由相同的节点链表示。这是一个压缩的 trie,包括字符串的所有后缀。个后缀中的每一个节点一个,没有后缀是另一个后缀的前缀。下面是我们之前用于进行 try 的相同朋友名称列表的后缀树的表示。后缀树的空间使用量远远大于序列集合的实际大小,无论它是线性的。无论哪种方式,都已经发表了开发基于磁盘的后缀树的实际工作,这些后缀树可以扩展到(几)GB/小时。原创 2024-01-23 05:00:00 · 965 阅读 · 0 评论 -
树:AVL 树
但是,每次插入后,都会检查新插入节点的祖先的平衡因子,以确保树的平衡。在计算了树中所有节点的平衡因子后,很明显,元素 10 的插入导致了根节点的不平衡,导致了树的左偏。在树上执行任何影响高度的操作时,如果给定节点的平衡因子的大小超过单位,则根据平衡标准,指定节点称为不平衡。插入新节点后,如果多个节点不平衡,则遍历树中插入节点的祖先,并在第一个出现的不平衡节点上执行旋转。因此,树在右侧较重,我们可以通过围绕不平衡节点的边缘(枢轴点)或在这种情况下的根节点逆时针旋转来转移左侧的不平衡节点来平衡它。原创 2024-01-22 06:00:00 · 866 阅读 · 0 评论 -
树:Fenwick Tree | 二叉索引树
概述二进制索引树是一种数据结构,用于有效地计算数字序列(数组)的前缀和。它也被称为芬威克树,因为“彼得芬威克”通过他的论文将其介绍给世界“于1994年首次发布。Fenwick Tree简介当回答关于数组的多个前缀和(从索引 0 到索引 x 的数组元素之和,即 a[0]+a[1]+...+a[x])查询时,我们脑海中首先浮现的想法是使用一个前缀和数组。在这里,如果我们想计算a[0]+a[1]+...+a[4],我们不需要计算它,而是我们可以简单地。原创 2024-01-22 05:45:00 · 1751 阅读 · 0 评论 -
树:持久区段树
因此,在应用升级操作之前,我们创建一个新的根节点,然后将其存储在向量或数组中。最后,我们可以使用与简单段树相同的技术,在所需版本的段树中求解范围和查询。下图显示了段树的结构,用于在生成查询后查找给定范围内的总和,其中每个节点存储与父向量的特定范围关联的总和。的节点将受到给定更新操作的影响,因为我们更新的时间间隔完全落在与这些节点关联的时间间隔内。现在,在执行更新操作时,我们使用上面讨论的想法将段树的最新更新版本升级到新版本。由于在点更新查询中,我们移动到叶节点并更新其路径中从根节点到该叶节点的所有节点。原创 2024-01-22 05:30:00 · 1089 阅读 · 0 评论 -
树:具有延迟传播的段树
如上所述,段树是一种高度通用且高效的数据结构,用于解决涉及范围查询的问题,并且足够灵活,可以处理范围内的更新查询以及O(log n)时间复杂度中的点更新查询。我们建议大家参考文章段树,作为本文的先决条件,我们在本文中讨论了如何使用段树来处理点更新。在这篇文章中,我们将看到如何使用段树来处理范围更新查询。假设你有一个数组,如下所示,array= [2,5,4,3]。现在,您需要解决给定数组的范围最小查询或给定范围内的最小查询,同时处理范围更新。原创 2024-01-22 05:15:00 · 1779 阅读 · 0 评论 -
树:区段树
' 函数将查询的边界 'l' 和 'r' 作为参数,并返回数组中 'l' 和 'r' 范围内元素的总和。从图中可以看出,树的根是一个完整的段,即携带与数组的所有元素相关的信息。操作将接收要设置的新值和相应的索引。此示例是段树的实现,专门用于解决在基于范围的查询中查找数组段中元素总和的问题,因此不是正式的通用。是一种数据结构,它允许有效地应答数组上的范围查询,同时仍然足够灵活以允许修改数组。幸运的是,由于段树的多功能性,可以有效地解决此类问题。一种灵活的基于树的数据结构,用于有效解决涉及范围查询操作的问题。原创 2024-01-22 05:00:00 · 961 阅读 · 0 评论 -
树:红黑树
具有一些用于插入和删除节点的附加条件,以使高度保持平衡。中,我们已经看到如果树的高度不平衡(左右子树的高度差大于1),我们如何旋转树,类似地,在红黑树中也可以进行旋转额外的步骤我。在二叉搜索树中,所有操作的时间复杂度都为O(h),其中h是树的高度,在最坏的情况下(倾斜树)可能达到O(n),如下所示 -中,我们已经看到,在最坏的情况下,二叉树的整体形状取决于插入和删除的顺序,因此很难保持对数时间复杂度。左子树中的每个节点的值都小于根节点,右子树中的所有节点的值都大于根节点,这同样适用于所有子树。原创 2024-01-21 06:00:00 · 917 阅读 · 0 评论 -
树:Trie 数据结构
此外,trie数据结构可以用于基于前缀的搜索,而我们不能使用哈希表来进行基于前缀的搜索。为了在 Trie 数据结构中实现删除操作,我们首先搜索查询字符串是否存在于 Trie 中。在本文中,我们将讨论搜索操作,以检查查询函数中给出的整个字符串是否存在于 Trie 数据结构中。第二个参数是我们要插入到 Trie 数据结构中的字符串。我们将一一理解每一个操作的代码,然后在文章的后半部分实现Trie数据结构的整个代码。另一个需要注意的重要事项是 Trie 数据结构中的每个字符串都是按字典顺序从左到右排序的。原创 2024-01-21 05:45:00 · 1093 阅读 · 0 评论 -
树:二叉搜索树 (BST)
但是,如果随机插入元素,创建平衡树,则每个操作的平均时间复杂度为 O(log2N),其中 N 是树中元素的数量。二叉搜索树 (BST) 对于动态数据集很有好处,因为它们提供高效的搜索、插入和删除操作,平均时间复杂度为 O(log2N)。今天我们讨论了一个非常棒的算法,它可以让二分搜索相形见绌 😛 如果数据集是随机和动态的,它为插入和搜索提供对数复杂度。因此,所有小于或等于当前节点的元素将出现在左子树中,所有严格大于当前节点的元素将出现在右子树中。是最常用的树版本,其中树的每个节点最多可以有两个子节点。原创 2024-01-21 05:30:00 · 1104 阅读 · 0 评论 -
树:数据结构中的二叉树
您可以将团队分为较小的团队,例如赞助团队、技术团队等,每个团队都可以有一名领导者来指导团队的其他成员。请注意,这样做会创建一个层次结构,其中您是顶层人员,然后在第二层您有团队领导,在第三层,每个团队都有一些志愿者。– 具有前一个节点的节点称为子节点。节点可以既是父节点又是子节点,具体取决于上下文中的节点。满二叉树,也称为真二叉树,是每个内部节点具有零个或两个子节点的树,称为满二叉树。中,每个节点只包含一个位于树左侧或右侧的子节点,则称为退化二叉树。中的一个节点只包含一个子节点,那么它就不是满二叉树。原创 2024-01-21 05:15:00 · 768 阅读 · 0 评论 -
树:树数据结构
这一切都与树节点中的数据有关,程序是否收集了正确的数据趋势和统计数据,以及数据是否在树数据结构的节点中正确使用,以及决定下一个子节点应该是什么的算法是适当的,那么程序在大多数情况下都会得出正确的结论。左子树中每个节点的值必须小于根节点的值,右子树中每个节点的值必须大于根节点的值。、历史数据集,允许它保留自己的统计数据或数据集以了解数据趋势(在本例中是用户选择的电影)并以某种方式让它来每个节点的数据。节点的左侧部分由左子节点的内存地址组成,节点的右侧部分由右子节点的内存地址组成,中间部分保存该节点的数据。原创 2024-01-21 05:00:00 · 839 阅读 · 0 评论 -
散列法:负载系数和重散列
个元素,现在都会用这个新的哈希函数产生不同的索引来放置它们,所以基本上我们用新的哈希函数重新哈希所有这些存储的元素,并将它们放在新调整大小的更大 HashTable 的新索引中。将被重新散列,并将存储在这个新调整大小的 HashTable 中的第 5 个索引处,而不是像以前的 HashTable 那样存储在第 1 个索引处。中实现的,我们在其中选择现有的存储桶,计算它们的新哈希值并将它们放在新调整大小的数组的新索引中。因此,我们需要重新散列技术,该技术使用新的哈希函数对已经存储的所有元素进行。原创 2024-01-20 06:00:00 · 1100 阅读 · 0 评论 -
散列法:双重散列
密钥是您的帐号,值是您的完整信息。双重哈希是一种计算机编程技术,它与哈希表中的开放寻址结合使用,以解决哈希冲突,方法是在发生冲突时使用密钥的辅助哈希作为偏移量。在大多数实际场景中,键的数量远远大于哈希表中的位置数量,因此,无论哈希函数有多好,都必然会发生冲突。,现在这又是一次冲突,因为第一个位置已经被占用,我们现在需要使用双重哈希来解决这个冲突。2(k).....,这导致了对哈希表进行寻址的非线性方式,从而减少了冲突的次数。2(k) 碰撞后,帮助我们到达哈希表上的新位置,每个新位置的距离为ℎ2。原创 2024-01-20 05:45:00 · 1848 阅读 · 0 评论 -
散列法:开放式寻址 | 封闭式哈希
使用开放寻址时,通过探测(搜索)哈希表中的替代单元格来解决冲突,直到我们的目标单元格(在插入时为空单元格,而在搜索时带有值为x的单元格sx) 被发现。当表的大小不是质数时,问题可能会更严重。您可以看到,线性探测和二次探测之间的唯一变化是,在发生碰撞的情况下,我们不是连续搜索单元格,而是对二次探测单元格感兴趣。我们在索引0的单元格中找到了74,因此我们的搜索成功,现在要删除它,我们将其值替换为一个非常大的数(比如∞)。时,我们的搜索成功并删除它,我们将用其他一些唯一值替换它,一个不错的选择是将其替换为∞∞.原创 2024-01-20 05:30:00 · 1211 阅读 · 0 评论 -
散列法:单独链接
哈希表的每个槽都是一个链表。如果发生任何冲突,即如果在计算映射到同一键的哈希值后有多个元素,那么我们会将这些元素存储在同一个链表中。哈希表的负载因子可以定义为哈希表包含的项目数除以哈希表的大小。在这种方法中,我们将所有散列的元素放在链表中的同一插槽中。假设我们有以下哈希函数,我们必须通过使用单独的链接作为冲突解决技术在哈希表中插入某些元素。它帮助我们确定哈希函数的效率,即它告诉我们使用的哈希函数是否在哈希表中均匀分布密钥。首先,我们将绘制空哈希表,根据提供的哈希函数,该表的哈希值可能范围为 0 到 5。原创 2024-01-20 05:15:00 · 956 阅读 · 0 评论 -
散列法:数据结构中的哈希
现在我们不能将此数据放在大小为 100 的数组内的索引 114 处,因此我们可以再次应用此算法,也可以使用 Division 方法(主要用于此类场景)来获取 KaTeX 解析错误: 预期 'EOF',在位置 4 处得到 '%':114%̲100=14。这个整数 (N) 可以以任何方式从 Key 中检索,例如,如果 key = String,或者如果 key 本身是一个实体,例如 Address,我们可以选择取 key 的第一个字符。在这里,搜索是按顺序执行的,从发生冲突的位置开始,直到找不到空单元格。原创 2024-01-20 05:00:00 · 1861 阅读 · 0 评论 -
堆栈和队列:数据结构中的队列
数据结构,这意味着我们可以将项目插入队列的后端,而只能从队列的前端删除。队列是一种顺序数据类型,与数组不同,在数组中,我们可以使用索引访问它的任何元素,但我们一次只能访问队列前面的元素。在上图中,我们可以看到站在队列前面的人将是第一个离开队列的人,站在队列最后的人将是最后一个离开的人。等待轮到他们的一队人或等待着陆指令的飞机队列也是队列数据结构的一些现实生活中的例子。在上面的示例中,我们将一个元素排在队列的后面,然后将队列的最前面的元素排出队列。发生在队列的后端,而删除发生在队列的前端。原创 2024-01-19 06:00:00 · 1659 阅读 · 0 评论 -
堆栈和队列:数据结构中的堆栈
它是使用堆栈完成的。堆栈是一种线性数据结构,遵循后进先出 (LIFO) 原则,其中添加的最后一个元素是第一个要删除的元素。因此,唯一可以删除的元素是堆栈顶部的元素,并且在给定时间只能读取或删除一个项目。模式,其中添加到堆栈的最后一个元素将是第一个要删除的元素。在堆栈中,如果我们尝试在堆栈为空时弹出或删除元素,则会导致称为下溢的情况。上面的场景是堆栈工作原理的实际说明:最后一个进入电梯的人是第一个离开的人,第一个进入电梯的人最后离开。最初,堆栈是空的,我们可以使用推送操作一个接一个地添加元素,直到堆栈变满。原创 2024-01-19 05:45:00 · 1862 阅读 · 0 评论 -
链表:数据结构中的循环链表
因此,如果我们有指向最后一个节点的指针,则需要恒定时间操作。最后,我们看到了循环链表的应用,我们利用了这样一个事实,即我们不必担心到达列表的末尾,而是可以继续处理所有项目,因为它们会以循环方式存在。正如我们所看到的,我们需要遍历列表以到达节点,之后必须插入一个新节点,这意味着它所花费的时间与列表中的元素数量一样多。通过圆圈,我们的意思是一旦我们到达列表中的最后一个节点,我们就可以从最后一个节点获取起始节点。正如我们所看到的,要在循环链表的末尾插入一个新节点,我们只需要调整最后一个节点的指针,因此在。原创 2024-01-19 05:30:00 · 998 阅读 · 0 评论 -
链表:双向链表
例如,如果 Array = {1, 2, 3} 并在第 1 个索引处插入 10,我们需要将 2 和 3 向前移动一步,为 10 腾出空间,得到: {1,不幸的是,在这种情况下,链表中没有简单的出路,我们唯一能做的就是从头开始迭代 LinkedList 并继续前进,直到我们看到当前。中,我们基本上需要横扫到这个位置,检索该索引处的节点,然后可以调用上面的 delete 方法传入我们要删除的节点。因此,正如我们所看到的,要删除给定位置的节点,我们需要横直到给定位置,然后通过更新其相邻元素的指针来删除它。原创 2024-01-19 05:15:00 · 1903 阅读 · 0 评论 -
链表:单向链表
值得注意的是,链表在插入和删除操作方面表现出色,在恒定时间内执行它们,与以线性时间执行这些任务的数组形成鲜明对比。在单向链表中,每个节点只链接到序列中的下一个节点,即如果我们从列表的第一个节点开始遍历,我们只能朝一个方向移动(双关语)。链表是由节点组成的动态数据结构,每个节点都包含数据和指向下一个节点的指针。遍历了它的所有操作和好处,我们终于承认了它的一些实际应用。在最坏的情况下,我们最终可能会访问列表中的所有节点,因此在。事实证明,我们不能,即使链表已经排序,我们也无法对它执行。我们可以在链表上应用。原创 2024-01-19 05:00:00 · 887 阅读 · 0 评论 -
字符串高级算法:Manacher 算法
算法是由 Manacher 发明的,用于列出出现在任何给定字符串开头的所有回文,后来观察到相同的算法可用于在线性时间内找到任何字符串的最长回文子字符串。为了实现暴力破解方法,首先,我们将使用嵌套循环来获取每个子字符串,然后嵌套另一个循环来检查该子字符串是否为回文。需要解决一些非常困难的问题的子问题。2)嵌套循环导致的时间复杂度,但事实并非如此,更仔细的分析表明该算法是线性的和摊销的。所有这些的输出都是相同的(实现是相同的,区别仅在于编程语言)。所有这些的输出都是相同的(实现是相同的,区别仅在于编程语言)。原创 2024-01-18 06:00:00 · 947 阅读 · 0 评论 -
字符串模式匹配:Z 算法
数组的辅助数组来工作。现在,当我们用一个附加字符将模式连接到我们的原始字符串时,基本上我们将新创建的字符串的前缀(即我们的模式)与字符串的其余部分(即要搜索的字符串)匹配。,我们首先将搜索模式和要搜索的字符串连接在一起,在两者之间添加另一个字符,该字符在任何字符串中都不存在。个字符,这也是我们的模式。正如我们在示例中看到的,我们已经将模式和字符串连接在一起,中间有一个附加字符,这两个字符都不存在。由于我们添加了一个在任何字符串中都不存在的附加字符,因此我们确信永远不会找到比我们的模式更长的字符串。原创 2024-01-18 05:45:00 · 1050 阅读 · 0 评论 -
字符串模式匹配:KMP 算法
Knuth-Morris-Pratt (KMP) 算法通过实现线性时间复杂度(表示为 O(n)))彻底改变了字符串匹配。该算法由 Knuth、Morris 和 Pratt 于 1970 年推出,通过使用“前缀表”(也称为 LPS(最长的专有前缀,也是后缀)表)来有效地识别文本中的模式。与传统方法不同,KMP 避免了冗余比较,从而提高了性能。通过按顺序比较字符并利用预处理表,KMP 最大限度地减少了回溯,使其成为各种计算应用中高效字符串模式识别的基石算法。原创 2024-01-18 05:30:00 · 1795 阅读 · 0 评论 -
数据结构中的字符串
概述字符串通常被视为一种数据类型,通常实现为字节(或单词)的数组数据结构,该结构使用某些字符编码存储一系列元素(通常是字符)。要点库函数介绍字符串随处可见。从您登录设备开始,您就输入一个字符串,即您的密码。事实上,本文是由字符串的集合组成的。当您遇到任何文本数据时,它通常由字符串组成。在编程中,String被用作数据类型,就像 int 或 float 一样;但是,这里的区别在于,String 处理的是文本类型的数据。它可以由字母、数字、空格和特殊字符组成。字符串通常用双引号括起来(原创 2024-01-18 05:15:00 · 1948 阅读 · 0 评论 -
阵列高级算法:MO 算法 - 平方根分解
我们只需从 1 遍历到 6,如果一个块完全在给定范围内,即块 1,我们直接在 O(1) 时间内从块数组中添加它的总和,否则我们通过遍历范围添加单个元素(arr[让我们考虑一种更好的方法,将数组分成一些相同大小的块,然后计算块元素的总和。),因此,如果我们考虑同一块中的查询,则查询将按右索引排序。这个想法是根据索引以特殊顺序回答查询,以便我们通过修改先前回答的查询的结果来回答当前查询。我们在编程中遇到了许多基于查询的问题,其中我们以数组的形式获得查询,然后我们回答查询。因此,在最坏的情况下,我们在。原创 2024-01-18 05:00:00 · 917 阅读 · 0 评论 -
阵列高级算法:中位数和订单统计
正如您在中学时所学过的那样,中位数本质上是您所拥有的一组数据的“中间点”,它可以是任何东西 - 您班级中学生的体重,或者商店中产品的价格,例如只要它们在集合中按升序或降序排列即可。当然,正如我们上面看到的,顺序统计是按升序排列的集合,我们知道第一个值将是最小的。,��}={�(�)当 n 为奇数时,其中 �=�+12�(�)+�(�+1)2 当 n 为偶数时,其中 �=�2。整数(基本上是图表的 x 轴),p 是在单个实验中获得成功的概率(就像概率是 1/2 ,如果实验是抛硬币并且成功是得到正面)。原创 2024-01-17 06:00:00 · 965 阅读 · 0 评论 -
排序算法:计数排序
由于排序的应用实际上是无限的,我们应该知道应该如何以及使用哪种算法来对不同类型的数据集进行排序,因为一种算法可能对某些特定的数据集有用,而对其他类型的数据集可能不太有用。神奇的部分是,由于我们开始从 count 数组的最低索引到最高索引追加元素,因此这些值会以排序的方式自动插入到最终的排序数组中。从学校生活一开始,我们就按照字典顺序排序,或者简单地说,按照我们的名字排序,就像一本典型的英语词典一样。计数排序不是一种稳定的排序算法,这意味着原始数组中元素的相对顺序不会保留在最终排序的数组中。原创 2024-01-17 05:45:00 · 946 阅读 · 0 评论 -
排序算法:存储桶排序算法
分组后,每个存储桶都会进行排序,然后将排序后的元素合并成一个有凝聚力的有序序列。桶排序的方法简化了排序过程,通过系统的桶分配和后续组织确保数据的有效排列。这将导致一个或多个存储桶比其他存储桶拥有更多元素,从而使存储桶排序像任何其他排序技术一样,其中每个元素都与另一个元素进行比较。或者,换句话说,数组的元素均匀分布在数组的整个跨度/范围内。范围内的元素数量相同。在这种情况下,我们将对每个存储桶的范围设置稍有不同,我们将在下一节中了解这一点。现在,迭代未排序的数组,并继续将数字插入到其相应范围的存储桶中。原创 2024-01-17 05:30:00 · 1097 阅读 · 0 评论 -
排序算法:数据结构中的基数排序算法
它非常适合按数字对整数和按字符对字符串进行排序,它按数字值将元素分配到存储桶中,从最低有效数字到最高有效数字重复排序以获得最终顺序。是一种稳定的排序方法,它使用计数排序作为子例程。,请注意一次,因为它是基数排序的先决条件,如果您想按降序对数组进行排序,请调整计数排序函数以使其排序数组按相反顺序排列。在最好的情况下,当数组已经排序时,我们不需要应用该算法,而是可以在数组的单次遍历中检查数组是否已排序。其中,b 是原始数组中元素的基数,因为在上述情况下我们处理的是十进制数(基数为 10),所以 b = 10。原创 2024-01-17 05:15:00 · 2160 阅读 · 0 评论 -
排序算法:合并排序算法
例如,如果你有两张10卢比的钞票和五张50卢比的钞票,首先你会计算10卢比的钞票的总额,即 2 * 10 = 20 卢比,然后计算50卢比的钞票的总额,即 5 * 50 = 250 卢比,最后将这两个总额相加,20 + 250 = 270 卢比。这意味着第一个子数组中的剩余数字肯定更大,并且由于它们已排序,因此我们将它们按原样插入到最终排序的数组中。因此,我们的目标是不断划分,直到数组中的所有元素都是单个数组元素。如上所述,我们的目标是继续划分,直到数组中的所有元素都是单个数组元素,因此,这是基本情况,原创 2024-01-17 05:00:00 · 2750 阅读 · 0 评论 -
排序算法:堆排序
这是因为我们使用了固定数量的变量,除了循环变量和辅助变量(包括 temp、n、index 和largest)之外,我们不需要任何额外的内存空间。不同之处在于,堆排序不会线性地遍历未排序区域,而是将未排序区域排列在堆数据结构中,有助于快速有效地找到所需的元素。这里需要注意的一件有趣的事情是,如果所有子节点都已堆化,则可以对节点进行堆化。该函数的工作原理是将树划分为更小的子树,然后将每个子树中父级的值与子级的值进行比较。对给定的数组进行排序。的每个级别或高度,节点数几乎等于下一个级别中存在的节点数的一半。原创 2024-01-16 06:00:00 · 1157 阅读 · 0 评论