C++数据结构和算法
文章平均质量分 52
Kegi_
励志学好C++的小白
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
二叉搜索树(BST)的定义是递归的(说明)
根节点的值必须大于左子树上所有节点的值,且小于右子树上所有节点的值(或者在某些定义中,左子树的所有值小于根节点,右子树的所有值大于根节点,没有等于的情况)。- **证明和推理**:递归定义简化了对BST性质的证明和推理,因为可以从基本情况开始,逐步扩展到更复杂的情况。BST的定义是递归的,因为它将BST定义为由更小的BST组成的结构,这些更小的BST遵循与整个树相同的规则。- **结构嵌套**:BST的结构可以无限嵌套,每个节点可以被视为一个更小的BST的根。原创 2024-08-19 21:56:34 · 383 阅读 · 0 评论 -
算法设计策略--利用对称性实现迭代
例如,镜像对称、旋转对称等。- **二维数组的螺旋打印**:可以从左上角开始,按照螺旋顺序迭代打印,利用矩阵的对称性减少边界条件的处理。- **图的遍历**:在无向图中,从任一顶点开始深度优先搜索或广度优先搜索,利用图的对称性避免重复访问。- **双向迭代**:如果问题具有对称性,可以定义两个迭代方向,分别从对称的两端开始迭代。- **状态定义**:在迭代过程中,定义和维护状态信息,利用对称性减少需要存储的状态数量。- **状态转换**:利用对称性简化状态转换逻辑,因为对称的状态下可能具有相同的转换规则。原创 2024-08-19 16:28:59 · 411 阅读 · 0 评论 -
如何利用节点的深度和高度信息来优化二叉树的操作和应用
在二叉树中,节点 𝑣 的深度(depth)是指从根节点到节点 𝑣 的路径长度,而节点 𝑣 的高度(height)是指从节点 𝑣 到叶子节点(最远的叶子节点)的最长路径长度。例如,深度较小的节点可能是树的上层节点,而高度较大的节点可能位于树的下层。树的动态调整:在需要动态调整树结构的场景中,如在数据库索引或文件系统组织中,利用节点的深度和高度信息可以优化树的分裂和合并操作。树的遍历:在树的遍历算法中,了解节点的深度和高度可以帮助设计遍历策略,例如,根据节点的深度来决定访问顺序。原创 2024-08-19 14:49:27 · 1108 阅读 · 0 评论 -
如何阅读代码
代码阅读是一个需要耐心和细致的工作,但随着经验的积累,这个过程将变得更加高效和直观。- 识别代码中的控制结构,如 `if` 语句、`switch` 语句、`for` 和 `while` 循环。阅读和理解代码是一个系统性的过程,需要分析代码的结构、逻辑和实现的细节。- 与他人讨论代码,进行代码审查,以获得不同的观点和深入的理解。- 在开始深入阅读代码之前,了解代码的用途、预期功能和运行环境。- 观察代码的布局和组织结构,良好的代码组织可以提高可读性。- 分析代码的性能,确定是否有瓶颈或可以优化的地方。原创 2024-08-16 16:27:46 · 589 阅读 · 0 评论 -
线性同余生成器代码阅读
这段代码的 `rand` 函数返回的是 `int` 类型,但是实际上它返回的是 `unsigned int` 类型的结果,这是因为结果值需要在0到32767之间。- 将 `next` 除以 `65536`(`2^16`),这实际上是对 `next` 进行了右移16位操作,获取了 `next` 的高16位。- 模数 `65536` 被用来丢弃 `next` 的低16位,而模数 `32768` 确保结果不会超出期望的范围。- 通过将 `next` 设置为 `seed`,可以改变随机数生成器的序列起始点。原创 2024-08-16 16:07:46 · 1234 阅读 · 0 评论 -
两个数组在内存中的空间有重叠的处理方式
**后缀-前缀重叠**:目标数组的某一部分在内存的后面部分与来源数组的前面部分重叠。- **前缀-后缀重叠**:目标数组的某一部分在内存的前面部分与来源数组的后面部分重叠。在编程中,数组的复制通常假定目标数组和来源数组在内存中是独立的,即它们没有重叠。1. **独立性**:理想情况下,目标数组和来源数组在内存中是独立的,复制操作可以直接进行。- **目标数组**:这是我们想要存储数据的数组,即复制操作的目的位置。- **来源数组**:这是包含要复制数据的数组,即复制操作的起始位置。原创 2024-08-16 15:42:14 · 403 阅读 · 0 评论 -
如何进行封底估算的说明
掌握良好的封底估算技能,即能够快速而准确地估计完成某项任务所需的时间或资源,对于项目管理和日常任务规划都非常重要。通过这些步骤和技巧的实践和不断改进,你可以逐渐提高你的封底估算技能,从而更好地管理时间和资源,提高工作和生活的效率。- 学习并应用不同的估算技术,如类比估算、参数估算、三点估算(最乐观、最可能、最悲观估计的平均值)等。- 记录你的估算过程和实际结果,项目结束后进行复盘,分析估算的准确性和需要改进的地方。- 咨询有经验的团队成员或行业专家,他们的经验和知识可以帮助你做出更准确的估算。原创 2024-08-16 15:37:35 · 419 阅读 · 0 评论 -
蛮力算法-素因子分解
在最坏的情况下,如果n 是一个质数或者n的素因子都是接近 n 的大质数,那么算法需要尝试从2到 n-1 的所有数,时间复杂度接近O(n)。- 如果n能够被这个数整除,说明这个数是 n 的一个素因子,将其添加到素因子列表中,并将n更新为除法的结果。- 在一般情况下,如果 n有较小的素因子,算法将更快地找到它们,并且 n 将被分解得更小,减少后续的尝试次数。蛮力算法提供了一种直观的方式来理解素因子分解的过程,但在实际应用中,通常会使用更高效的算法来处理大整数的分解。原创 2024-08-16 15:16:32 · 495 阅读 · 0 评论 -
排序算法复杂度的一般说明
**排序算法的下界**:排序算法的下界是指在比较排序模型下,任何排序算法至少需要执行的比较次数的最低界限。- **时间复杂度的组成部分**:排序算法的时间复杂度通常包括比较、移动和输出的时间。在最坏的情况下,所有元素的初始位置都是错误的,即没有任何一个元素处于其最终排序后的位置上。- **比较和移动操作**:在排序算法中,比较操作用于确定元素间的相对顺序,而移动操作用于将元素放置到正确的位置上。- **最坏情况分析**:在算法分析中,通常考虑最坏情况,即所有输入可能导致最多比较和移动操作的情况。原创 2024-08-16 15:09:09 · 275 阅读 · 0 评论 -
判断一个算法是否需要附加空间步骤
例如,如果一个算法只是对给定的输入数组进行原地操作(不创建新的大型数据结构,只使用固定数量的额外变量),其空间复杂度通常为 O(1)。2. 考察临时变量和数据结构的使用:查看算法中是否创建了新的变量、数组、链表、栈、队列、树等数据结构来辅助计算。如果创建了,这些通常都会占用额外的空间。总之,准确判断算法的附加空间需求需要对算法的细节有清晰的理解,并结合对数据结构和内存使用的分析来确定空间复杂度。1. 理解算法的工作原理:首先,需要深入理解算法的步骤和操作流程,明确在算法执行过程中对数据的处理方式。原创 2024-08-03 20:48:02 · 294 阅读 · 0 评论 -
位图--类似于数组,用于整数的集合
**内存效率**:位图使用单个位来表示元素的存在或不存在,因此对于大型数据集,位图可以非常节省内存。- **快速操作**:位图支持快速的查找、插入和删除操作,因为这些操作可以简化为位操作。2. **图形和图像处理**:位图用于表示图像的像素,每个像素用一个或多个位来表示颜色。3. **数据压缩**:位图可以用于表示数据的压缩信息,如霍夫曼编码树的节点存在性。4. **集合操作**:位图可以用于实现集合的并集、交集和差集等操作。1. **内存映射**:操作系统使用位图来跟踪内存页的使用情况。原创 2024-08-02 21:20:33 · 455 阅读 · 0 评论 -
短路求值说明
当使用逻辑AND运算符时,如果第一个操作数为`false`,那么无论第二个操作数是什么值,整个表达式的结果都将是`false`。在这个例子中,由于`a`已经是`false`,根据短路求值,`b`不会被求值,即使它是一个昂贵的操作。这样可以节省计算资源。对于其他运算符,如位运算AND(`&`)和OR(`|`),通常不采用短路求值。- 如果`A`为`false`,则整个表达式的结果为`false`,`B`不会被求值。- 如果`A`为`true`,则整个表达式的结果为`true`,`B`不会被求值。原创 2024-08-02 20:37:42 · 814 阅读 · 0 评论 -
维持算法稳定性
如果将`if`语句中的比较操作符从`>`(大于)改为`>=`(大于等于),这将改变算法的行为和结果。总之,将`>`改为`>=`会在算法的逻辑和结果上产生影响,特别是在处理相等元素时。在设计排序算法时,应仔细考虑比较操作符的选择,以确保算法的正确性和性能。- 在某些情况下,使用`>=`可能会减少交换的次数,但这通常不会对算法的整体性能产生显著影响,因为排序算法的性能主要由比较次数决定。这种修改可能会导致选择排序算法在选择最小元素时,选择到一个与已找到的最小元素相等的元素,而不是严格意义上的最小元素。原创 2024-08-02 20:35:32 · 249 阅读 · 0 评论 -
插值查找算法,基于二分查找的比较
2. **平均情况**:在平均情况下,如果数据分布非常均匀,那么插值查找的效率通常比二分查找要高。2. **预测位置**:给定要查找的元素`key`,插值查找首先计算一个预测位置,该位置基于`key`与数组中最小元素和最大元素的比较结果。3. **最坏情况**:在最坏情况下,如果数据分布非常不均匀,或者`key`总是位于数组的边界,那么插值查找可能退化为顺序查找,时间复杂度为O(n)。1. **最佳情况**:在最佳情况下,如果预测位置总是准确的,即`key`正好位于预测位置,那么只需要一次比较。原创 2024-08-02 20:14:06 · 432 阅读 · 0 评论 -
对于几种不同的查找算法以及它们在查找效率上的差异
如果这里的“字长”指的是每次迭代考虑的数据量,那么二分查找每次迭代减少的数据量是数组长度的一半,这与顺序查找逐个元素检查的方法不同。二分查找和插值查找都是高效的查找方法,但它们适用于不同的场景。二分查找算法每次比较后,都会将查找区间减半,这意味着查找区间的有效长度(即需要考虑的元素数量)每次迭代都会减少到原来的一半。然而,如果我们将“字长”理解为数组中元素的位数或数据类型的大小,那么插值查找可以看作是在每个字长上进行折半查找,即每次迭代都基于元素的值来预测其可能的位置,而不是简单地取中间位置。原创 2024-08-02 20:10:53 · 317 阅读 · 0 评论 -
关键码(Key)的比较次数和平均查找长度(ASL,Average Search Length)
1. **定义**:关键码的比较次数是指在搜索过程中,为了确定目标元素的位置,需要进行的比较操作的总数。4. **最坏情况**:在最坏的情况下,比较次数可能达到最大值,例如在有序数组的顺序查找中,最大比较次数为n(数组长度)。3. **期望值**:在概率论的背景下,ASL可以被视为比较次数的期望值,即在大量随机查找中,平均每次查找所需的比较次数。- **关键码比较次数是ASL的基础**:ASL是基于关键码比较次数计算得出的,没有具体的比较次数,就无法得出ASL。关键码比较次数与ASL的关系。原创 2024-08-01 21:55:31 · 775 阅读 · 0 评论 -
对语义上进行进一步细致约定的重要性
10. **适应不同的编程范式**:不同的编程范式(如面向对象、函数式编程等)有不同的语义约定,明确这些约定有助于开发者更好地应用特定的编程范式。9. **促进代码审查**:在代码审查过程中,细致的语义约定使得审查者可以集中关注代码的逻辑和结构,而不是纠结于命名和格式。6. **改善代码的自文档化**:良好的语义约定可以使得代码本身具有自文档化的特点,即通过阅读代码就能理解其功能和用途。5. **增强代码的可重用性**:当函数、类和变量的命名和行为遵循一致的语义约定时,它们更容易在不同的地方被重用。原创 2024-08-01 21:35:51 · 443 阅读 · 0 评论 -
处理数组或向量中元素去重问题--“勤奋的低效算法”和“懒惰的高效算法”
而“懒惰的高效算法”通过使用Two-Pointer Technique,避免了在数组中间进行修改,使得算法更加高效和简洁。- 只有当`j`指向的元素与`i`指向的元素不同时,才将元素复制到`i`的下一个位置,然后`i`和`j`都递增。- 这种方法不需要在数组中间进行删除操作,因此不需要调整其他元素的索引,算法逻辑更简单,执行效率更高。- 使用两个指针`i`和`j`:`i`指向已确认无重复元素的数组末尾,`j`用于遍历数组。- 最后,通过`shrink()`方法调整数组的容量,以释放不再使用的内存空间。原创 2024-08-01 21:29:56 · 526 阅读 · 0 评论 -
面向对象编程(OOP)中“没有过多的封装“
7. **可扩展性与可测试性**:没有过多的封装可以使得对象更容易扩展和测试,因为开发者可以更容易地访问和修改对象的状态。1. **适度的封装**:指的是封装的程度恰到好处,既保护了对象的内部状态,又没有过度限制外部代码对对象的合理使用。3. **模块化**:封装促进了代码的模块化,每个对象都是一个独立的模块,可以独立于系统的其他部分进行开发和测试。1. **数据隐藏**:通过隐藏内部实现,封装保护了对象的完整性,防止外部代码直接访问和修改对象的内部状态。原创 2024-08-01 21:18:40 · 355 阅读 · 0 评论 -
两种不同的模板类`Vector<T>`的成员函数`traverse`的实现
两种不同的模板类`Vector<T>`的成员函数`traverse`的实现,它们都用于遍历`Vector`容器中的元素并应用一个给定的操作。1. **模板类内的模板函数**:这里的`template <typename VST>`表示`traverse`是一个模板函数,它可以接受任意类型的函数对象`VST`。2. **函数指针作为参数**:`void ( * visit )( T & )`定义了一个函数指针`visit`,它指向一个接受类型为`T`的引用参数的函数。原创 2024-08-01 21:14:45 · 962 阅读 · 0 评论 -
顺序查找的输入敏感性
5. **查找失败的情况**:如果目标元素不存在于数据结构中,顺序查找将遍历整个数据结构,这在最坏的情况下会导致时间复杂度为O(n),其中n是数据结构中元素的数量。2. **目标元素的位置**:如果目标元素位于数据结构的开始位置,查找操作将很快完成。4. **重复元素**:如果数据结构中存在重复元素,顺序查找可能需要检查所有相同元素的实例,直到确定目标元素不在数据结构中。- **平均情况**:假设目标元素在数据结构中均匀分布,平均需要检查n/2个元素,时间复杂度是O(n)。元素越多,查找所需的时间就越长。原创 2024-08-01 20:27:04 · 269 阅读 · 0 评论 -
分摊成本(Amortized Cost)的说明
这些操作的直接成本可能超过O(1),但是通过分摊分析,我们可以证明这些操作的平均成本或者分摊成本是较低的。但是,如果我们将这些成本分摊到所有插入操作中,每次插入操作的分摊成本可能接近O(log n),而不是每次操作的直接成本O(n)。1. **单个操作成本**:某个特定操作的直接成本,例如在链表中删除一个节点的直接成本是O(1),但在某些数据结构中插入或删除可能涉及到更复杂的操作。2. **成本的累积**:尽管单个操作的成本可能很高,但是当我们考虑一系列操作时,这些高成本可以被累积并分摊到多个操作上。原创 2024-08-01 19:51:38 · 932 阅读 · 0 评论 -
STL(Standard Template Library,标准模板库)--`vector`
**`shrink_to_fit()`**:减少`vector`的容量以适应当前元素数量,释放未使用的内存。- **`front()`** 和 **`back()`**:访问`vector`的第一个和最后一个元素。- **`begin()`** 和 **`end()`**:返回指向`vector`开始和结束的迭代器。- **`capacity()`**:返回`vector`当前分配的内存可以容纳的元素数量。- **`resize()`**:调整`vector`的大小,可以增加或减少元素。原创 2024-07-30 22:00:45 · 443 阅读 · 0 评论 -
抽象数据类型(Abstract Data Type,简称ADT)和数据结构(Data Structure)
1. **定义**:ADT是一种逻辑上的描述,它定义了一组数据的集合以及对这个数据集合的操作。3. **例子**:栈(Stack)、队列(Queue)、图(Graph)等都是ADT的例子,它们定义了数据的逻辑结构和操作,但并不指定具体的实现。3. **例子**:数组实现的栈、链表实现的队列、邻接表或邻接矩阵实现的图等,这些都是数据结构的具体实现。2. **关注点**:ADT关注数据的逻辑特性和操作,数据结构关注数据的存储和操作的效率。3. **实现**:ADT不包含实现细节,数据结构是ADT的具体实现。原创 2024-07-30 21:57:41 · 882 阅读 · 0 评论 -
子序列(Subsequence)和子串(Substring)的区别
4. **例子**:在字符串 "abcdef" 中,"ace" 是一个有效的子序列,因为这些字符在原字符串中保持了原有的顺序,尽管它们之间有其他字符。4. **例子**:在字符串 "abcdef" 中,"bcd" 是一个有效的子串,因为它是连续的字符序列。- **灵活性**:子序列比子串更灵活,因为它允许在保持元素顺序的前提下,跳过一些元素。3. **长度**:子序列的长度也可以是任意的,从0(空序列)到整个序列的长度。- **位置**:子串在原字符串中有固定的位置,子序列则没有这个限制。原创 2024-07-08 08:41:57 · 2830 阅读 · 0 评论 -
在左式堆(Leftist Heap)中,节点和关键码(Key)的概念
而外部节点(也称为虚拟节点或哨兵节点)是左式堆中一个特殊的概念,它们不包含关键码信息,但携带了拓展信息,如 npl(null path length)。节点 C 是一个外部节点,它不包含关键码,但有一个 npl 值(-1),表示它是一个外部节点。它们通常用于表示空(或外部)的子节点,即当一个节点没有左子节点或右子节点时,该位置会被一个外部节点占据。- **节点**是左式堆的基本组成单位,每个节点可以包含关键码、指向其子节点的指针、以及可能的额外信息(如 npl)。- 节点可以是内部节点,也可以是外部节点。原创 2024-07-07 15:52:52 · 432 阅读 · 0 评论 -
左式堆的关键特性-- “null path length“
考虑两个左式堆 A 和 B,其中 A 的根节点的 npl 值为 2,B 的根节点的 npl 值为 1。如果要合并这两个堆,根据左式堆的性质,我们会将 B 作为 A 的右子节点(因为 B 的 npl 值较小),然后更新 A 的 npl 值为 3(原 npl 值 2 加上与右子节点的边)。左式堆利用 npl 值来保持一个重要的性质:对于堆中的任意节点,其左子节点的 npl 值总是大于或等于其右子节点的 npl 值。特别是在合并操作中,需要更新合并后节点的 npl 值,以确保左式堆的性质不被破坏。原创 2024-07-07 15:32:59 · 874 阅读 · 0 评论 -
锦标赛树(Tournament Tree)和堆排序(Heap Sort)比较说明
**排序时间**:堆排序的总时间复杂度是 (O(n log n)),这是因为每次删除操作后都需要进行一次下沉操作,而下沉操作的时间复杂度是 (O(log n))。- **构建堆的时间复杂度**:构建一个最大堆或最小堆的时间复杂度是 (O(n)),这是通过一个称为“堆化”(heapify)的过程实现的,它从最后一个非叶子节点开始,向上进行下沉操作。- **构建时间**:锦标赛树的构建时间复杂度是 (O(n)),而堆排序构建堆的时间复杂度也是 (O(n))。在这一点上,两者是相同的。原创 2024-07-07 14:59:12 · 722 阅读 · 0 评论 -
Min-max堆的说明
最大堆性质:对于堆中的任意节点,其值都大于或等于其子节点的值。最小堆性质:对于堆中的任意节点,其值都小于或等于其子节点的值。交替层性质:从根节点开始,奇数层的节点满足最大堆性质,偶数层的节点满足最小堆性质。原创 2024-07-07 13:24:29 · 387 阅读 · 0 评论 -
深度优先搜索(DFS)和广度优先搜索(BFS)的主要区别和详细说明
DFS更适合于目标深度较大的情况和需要回溯的问题,而BFS更适合于寻找最短路径和按层次遍历的问题。当节点v的所有未访问的邻接点都被探索后,搜索将回溯到发现节点v的那条边的起始节点。DFS和BFS:两者的时间复杂度都是O(V+E),其中V是顶点数,E是边数。它使用一个队列来记录在当前层中所有未被访问的节点,然后逐个访问这些节点,并将其未被访问的邻接点加入队列中。DFS:在最坏的情况下,空间复杂度可以是O(V),这是因为在递归过程中可能需要存储所有顶点的栈空间。适用于解决需要回溯的问题,如八皇后问题、数独等。原创 2024-07-05 22:00:59 · 1129 阅读 · 0 评论 -
B-Tree的应用
然而,当数据项非常大时,这种方法会浪费大量的存储空间,因为每个节点都需要存储完整的数据项。在改进的B-树中,只有叶子节点存储完整的数据记录,而非叶子节点仅存储用于索引的键值。由于关键值通常比完整的数据记录小得多,这种方法可以减少每个节点的存储需求,从而允许每个节点存储更多的关键值,进一步减少树的高度。由于改进的B-树减少了树的高度并且优化了节点的存储,它可以减少查找操作所需的磁盘存取次数。当处理的数据项是很大的记录时,使用改进的B-树可以带来显著的优势。3. **叶子节点的链表结构**原创 2024-07-04 15:55:38 · 533 阅读 · 0 评论 -
在一些复杂的数据结构中,内部元素本身的类型可能是指向其他对象的指针。
另一个例子是哈希表数据结构中的桶。这种情况下,该数据结构内部的元素实际上只是指向其他对象的指针,而不是实际存储数据的内存空间。因此,当这种数据结构被传递或操作时,外部更多关注的往往是其所指对象的大小,而不是指针本身的大小。当需要操作链表时,我们通常关心的是链表中存储的数据,而不是每个节点的指针大小。因此,内部元素的指针大小并不是我们最关注的问题,而是所指对象的大小。在这种情况下,外部更多关注的则往往是其所指对象的大小,而不是内部元素的指针大小,因为所指对象的大小直接关系到数据结构的性能和效率。原创 2024-05-02 16:40:54 · 245 阅读 · 0 评论 -
宏定义的应用与注意事项
宏定义是C ++中的一种预处理指令,用于在编译阶段之前对代码进行简单的替换。通过宏定义,可以将一个标识符定义为一个常量、一个表达式或者一段代码,方便在代码中多次使用。宏定义一般放在源代码的开头,可以定义在全局作用域或者局部作用域中。替换内容可以是任何有效的C ++表达式,包括整型、浮点型、字符型、字符串和代码块等。因此,在使用宏定义时,需要在简化代码和代码可读性之间做出权衡,并且要遵循一些编码规范和最佳实践,以确保代码的正确性和可维护性。在C ++中,可以使用。原创 2024-04-09 20:21:05 · 562 阅读 · 0 评论 -
栈的现实应用
这用栈结构正好合适,只要碰到左括号,就将此左括号进栈,不管表达式有多少重括号,反正遇到左括号就进栈,而后面出现右括号时,就让栈顶的左括号出栈,期间让数字运算,这样,最终有括号的表达式从左到右巡查一遍,栈应该是由空到有元素,最终再因全部匹配成功后成为空栈。规则:从左到右遍历表达式的每个数字和符号,遇到是数字就进栈,遇到是符号,就将处于栈顶两个数字出栈,进行运算,运算结果进栈,一直到最终获得结果。8.接下来是符号“/”,因此,栈顶的2与10出栈,10与2相除,得到5,将5进栈。10.结果是20出栈,栈变为空。原创 2024-04-07 13:15:14 · 222 阅读 · 0 评论 -
起泡排序(Bubble Sort)的最坏复杂度
例如,可以设置一个标志位来表示每次内循环是否发生了交换,如果没有交换则说明数组已经是有序的,可以提前退出外循环。在每次外循环中,内循环会从数组的第一个元素到倒数第i个元素进行比较和交换,将较大的元素往后冒泡。因此,总的比较次数为n*(n-1),即n^2-n。当输入数组已经按照逆序排列时,需要进行最多的比较和交换操作,从而导致最坏时间复杂度为n^2。起泡排序(Bubble Sort)的最坏时间复杂度为n^2的原因是因为它要进行n次外循环,每次循环都要比较相邻的两个元素并进行位置交换。原创 2024-03-06 17:18:01 · 463 阅读 · 0 评论 -
二分查找-哨兵在元素区间内部说明及举例
在函数内部,我们使用std::binary_search函数进行二分查找,并将迭代器范围的起始位置设置为数组的第一个元素,结束位置设置为数组的最后一个元素加 1。因此,如果要使用std::binary_search函数查找一个元素是否存在于一个有序数组中,并且需要将哨兵元素包含在区间内部,则可以将迭代器范围的起始位置设置为数组的第一个元素,结束位置设置为数组的最后一个元素加 1。如果迭代器范围中包含一个或多个元素,并且目标值在迭代器范围内,则std::binary_search函数会返回true。原创 2024-03-01 10:30:51 · 430 阅读 · 0 评论 -
C++数据结构与算法先修概要(MOOC-邓俊辉)
根据期望值的线性律,我们可以计算E(Z) = E(X1) + E(X2) + E(X3) = 0.5 + 0.5 + 0.5 = 1.5。我们需要证明当 n=k+1 时公式也成立,即 1 + 2 + ... + k + (k+1) = ((k+1)*((k+1)+1))/2 成立。期望值的线性律则是指若两个随机变量X和Y,以及常数a和b,有E(aX + bY) = aE(X) + bE(Y),即期望值可以按比例相加。在上面的例子中,有两个名为add()的函数,但参数类型不同。虚函数允许在派生类中进行重写。原创 2024-02-10 16:25:43 · 1152 阅读 · 0 评论
分享