算法 | 刷题日记

server/2024/12/23 7:06:43/

1.递归通常是用栈来实现的

递归在其本质上是通过函数调用栈(Call Stack)来实现的,而不是队列(Queue)。当你调用一个函数时,该函数的局部变量、参数和返回地址会被压入(push)到一个由系统维护的调用栈中。当函数执行完毕后,这些数据会被从栈中弹出(pop),并且控制权会返回给调用者。

递归函数调用也遵循同样的模式:当一个函数(假设我们称其为A)内部调用了它自己或者另一个函数(假设我们称其为B,而B又调用了A,形成了递归),每次函数调用都会将其状态压入调用栈。当递归到达基线条件(Base Case)并开始返回时,每个函数的状态会从栈中弹出,直到最初的调用者得到结果。

队列通常用于实现迭代算法,如广度优先搜索(BFS)等。在BFS中,队列用于存储待处理的节点,并按照它们被添加到队列中的顺序进行处理。这与递归的深度优先搜索(DFS)形成对比,DFS使用栈(或隐式的函数调用栈)来按照后进先出(LIFO)的顺序处理节点。

虽然技术上可以使用队列和显式栈来模拟递归行为(例如,通过迭代实现递归算法),但这样做通常会使代码更复杂,并可能牺牲递归提供的清晰性和简洁性。然而,在某些情况下,例如处理深度非常大的递归树或需要避免栈溢出的场景,使用迭代和显式栈可能是有益的。

2.优先队列用堆来实现

优先队列(Priority Queue)的实现通常选择堆(Heap)作为其底层数据结构,而不是普通队列(Queue)。以下是几个关键原因:

  1. 数据结构和操作特性
    • 普通队列(Queue)遵循先进先出(FIFO)的原则,即最先进入队列的元素将最先被移除。
    • 优先队列(Priority Queue)则允许元素具有优先级,优先级最高的元素将最先被移除,这体现了最高级先出(first in, largest out 或 first in, smallest out,取决于优先级的定义)的行为特征。
  2. 堆的性质
    • 堆是一种特殊的树形数据结构,它可以被看作是完全二叉树或近似完全二叉树。
    • 堆总是满足堆属性:父节点的值总是大于或等于(最大堆)或小于或等于(最小堆)其子节点的值。
    • 堆提供了快速访问最大或最小元素(即堆顶元素)的能力,并且可以在对数时间内完成插入和删除操作。
  3. 实现优先队列
    • 由于堆提供了高效的插入和删除最大/最小元素的操作,因此它非常适合用于实现优先队列。
    • 当有新元素需要插入到优先队列中时,可以直接将其插入到堆中,并重新调整堆以保持堆属性。
    • 当需要从优先队列中移除最高优先级的元素时,可以直接移除堆顶元素,并重新调整堆。
  4. 代码示例和设置
    • 在C++的STL(Standard Template Library)中,priority_queue容器就是一个典型的优先队列实现,其底层就是使用堆。
    • 通过设置priority_queue的第三个模板参数(比较类),可以定义队列中元素的优先级。例如,使用greater<int>可以使队列成为小根堆,这样数字小的元素优先级更高;而默认是大根堆,数字大的元素优先级更高。

综上所述,优先队列通常使用堆作为其底层数据结构,以提供高效的插入和删除最高/最低优先级元素的操作。

3.当上下限表达式相等时,我们使用下列哪种表示法来描述算法代价? 

Θ表示法(Theta notation)用于描述算法的紧确界限,即它同时表示了算法的上限和下限复杂度。当算法的上下限复杂度相同时,Θ表示法是最合适的。 


http://www.ppmy.cn/server/47412.html

相关文章

面试高频问题----2

一、进程、线程、协程有什么区别&#xff1f; 1.进程&#xff1a;进程是操作系统中独立运行的程序实例&#xff0c;每个进程都有自己的内存空间和系统资源&#xff1b;进程之间相互独立&#xff0c;每个进程有自己的内存地址空间&#xff0c;一个进程无法直接访问另一个进程的…

PX4 ROS2 真机

如果仿真跑通了。 真机遇到问题&#xff0c;可参考此文章。 ubuntu22 px4 1.14.3 ros2 humble 硬件接线。 先找两个usb - ttl串口&#xff0c;分别接到两台主机上&#xff0c;保证串口通信正常。 图中是个六合一的。浪费一天时间&#xff0c;发现是串口设置错误&#xff…

学习小心意——简单的循坏语句

for循坏 基本语法格式 for 变量 in 序列:代码块 示例代码如下 for i in range(10):print(i)#输出结果:0 1 2 3 4 5 6 7 8 9 简单案例代码如下 利用for语句遍历序列 # 遍历字符串打印每个字母 for letter in "python":print(letter)# 遍历列表并打印每个元素 a …

C语言:IO操作

引言 I/O操作是一切实现的基础。IO即为input &output 标准IO&#xff08;stdio&#xff09; FILE类型贯穿始终&#xff0c;FILE是由typedef定义出来的 vii /usr/include/asm-generic/errno-base.h (errno定义的位置) /usr/include/x86_64-linux-gnu/bits/types/struct…

HTML label 标签的作用和应用场景

label 标签 作用和语法 label 标签来定义表单控制间的关系&#xff0c;当用户点击该标签时&#xff0c;浏览器会自动将焦点转到和标签相关的表单控件上。 <label for"Name">Number:</label> <input type“text“ name"Name" id"Name…

在 DE2-115 开发板上使用 Chisel 编写流水灯程序

在 DE2-115 开发板上使用 Chisel 编写流水灯程序 步骤1&#xff1a;打开Quartus II软件步骤2&#xff1a;编写Verilog代码步骤3&#xff1a;配置项目步骤4&#xff1a;分配引脚步骤5&#xff1a;编译项目步骤6&#xff1a;下载比特流到FPGA步骤7&#xff1a;测试流水灯注意事项…

AdminController

目录 1、 AdminController 1.1、 Students 1.2、 StudentDetail 1.3、 EnrolledStudent AdminController using ITM_College.Data; using ITM_College.Models; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; namespace ITM_College.Cont…

小鸡庄园智慧农场养殖游戏开发:科技与农业的完美结合

随着科技的进步&#xff0c;一种全新的游戏模式——智慧农场养殖游戏&#xff0c;正在逐渐崭露头角。本文将深入探讨小鸡庄园智慧农场养殖游戏的开发背景、特点、技术实现方式以及未来的发展趋势&#xff0c;以期为游戏产业创新和农业现代化提供新的思路和启示。 一、开发背景…