自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(33)
  • 收藏
  • 关注

原创 C语言中递归算法的效率分析

该算法的时间复杂度可以使用递归关系 T(n) = T(n-1) + T(n-2) + O(1) 进行分析,其中 T(n) 表示计算输入 n 的斐波那契数所花费的时间。需要注意的是,并非所有递归算法都能得到有效优化,其效率很大程度上取决于问题的性质和所使用的特定算法。递归算法的时间复杂度由递归调用的数量和每次调用中完成的工作决定。该算法的空间复杂度为 O(n),因为递归的最大深度为 n,并且每个递归调用都需要为其局部变量和返回地址留出空间。递归算法的空间复杂度由递归的最大深度和每次递归调用所需的空间决定。

2024-02-04 20:56:17 374

原创 C语言中的递归过程和递归工作栈

最后,将结果打印为 5 的阶乘。- 当前执行状态被推送到堆栈上,包括 'n' 的值 (5) 和返回地址。- 当前执行状态被推送到堆栈上,包括 'n' 的值 (3) 和返回地址。- 当前执行状态被推送到堆栈上,包括 'n' (4) 的值和返回地址。- 当前执行状态被推送到堆栈上,包括 'n' (2) 的值和返回地址。- 当前执行状态被推送到堆栈上,包括 'n' (1) 的值和返回地址。- 触发递归情况,并调用 'factorial(1)'。- 触发递归情况,并调用 'factorial(0)'。

2024-01-19 19:43:51 452

原创 C语言中链栈的表示和实现

否则,它将顶部节点存储在临时变量“temp”中,从“temp->data”中检索值,将“top”更新为指向下一个节点,并释放“temp”占用的内存。我们使用“push”函数插入元素,“peek”函数检索顶部元素,“pop”函数删除元素,使用“displayStack”函数打印堆栈的内容。“isStackEmpty”函数通过验证“top”是否为“NULL”来检查堆栈是否为空。“Stack”结构表示链接的堆栈,并包含指向堆栈顶部节点的指针“top”。如果堆栈为空,则“top”设置为“NULL”。

2024-01-16 21:23:37 1161

原创 C语言中顺序栈的实现与表示

我们使用“push”函数插入元素,“peek”函数检索顶部元素,“pop”函数删除元素,使用“displayStack”函数打印堆栈的内容。“initializeStack”函数通过将“top”设置为 -1 来初始化堆栈,表示空堆栈。在此实现中,我们定义了一个“堆栈”结构,该结构包含一个数组“data”来存储堆栈的元素,以及一个整数“top”来跟踪顶部元素的位置。“push”函数通过递增“top”并将值分配给“data”数组中的相应位置,将元素插入堆栈中。如果堆栈为空,则打印一条消息,指示堆栈为空。

2024-01-10 22:01:38 449

原创 栈的定义与特点&队列的定义与特点

1. 后进先出:添加到堆栈中的最后一个元素是第一个要删除的元素。1. FIFO:添加到队列中的第一个元素是第一个要删除的元素。- 定义:堆栈是遵循后进先出 (LIFO) 原则的线性数据结构。这意味着插入堆栈的最后一个元素是第一个要删除的元素。3. 用法:队列通常用于处理顺序很重要并遵循顺序流的场景,例如处理传入请求、管理打印作业或实现广度优先搜索算法。- 定义:队列是遵循先进先出 (FIFO) 原则的线性数据结构。这意味着插入队列的第一个元素是第一个要删除的元素。- 推送:将元素插入堆栈的顶部。

2024-01-10 21:59:09 371

原创 C语言中线性表的合并&有序表的合并以及案例分析和实现

然后,它循环访问两个列表,比较每个位置的元素,并将较小的元素追加到合并的列表中。3. 两个列表都是非空的:在这种情况下,我们同时遍历两个列表,将两个列表中的元素附加到合并的列表中,直到我们到达任一列表的末尾。2. 一个列表是空的:如果其中一个列表是空的,则合并的列表将是非空列表本身。2. 一个列表是空的:如果其中一个列表是空的,则合并的列表将是非空列表本身。1. 两个列表都是空的:在这种情况下,合并的列表也将是空的。1. 两个列表都是空的:在这种情况下,合并的列表也将是空的。**线性列表合并:**

2024-01-09 15:50:11 1383

原创 顺序表和链表的性能比较

另一方面,链表在动态调整大小方面更灵活,在列表开头或结尾的插入和删除方面效率更高,但它们的访问时间较慢,并且由于节点指针的开销,内存效率可能较低。- 链表:在链表中,元素存储在动态分配的节点中,这些节点使用指针进行链接。所需的空间与列表中的元素数量成正比,并且在动态创建节点时会分配额外的内存。但是,在列表中间插入或删除元素需要移动后续元素,从而导致 O(n) 的时间复杂度,其中 n 是列表中的元素数。- 顺序列表:在顺序列表中,元素存储在连续的内存位置,这意味着为列表分配了固定数量的内存。

2024-01-08 22:50:05 400

原创 循环链表和双向链表

在此实现中,双向链表的每个节点都包含一个“prev”指针和一个“next”指针,它们分别指向上一个和下一个节点。“insertAtEnd”函数通过遍历列表直到到达最后一个节点,然后更新最后一个节点的“next”指针以指向新节点,并将新节点的“prev”指针更新为指向最后一个节点,从而在列表末尾插入一个新节点。“insertAtEnd”函数通过将新节点的“next”指针更新为指向头节点的“next”指针,并将头节点的“next”指针更新为指向新节点,在列表末尾插入新节点。**循环链接表:**

2024-01-07 13:32:40 546

原创 线性表的链式表示和实现

在此实现中,“struct Node”用于表示列表中的每个节点。“insertAtBeginning”函数通过更新新节点的下一个指针以指向当前头,并将新节点作为新头返回,在列表的开头插入一个新节点。“insertAtEnd”函数通过遍历列表直到到达最后一个节点,然后更新最后一个节点的下一个指针以指向新节点,在列表末尾插入一个新节点。最后,我们使用“displayList”函数来打印列表的元素。线性列表的链式表示(也称为链接表示)是使用节点实现的,其中每个节点都包含数据元素和指向列表中下一个节点的指针。

2024-01-07 13:27:29 361

原创 C语言中栈的表示和实现

top”指针指向堆栈中的第一个节点。“isEmpty”函数检查“top”指针是否为“NULL”,以确定堆栈是否为空。“pop”函数删除顶部节点,更新“top”指针,并返回数据。在基于数组的实现中,我们使用固定大小的数组,并使用“top”变量跟踪顶部元素。函数“isEmpty”和“isFull”分别检查堆栈是空的还是满的,以处理潜在的错误。这两种实现都提供了堆栈的基本操作:“push”用于添加元素,“pop”用于删除顶部元素,“peek”用于检索顶部元素而不删除它,“display”用于打印堆栈的元素。

2024-01-06 14:18:58 449

原创 C语言中线性表的顺序表示和实现

在此示例中,我们定义了一个结构“LinearList”,该结构由一个数组“data”(用于存储线性列表的元素)和一个整数“length”(用于跟踪列表的当前长度)组成。在 'main' 函数中,我们通过声明 'LinearList' 结构的实例来创建一个线性列表 'list',并使用 'initialize' 函数对其进行初始化。这演示了使用 C 语言中的数组实现线性列表的简单实现,也可以根据需要添加其他操作(如搜索、删除或修改列表中的元素)来进一步扩展此实现。“display”函数显示线性列表的元素。

2023-12-28 17:32:52 692

原创 C语言中的青蛙跳台阶问题

该函数使用动态编程来构建一个数组 ('dp'),其中 'dp[i]' 表示到达步骤 'i' 的不同方法的数量。在此代码中,“countDistinctWays”函数将步数 ('numSteps') 作为输入,并返回到达楼梯顶部的不同方式的数量。考虑到楼梯上的台阶总数,我们需要确定青蛙可以到达顶部的不同方式的数量。然后,该函数从步骤 1 迭代到“numSteps”,通过对前三个步骤(1、2 和 3)的路径数求和来计算每个步骤的路径数。当运行此程序时,它将提供青蛙可以通过指定步数到达楼梯顶部的不同方式的数量。

2023-12-22 19:27:12 937

原创 C语言中的汉诺塔问题

它需要四个参数:“numDisks”(要移动的磁盘数)、“source”(源挂钩)、“auxiliary”(辅助挂钩)和“destination”(目标挂钩)。3. 使用源挂钩作为中间挂钩,将“numDisks - 1”磁盘从辅助挂钩移动到目标挂钩。1. 使用目标挂钩作为中间,将“numDisks - 1”磁盘从源挂钩移动到辅助挂钩。2. 将最大的磁盘(磁盘编号“numDisks”)从源挂牌移动到目标挂牌。当运行此程序时,它将打印解决指定数量的磁盘的河内塔谜题所需的移动顺序。1. 一次只能移动一个磁盘。

2023-12-19 20:15:13 504

原创 C语言中的大O记法

它使用迭代“大小”时间的循环,在每次迭代中执行恒定时间操作(加法)。随着输入大小的增加,循环中的迭代次数呈线性增长,从而导致线性时间复杂度。需要注意的是,这些只是几个例子,大 O 表示法可以表示各种其他时间复杂度(例如,对数、指数)。分析算法的时间复杂度有助于了解其效率,识别潜在的瓶颈,并在为特定任务选择算法时做出明智的决策。它的运行时间是恒定的,因为它执行单个操作(访问第一个元素),而不管数组的长度如何。随着输入大小的增加,它提供了算法增长率的上限。此表示法表示具有恒定运行时的算法,无论输入大小如何。

2023-12-18 11:10:57 683

原创 C语言中的二分查找及其实例分析

在“main”函数中,使用示例数组“{2, 5, 8, 12, 16, 23, 38, 56, 72, 91}”进行演示。它首先计算搜索空间的中间索引(“mid”)。如果中间元素等于目标,则该函数返回索引。如果中间元素小于目标,则搜索空间将缩小到右半部分。如果中间元素大于目标,则搜索空间将缩小到左半部分。在此示例中,“binarySearch”函数采用数组“arr”、下限“low”、上限“high”和要搜索的目标值。该函数使用 while 循环将搜索空间重复分成两半,直到找到目标或搜索空间用尽。

2023-12-16 23:09:03 552 1

原创 C语言中的选择排序实例分析

该算法的时间复杂度为 O(n^2),其中 n 是数组中的元素数。这是因为对于每个元素,该算法执行线性搜索以查找数组剩余未排序部分中的最小元素。因此,该算法可能不是大型数组的最有效选择。但是,它具有简单性的优点,并且需要最少的额外内存,因此适用于小型数组或部分排序的数组。它遍历数组并在数组的未排序部分找到最小元素,并将其与最左侧的未排序元素交换。在此示例中,数组“{64, 25, 12, 22, 11}”使用“selectionSort”函数进行排序。将显示初始数组,后跟排序后的数组。

2023-12-14 17:54:36 471 1

原创 C语言中的插入排序

在‘main’函数中,我们定义了一个包含一些值的数组‘arr’,计算数组‘n’的大小,然后调用‘insertionSort’函数对数组进行排序。函数的作用是打印数组中的元素。在每次迭代中,数组的排序部分按一个元素扩展,未排序部分按一个元素收缩。2. 将键 (2) 与它之前的下一个元素 (4) 进行比较。5. 对数组中的其余元素重复步骤 1-4,一次一个元素,直到对整个数组进行排序。数组:[2, 5, 4, 6, 1, 3]数组:[2, 4, 5, 6, 1, 3]数组:[2, 4, 5, 6, 1, 3]

2023-12-11 23:05:41 643 1

原创 C语言中的冒泡排序

在“main”函数中,数组“arr”使用一些值进行初始化。数组 'n' 的大小是使用 'sizeof' 运算符计算的。最后,使用“printArray”再次打印排序后的数组。'bubbleSort' 函数接受数组 'arr' 和元素数 'n' 作为输入。外部循环运行“n-1”次,因为在每次迭代后,数组未排序部分中最大的元素被放置在正确的位置。上面的代码演示了冒泡排序算法,该算法重复遍历数组,比较相邻元素,如果它们的顺序错误,则交换它们。'printArray' 函数只是打印数组的元素。

2023-12-07 16:28:58 337

原创 C语言中的二叉树及其实例讲解(一)

在二叉搜索树 (BST) 中,左侧子树中的值小于当前节点,右侧子树中的值大于当前节点。通过利用这些概念和算法,二叉树可以为各种问题提供有效的解决方案,包括数据组织、搜索、排序、表达式计算等。例如,在文件系统中,二叉树可以表示目录结构,其中每个节点表示一个目录,其子节点表示子目录或文件。二叉树是由节点组成的数据结构,其中每个节点最多可以有两个子节点,分别称为左子节点和右子节点。“Node”结构表示二叉树中的一个节点,包含数据值和指向其左右子项的指针。二叉树的高度是根节点和叶节点之间的最大边数。

2023-12-05 18:42:07 404

原创 哈希表中如何插入,查找以及删除元素

总之,将元素插入哈希表包括计算键的哈希值,将其映射到索引,并在该索引处插入键值对。删除元素包括根据关键字查找索引,然后删除该索引处的元素。-一旦确定了索引,就可以访问存储在哈希表中该索引处的元素。-一旦确定了索引,就会将键值对插入该索引处的哈希表中。-需要注意的是,在删除元素时,一些哈希表实现还可以执行额外的操作来保持哈希表的效率和完整性,例如重新哈希或重新组织元素。-从哈希表中删除元素需要查找与键对应的索引,就像在查找过程中一样。-一旦找到索引,就可以从哈希表中删除该索引处的元素。

2023-12-04 10:13:54 784

原创 哈希表实例讲解(二)

std::unordered_map”是一个模板化类,它允许我们存储键值对,其中键的类型为“std:”string“,值的类型为”int“。`插入键值对,其中键为“Alice”,值为95。“std::unordered_map”类的哈希函数负责计算每个键的哈希值,该哈希值用于确定存储键值对的索引或存储桶。在这种情况下,`scores[“Alice”]`返回与键“Alice“相关联的值(在本例中为95)。std::cout

2023-12-02 23:00:52 360 1

原创 哈希表及其实例讲解(一)

当需要插入、查找或删除一个键-值对时,哈希函数会计算出对应的哈希桶的索引,并在该位置进行操作。冲突指的是不同的键映射到相同的哈希桶的情况。哈希表(Hash Table),也称为散列表,是一种常见的数据结构,用于实现键-值(Key-Value)对的存储和快速查找。1. 插入(Insertion):根据键的哈希值计算索引,并将键-值对存储在对应的哈希桶中。3. 删除(Deletion):根据键的哈希值计算索引,并从哈希桶中删除对应的键-值对。1. 高效的查找:通过哈希函数计算索引,可以快速定位到对应的值。

2023-11-29 20:02:33 347 1

原创 函数渐近上界

这些示例演示了不同的渐近上限及其相应的时间复杂度。源代码提供了算法的实现,这些算法在给定的示例中表现出这些复杂性。需要注意的是,这些只是几个例子,还有其他具有不同复杂度的时间复杂度类和算法。函数的渐近上限,也称为大 O 表示法,表示当输入大小接近无穷大时函数的最坏情况增长率。- 算法:执行嵌套循环,产生与输入大小平方成正比的操作计数。- 算法:无论输入大小如何,都执行恒定数量的操作。- 算法:对每个输入元素执行恒定数量的操作。- 示例:通过数组中的索引访问元素。- 示例:查找数组中的最大元素。

2023-11-28 21:05:19 414

原创 C语言函数的递归

在这个例子中,我们使用递归计算一个数字的阶乘。阶乘()函数接受一个整数‘n’作为输入,并返回它的阶乘值。如果‘n’是0或1(基本情况),则函数返回1。否则(递归情况),它将‘n’乘以‘(n-1)’的阶乘。函数递归是指函数在执行过程中调用自身的过程。递归包括两个主要组件:定义终止条件的基本情况,以及使用修改后的输入再次调用函数的递归情况。在‘main()’函数中,我们调用‘factorial()’,其中‘num’等于5并存储结果。这段代码的输出是“5的阶乘是:120”,表示5的阶乘是120。

2023-11-27 15:04:12 322 1

原创 C语言中的嵌套循环

在这个例子中,我们使用一个嵌套循环来打印乘法表。外循环迭代行,内循环迭代列。对于行索引和列索引的每个组合,我们计算乘法结果并打印它。在打印每一行中的值之后,我们使用‘printf(“\n“)’来开始一个新的行。嵌套循环是放置在另一个循环语句内部的循环语句。它允许您迭代多个级别的数据结构或执行多个维度的重复任务。这段代码的输出将是一个从1到10的乘法表,行和列表示相乘的数字,表中的值表示它们的乘积。5. 重复步骤2—4,直到满足外循环条件。3. 在内部循环中执行所需的操作。2. 在外循环内,启动内循环。

2023-11-25 15:05:14 442

原创 常见的C语言标准库函数以及语法格式

sin(), cos(), tan(): 计算三角函数。- ceil(), floor():向上或向下舍入数字。- difftime():计算两个时间值之间的差值。- strftime():将时间值格式化为字符串。- strtok():将字符串标记成更小的部分。- realloc():更改动态分配的内存大小。- scanf():从控制台读取格式化的输入。- time():获取当前时间(以秒为单位)。- strlen():获取字符串的长度。- sqrt():计算一个数字的平方根。

2023-11-24 10:29:25 452 1

原创 蛮力算法的实际应用案例

虽然暴力破解是一种简单明了的方法,但它的计算成本可能很高且耗时,尤其是对于更长和更复杂的密码。但是,在密码空间相对较小的情况下,或者没有额外的安全措施来防止多次登录尝试时,暴力破解可能是恢复或猜测密码的实用选项。它将以“aaaaaa”开头,然后移动到“aaaaab”、“aaaaac”等,直到到达“zzzzzz”或找到正确的密码。在这种情况下,暴力破解算法会系统地生成并测试所有可能的密码组合,直到找到正确的密码组合。暴力破解是一种简单而详尽的方法,用于尝试所有可能的字符组合以找到正确的密码。

2023-11-19 09:48:20 36

原创 算法之蛮力算法

然而,对于较大的问题大小或复杂的场景,蛮力算法的计算成本很高,效率也很低。因此,蛮力算法常常被更有效的技术所取代,如动态规划、贪婪算法或基于启发式的方法。蛮力算法是一种直接的解决问题的方法,它涉及到考虑和评估每一个可能的解决方案或组合,以便找到所需的结果。这是一种简单而详尽的方法,可以系统地尝试所有的可能性,而不需要任何优化或修剪。在蛮力算法中,所有的潜在解都是逐个检查的,并根据特定的准则或条件来确定最优解。尽管它的局限性,蛮力算法是有价值的,因为它们的简单性和保证找到一个最优解时,正确应用。

2023-11-16 14:26:32 37 1

原创 51单片机红外遥控接收信号

在 ISR 中,您将根据您使用的协议捕获和解码接收到的 IR 信号。注意:确切的代码实现将取决于使用的特定微控制器、IR 接收器模块和 IR 协议。建议参考微控制器和 IR 接收器模块制造商提供的数据表、文档或示例代码,了解与 IR 信号接收相关的具体指导和代码示例。2. 初始化必要的外设:配置微控制器的定时器和中断,以捕获和处理传入的红外信号。您可能需要设置一个定时器来测量 IR 脉冲和中断之间的时间间隔,以处理接收到的数据。6. 处理接收到的数据:解码红外信号后,您可以根据接收到的数据执行所需的操作。

2023-11-13 22:00:12 201

原创 数据结构与算法中的“贪心“算法

贪心算法在每一步总是选择当前状态下最好/最优的选择(局部最有利的选择),希望通过这种策略,最后得到的问题整体解决方案也是最优的。在以上步骤中,我们每一步都采取了当前看来最好的选择(尽可能使用大面额的货币),最终得到了可行的找零方案。1.可选项是比31元面值更小的货币,包括1元,5元,10元和20元。3.从剩下的可选项中拿出最大的10元,剩下11-10=1元。2.从可选项中拿出最大的20元,剩下31-20=11元。4.从剩下的可选项中拿出最大的1元,剩下1-1=0元。

2023-11-07 14:46:57 22

原创 算法中的动态规划问题

动态规划是计算机编程和数学中使用的一种解决问题的技术,通过将复杂问题分解为重叠的子问题来有效地解决复杂问题。动态规划被广泛用于解决优化问题,例如在图中寻找最短路径、确定函数的最大值或最小值,或解决与序列对齐、背包问题和资源分配相关的问题。2.最优子结构:可以从其子问题的最优解中构造出问题的最优解。换言之,问题的最优解包含其子问题的最优解。3.定义计算顺序:确定子问题应解决的顺序,以确保每个子问题在解决另一个子问题之前得到解决。2. 递归定义最优解的值:用最优解的子问题的值来表示最优解的值。

2023-11-05 14:28:09 20 1

原创 数字三角形

a : b;i < N;i++) {j

2023-11-01 19:59:30 29 1

原创 二进制数的位运算

由此,我们可以看出,<<运算n位,就是将该数最左边的n位移出去,再将右边空出来的n位全部补上0。同理,>>运算n位,就是将该数右边的n位移出去,再将左边空出来的n位补上0,即可得到正确的结果。&运算就是将两个数的每一位分别进行运算,如果两个数相同,只要不是全部为1,结果即为0。进行>>2运算 得到0000 1111。进行<<1运算 得到0111 1000。|运算只要有一个1,结果即为1。例如0011 1100。

2023-10-29 23:09:26 34

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除