枚举思想——算法学习(一)

news/2024/12/19 17:48:22/文章来源:https://www.cnblogs.com/CloverJoyi/p/18617699

枚举思想——算法学习(一)


前言

在算法学习的道路上,枚举思想是一种简单却强大的思想。作为一种暴力求解方法,枚举算法通过穷尽所有可能的解,从中找到满足条件的最优解或所有解。虽然它看似“低效”,但在解决许多实际问题时却显得直观且有效,尤其是在问题规模可控的情况下。

(本文代码均使用C#语言)

概念

枚举是一种通过穷举所有可能的情况来解决问题的算法思想。它的核心在于全面性简单性:即按照某种规则,逐一列举出问题的所有可能解,然后通过判断筛选出符合条件的解。

枚举的特点

  1. 直观易懂
    枚举算法通常不需要复杂的数学推导或高级技巧,直接通过遍历所有可能情况即可解决问题,因此非常适合初学者理解和使用。

  2. 适用范围广
    枚举可以用于许多场景,例如搜索所有排列、组合、子集,验证某种结构或解决约束满足问题(CSP)。

  3. 时间复杂度高
    由于需要遍历所有可能的解,枚举的时间复杂度通常较高,容易随着问题规模的增加而变得不可接受,因此一般用于规模较小的问题

枚举算法的核心步骤

  1. 定义解空间
    明确所有可能的解构成的范围。解空间可以是一个排列、一组数字的组合,甚至是一个几何图形。

  2. 遍历解空间
    通过循环或递归的方式,逐一生成所有可能的解。

  3. 判断筛选
    对每个可能的解进行判断,筛选出符合问题条件的解。

解空间

解空间是所有可能解构成的集合,等于其相关变量值域的笛卡尔积

最大/最小值问题

枚举法是列举解空间中的所有元素,以找到问题的合法解或最优解

问题形式一般为:给定一组数字,输出其中最大/最小的数字

例题

例:

解答

本题使用枚举思想求解,首先定义一个最大值max,然后将max置为最小,然后枚举所有数据与max进行比较,若大于max则将max更新为此数,若小于max则比较下一个。

代码

using System;class Test
{static void Main(string[] args) {var input = Console.ReadLine();var n =int.Parse(input);input = Console.ReadLine();string[] inputs=input.Split(' ');//将输入的字符串按空格分隔保存为数组int[] a= new int[n];for(int i = 0; i < n; i++) {a[i]=int.Parse(inputs[i]);}int max=int.MinValue;for(int i = 0; i < n; ++i) {if (a[i]>max)max = a[i];}Console.Write(max);}}

分析

  1. 解空间:对于最大值问题,解空间为数组元素的下标组成的集合{ 1 , 2 , ... , n },是一个1维的解空间
  2. 时间复杂度:O( n )

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

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

相关文章

20222307 2024-2025-1 《网络与系统攻防技术》实验八实验报告

1.实验内容 (1)Web前端HTML 能正常安装、启停Apache。理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML。 (2)Web前端javascipt 理解JavaScript的基本功能,理解DOM。 在(1)的基础上,编写JavaScript验证用户名、密码的规则。在用户点击登陆按钮后回显“欢迎+…

《Django 5 By Example》读后感

一、 为什么选择这本书? 本人的工作方向为Python Web方向,想了解下今年该方向有哪些新书出版,遂上packt出版社网站上看了看,发现这本书出版时间比较新(2024年9月),那就它了。 从2024年11月11日至2024年12月18日期间,花了 22 天阅读完《Django 5 By Example》(《Django项目…

面向对象编程,类和对象

类的关键词 Class 类一般申明在namespace中,枚举和struct一般也在namespace中申明 类的申明语法(类前面可以加访问修饰符) class 类名 {特征——成员变量行为——成员方法保护特征——成员属性构造函数和析构函数索引器运算符重载静态成员 }类申明实例 命名使用帕斯 在同一个…

mysql mysqldump 定时备份

mysqldump方式备份Windows 一、创建bat 任务脚本 ⚠️ 内容背后不能有中文空格,否则会运行失败 新建 bat 脚本复制以下内容,安装自己的需求对内容进行修改@echo off::命令行窗口中显示此条信息 @echo 开始备份数据库::将hour设置为此刻小时位的时间,从0位置开始取2位 set h…

OCS2::ocs2_centroidal_model_质心动量模型

1. ModelHelperFunctions.cpp 1.1 updateCentroidalDynamics() : 质心动力学更新 template <typename SCALAR_T> void updateCentroidalDynamics(PinocchioInterfaceTpl<SCALAR_T>& interface, const CentroidalModelInfoTpl<SCALAR_T>& info,const …

密码学-古典密码

密码学-古典密码 前言 古典密码学(Classic cryptography)和现代密码学(Modern cryptography)的主要差别在于计算机的使用,一般来说,古典密码学是基于字符的,而现代密码学是基于二进制位的。 代换 代换密码是将明文中的字符替代成其他字符,即替代转换,若整个加密过程中…

【笔记】组合数学初步

一些初等的组合数学知识二项式系数 定义: 我们在高中时常见的二项式系数的形式是 \[C_{n}^{k} = \frac{n!}{k!(n-k)!} \]但下文将采用如下的定义: \[\binom{n}{k} = \begin{cases}\dfrac{n^{\underline{k}}}{k!} & k \ge 0\\\\0 & k < 0\end{cases} \]注意这里对 …

翻转字符串翻转单词

一、翻转字符串问题描述 请实现⼀个算法,在不使⽤额外数据结构和储存空间的情况下,翻转⼀个给定的字符串(可以使⽤单个过程变量)。 解题思路 由于不允许使用额外的数据接口和存储空间,所以我们将⼀个字符串以中间字符为轴,前后翻转,也就是将str[len]赋值给str[0],将str[0…

拒绝 Helm? 如何在 K8s 上部署 KRaft 模式 Kafka 集群?

首发:运维有术 今天分享的主题是:不使用 Helm、Operator,如何在 K8s 集群上手工部署一个开启 SASL 认证的 KRaft 模式的 Kafka 集群? 本文,我将为您提供一份全面的实战指南,逐步引导您完成以下关键任务:配置 Kafka Secret:管理用户密码和集群 ID 配置 Kafka Service:使…

Vulnhub 靶场 Jetty: 1

前期准备 靶机地址:https://www.vulnhub.com/entry/jetty-1,621/ Description Back to the Top The company Aquarium Life S.L. has contacted you to perform a pentest against one of their machines. They suspect that one of their employees has been committing frau…

人车防碰撞识别智慧矿山一体机矿山监控系统中的平台一体机和解码器如何选型?

在构建高效、可靠的视频监控系统时,选择合适的平台一体机和解码器是至关重要的一步。这不仅关系到监控系统的稳定性和可靠性,还直接影响到监控画面的清晰度和系统的扩展性。以下是在选择过程中需要考虑的关键因素,以确保您的监控系统能够满足特定场景的需求,并在未来几年内…