【数据结构与算法】【小白也能学的数据结构与算法】迭代算法专题

 🎉🎉欢迎光临🎉🎉

🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀

🌟特别推荐给大家我的最新专栏《数据结构与算法:初学者入门指南》📘📘

本专栏纯属为爱发电永久免费!!!

这是苏泽的个人主页可以看到我其他的内容哦👇👇

努力的苏泽icon-default.png?t=N7T8http://suzee.blog.csdn.net

目录

迭代算法,这是一种解决问题的强大工具。通过迭代,我们可以重复应用一组规则或操作来解决复杂的问题。本文将从基础的迭代概念开始,逐步介绍迭代算法的不同应用和技巧

1. 迭代的基础概念

2. 迭代的高级技巧

3. 迭代算法的应用


迭代算法,这是一种解决问题的强大工具。通过迭代,我们可以重复应用一组规则或操作来解决复杂的问题。本文将从基础的迭代概念开始,逐步介绍迭代算法的不同应用和技巧

1. 迭代的基础概念

在计算机科学中,迭代是指通过多次重复应用一组规则或操作来解决问题的方法。它通常与循环结构紧密相关,通过迭代可以逐步改变问题的状态,直到达到所需的结果。

例如,考虑计算一个数组中所有元素的和。使用迭代的方法,我们可以通过循环遍历数组中的每个元素,并将其累加到一个变量中,最终得到总和。

下面是一个使用迭代计算数组元素和的示例代码:

def compute_sum(array):total = 0for num in array:total += numreturn total# 测试代码
my_array = [1, 2, 3, 4, 5]
result = compute_sum(my_array)
print("The sum of the array is:", result)

在上述示例中,我们定义了一个compute_sum函数,接受一个数组作为输入,并使用迭代的方法计算数组元素的总和。通过循环遍历数组中的每个元素,并将其累加到变量total中,我们最终得到了数组的总和。

2. 迭代的高级技巧

除了基本的迭代概念外,还有一些高级的迭代技巧可以帮助我们解决更复杂的问题。以下是其中几种常见的技巧:

双指针迭代:在某些情况下,我们可以使用两个指针分别指向序列中的不同位置,并根据特定的规则移动这些指针来解决问题。例如,在查找排序数组中的两个数之和等于目标值的问题中,我们可以使用两个指针从序列的两端向中间移动。

def two_sum(nums, target):left = 0right = len(nums) - 1while left < right:sum = nums[left] + nums[right]if sum == target:return [nums[left], nums[right]]elif sum < target:left += 1else:right -= 1return []# 测试代码
nums = [2, 7, 11, 15]
target = 9
result = two_sum(nums, target)
print("The two numbers with sum equal to", target, "are:", result)

在上述示例中,我们定义了一个two_sum函数,接受一个排序数组nums和目标值target作为输入。我们使用两个指针leftright分别指向数组的开头和末尾,并根据特定的规则移动这些指针。

如果指针所指的两个数之和等于目标值target,则返回这两个数。如果和小于目标值,则将left指针向右移动一位;如果和大于目标值,则将right指针向左移动一位。通过这种方式,我们逐步缩小搜索范围,直到找到满足条件的两个数或搜索范围为空。

 

迭代与递归的结合:有时候,我们可以将迭代与递归结合使用,以便更好地解决问题。例如,在树的遍历问题中,我们可以使用迭代的方式来模拟递归的过程,从而避免使用递归函数的系统调用开销。

class TreeNode:def __init__(self, value):self.val = valueself.left = Noneself.right = Nonedef preorder_traversal(root):if root is None:return []stack = []result = []node = rootwhile node or stack:while node:result.append(node.val)stack.append(node)node = node.leftnode = stack.pop()node = node.rightreturn result# 测试代码
root = TreeNode(1)
root.right = TreeNode(2)
root.right.left = TreeNode(3)result = preorder_traversal(root)
print("The preorder traversal of the tree is:", result)

在上述示例中,我们定义了一个TreeNode类来表示树的节点,其中包含值val、左子节点left和右子节点right

我们使用迭代的方式来实现树的前序遍历。首先,我们定义一个栈stack用于保存待访问的节点。我们从根节点开始,将根节点入栈。然后,不断迭代执行以下步骤:

  • 弹出栈顶节点,并将其值添加到结果列表中。
  • 将栈顶节点的右子节点入栈(如果存在)。
  • 将栈顶节点的左子节点入栈(如果存在)。

通过这种方式,我们模拟了递归的过程,同时避免了使用递归函数的系统调用开销。

 

迭代与动态规划:迭代与动态规划经常结合使用,以解决一些具有最优子结构性质的问题。通过迭代计算和存储子问题的解,我们可以避免重复计算,提高算法效率。

def fibonacci(n):if n == 0:return 0if n == 1:return 1dp = [0] * (n + 1)dp[0] = 0dp[1] = 1for i in range(2, n + 1):dp[i] = dp[i - 1] + dp[i - 2]return dp[n]# 测试代码
n = 6
result = fibonacci(n)
print("The", n, "th Fibonacci number is:", result)

我们使用迭代的方式,通过动态规划来避免重复计算。

我们使用一个数组dp来存储计算过的斐波那契数。首先,我们初始化dp[0]dp[1]分别为0和1。然后,我们从dp[2]开始,通过迭代计算dp[i] = dp[i - 1] + dp[i - 2],直到计算到第n个斐波那契数dp[n]

通过这种方式,我们避免了重复计算,提高了算法效率。

3. 迭代算法的应用

迭代算法在各种数据结构和算法中都有广泛的应用。以下是一些常见的迭代算法应用:

  • 链表和数组的遍历:通过迭代,我们可以逐个访问链表或数组中的元素。

  • 图的遍历:通过迭代,我们可以访问图中的所有节点和边。

  • 排序算法:许多排序算法,如冒泡排序、插入排序和快速排序,都使用了迭代的思想。

  • 搜索算法:许多搜索算法,如深度优先搜索(DFS)和广度优先搜索(BFS),也使用了迭代的方法。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/464463.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

InternLM大模型实战-3.InternLM+Langchain搭建知识库

文章目录 前言笔记正文大模型开发范式RAGFinetune LangChain简介构建向量数据库搭建知识库助手1 InternLMLangchain2 构建检索问答链3 优化建议 Web Demo 部署搭建知识库 前言 本文是对于InternLM全链路开源体系系列课程的学习笔记。【基于 InternLM 和 LangChain 搭建你的知识…

SpringCloud-高级篇(十九)

我们已经学过使用 SpringAMQP去收和发消息&#xff0c;但是发和收消息是只是MQ最基本的功能了&#xff0c;在收发消息的过程中&#xff0c;会有很多的问题需要去解决&#xff0c;下面需要学习rabbitMQ的高级特性去解决 死信交换机&#xff1a;这个可以帮助我们实现消息的延迟的…

云计算运维 · 第三阶段 · 代码上线案例

学习b记 第三阶段 持续集成案例 这一章做一个小的案例&#xff0c;git、gitlab、jenkins、sonarqube、maven、shell把这周学的一整个流程串联起来做一个完整的代码发布流程案例&#xff0c;这一部分东西比较多&#xff0c;相对于之前的笔记这个会做的仔细一点。#嘿嘿回家就是…

AI大模型学习笔记之四:生成式人工智能(AIGC)是如何工作的?

OpenAI 发布 ChatGPT 已经1年多了&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;也已经广为人知&#xff0c;我们常常津津乐道于 ChatGPT 和 Claude 这样的人工智能系统能够神奇地生成文本与我们对话&#xff0c;并且能够记忆上下文情境。 Midjunery和DALLE 这样的AI…

ERROR: Could not build wheels for roslz4

Python bugs 最近在安装python的rosbag包时出现了诸多问题&#xff0c;特别记录下。 python版本&#xff1a;3.11 系统版本&#xff1a;Windows10 x86_64 使用conda虚拟环境进行包管理。 运行命令 pip3 install roslz4 --extra-index-url https://rospypi.github.io/simple…

奇异值分解(SVD)的应用——图像压缩

SVD方法是模型降阶的一类重要方法&#xff0c;本征正交分解&#xff08;POD&#xff09;和平衡截断&#xff08;BT&#xff09;都属于SVD类方法。 要想深入了解模型降阶技术&#xff0c;我们可以先从SVD的应用入手&#xff0c;做一个直观的了解。 1. SVD的定义和分类 我们想寻找…

【学网攻】 第(25)节 -- 帧中继(多对一)

系列文章目录 目录 系列文章目录 文章目录 前言 一、帧中继是什么&#xff1f; 二、实验 1.引入 实验目标理解帧中继在广域网中的原理及功能&#xff1b; 实验背景 技术原理 实验步骤 实验设备 实验拓扑图​编辑 实验配置 实验验证 文章目录 【学网攻】 第(1)节…

华为 huawei 交换机 接口 MAC 地址学习限制接入用户数量 配置示例

目录 组网需求: 配置思路&#xff1a; 操作步骤&#xff1a; 配置文件&#xff1a; 组网需求: 如 图 2-14 所示&#xff0c;用户网络 1 和用户网络 2 通过 LSW 与 Switch 相连&#xff0c; Switch 连接 LSW 的接口为GE0/0/1 。用户网络 1 和用户网络 2 分别属于 VLAN10 和 V…

c++之说_14|左值引用与右值引用

提起左右值引用我就头疼 左值&#xff1a; 1、在内存中开辟了空间的便叫左值 2、左值不一定可以赋值 如字符串常量 3、左值可以取地址 右值&#xff1a; 1、在内存中没有开辟空间的 2、右值无法取地址 如&#xff1a; 立即数&#xff08;1&#xff0c;2&#xff0c;3…

前后端分离nodejs+vue动态网站的图书借阅管理系统35ih5

读者模块 1)注册&#xff1a;读者输入账号、密码、确认密码、姓名、手机、身份证、邮箱&#xff0c;点击注册按钮&#xff0c;完成注册。 2)登录&#xff1a;普通读者成功输入读者账号和密码&#xff0c;点击登录按钮。 3)读者主页面&#xff1a;读者登录成功后&#xff0c;选择…

React - 分页插件默认是英文怎么办

英文组件的通用解决方案 这里以分页插件为例&#xff1a; 大家可以看到&#xff0c;最后的这个页面跳转提示文字为Go to&#xff0c;不是中文&#xff0c;而官网里面的案例则是&#xff1a; 解决方案&#xff1a; import { ConfigProvider } from antd; import zhCN from an…

【Linux】信号概念与信号产生

信号概念与信号产生 一、初识信号1. 信号概念2. 前台进程和后台进程3. 认识信号4. 技术应用角度的信号 二、信号的产生1. 键盘组合键2. kill 命令3. 系统调用4. 异常&#xff08;1&#xff09;观察现象&#xff08;2&#xff09;理解本质 5. 软件条件闹钟 一、初识信号 1. 信号…