3.数组算法、动态规划

文章目录

  • 数组算法
    • 1.数组表示
    • 2.基本操作
    • 3.插入操作
      • 算法
      • 实例1
      • 实例2
      • 输出
    • 3.删除操作
      • 算法
      • 实例1
      • 输出
    • 4.搜索操作
      • 算法
      • 实例2
      • 输出
    • 5.更新操作
      • 算法
      • 实3例
      • 输出
  • 2.动态规划
    • 对照
      • 实例1

数组算法

Array是一个容器,可以容纳固定数量的项目,这些项目应该是相同的类型。大多数数据结构都使用数组来实现其算法。以下是理解Array概念的重要术语。

  • 元素 - 存储在数组中的每个项称为元素。
  • 索引 - 数组中元素的每个位置都有一个数字索引,用于标识元素。

1.数组表示

可以使用不同语言以各种方式声明数组。为了说明,我们采取C数组声明。

在这里插入图片描述

可以使用不同语言以各种方式声明数组。为了说明,我们采取C数组声明。

)

根据以上说明,以下是要考虑的重点。

  • 索引从0开始。
  • 数组长度为10,这意味着它可以存储10个元素。
  • 可以通过索引访问每个元素。例如,我们可以将索引6处的元素提取为9。

2.基本操作

以下是数组支持的基本操作。

  • 遍历 - 逐个打印所有数组元素。
  • 插入 - 在给定索引处添加元素。
  • 删除 - 删除给定索引处的元素。
  • 搜索 - 使用给定索引或值搜索元素。
  • 更新 - 更新给定索引处的元素。

在C中,当使用size初始化数组时,它会按以下顺序为其元素分配默认值。

数据类型默认值
布尔
烧焦0
INT0
浮动0.0
0.0F
空虚
wchar_t的0

3.插入操作

插入操作是将一个或多个数据元素插入到数组中。根据需求,可以在开头,结尾或任何给定的数组索引处添加新元素。

在这里,我们看到插入操作的实际实现,我们在数组的末尾添加数据 -

算法

ArrayMAX 元素的线性无序数组。

实例1

结果

LA 是一个线性阵列(无序的)与 Ñ 元件和 ķ 是一个正整数,使得 ķ <= N。以下是将ITEM插入洛杉矶第 K 个位置的算法-

1. Start
2. Set J = N
3. Set N = N+1
4. Repeat steps 5 and 6 while J >= K
5. Set LA[J+1] = LA[J]
6. Set J = J-1
7. Set LA[K] = ITEM
8. Stop

实例2

以下是上述算法的实现 -

#include <stdio.h>

main() {
   int LA[] = {1,3,5,7,8};
   int item = 10, k = 3, n = 5;
   int i = 0, j = n;

   printf("The original array elements are :\n");

   for(i = 0; i<n; i++) {
      printf("LA[%d] = %d \n", i, LA[i]);
   }

   n = n + 1;

   while( j >= k) {
      LA[j+1] = LA[j];
      j = j - 1;
   }

   LA[k] = item;

   printf("The array elements after insertion :\n");

   for(i = 0; i<n; i++) {
      printf("LA[%d] = %d \n", i, LA[i]);
   }
}

当我们编译并执行上述程序时,它会产生以下结果 -

输出

The original array elements are :
LA[0] = 1
LA[1] = 3
LA[2] = 5
LA[3] = 7
LA[4] = 8
The array elements after insertion :
LA[0] = 1
LA[1] = 3
LA[2] = 5
LA[3] = 10
LA[4] = 7
LA[5] = 8

3.删除操作

删除是指从数组中删除现有元素并重新组织数组的所有元素。

算法

考虑 LA 是一个线性阵列 Ñ 元件和 ķ 是一个正整数,使得 ķ <= N。以下是删除在LA的第 K 个位置可用的元素的算法。

1. Start
2. Set J = K
3. Repeat steps 4 and 5 while J < N
4. Set LA[J] = LA[J + 1]
5. Set J = J+1
6. Set N = N-1
7. Stop

实例1

以下是上述算法的实现

#include <stdio.h>

void main() {
   int LA[] = {1,3,5,7,8};
   int k = 3, n = 5;
   int i, j;

   printf("The original array elements are :\n");

   for(i = 0; i<n; i++) {
      printf("LA[%d] = %d \n", i, LA[i]);
   }

   j = k;

   while( j < n) {
      LA[j-1] = LA[j];
      j = j + 1;
   }

   n = n -1;

   printf("The array elements after deletion :\n");

   for(i = 0; i<n; i++) {
      printf("LA[%d] = %d \n", i, LA[i]);
   }
}

当我们编译并执行上述程序时,它会产生以下结果 -

输出

The original array elements are :
LA[0] = 1
LA[1] = 3
LA[2] = 5
LA[3] = 7
LA[4] = 8
The array elements after deletion :
LA[0] = 1
LA[1] = 3
LA[2] = 7
LA[3] = 8

4.搜索操作

您可以根据数组元素的值或索引搜索数组元素。

算法

考虑 LA 是一个线性阵列 Ñ 元件和 ķ 是一个正整数,使得 ķ <= N。以下是使用顺序搜索查找具有ITEM值的元素的算法。

1. Start
2. Set J = 0
3. Repeat steps 4 and 5 while J < N
4. IF LA[J] is equal ITEM THEN GOTO STEP 6
5. Set J = J +1
6. PRINT J, ITEM
7. Stop

实例2

以下是上述算法的实现

#include <stdio.h>

void main() {
   int LA[] = {1,3,5,7,8};
   int item = 5, n = 5;
   int i = 0, j = 0;

   printf("The original array elements are :\n");

   for(i = 0; i<n; i++) {
      printf("LA[%d] = %d \n", i, LA[i]);
   }

   while( j < n){
      if( LA[j] == item ) {
         break;
      }

      j = j + 1;
   }

   printf("Found element %d at position %d\n", item, j+1);
}

当我们编译并执行上述程序时,它会产生以下结果 -

输出

The original array elements are :
LA[0] = 1
LA[1] = 3
LA[2] = 5
LA[3] = 7
LA[4] = 8
Found element 5 at position 3

5.更新操作

更新操作是指在给定索引处更新阵列中的现有元素。

算法

考虑 LA 是一个线性阵列 Ñ 元件和 ķ 是一个正整数,使得 ķ <= N。以下是更新在LA的第 K 个位置可用的元素的算法。

1. Start
2. Set LA[K-1] = ITEM
3. Stop

实3例

以下是上述算法的实现 -

#include <stdio.h>

void main() {
   int LA[] = {1,3,5,7,8};
   int k = 3, n = 5, item = 10;
   int i, j;

   printf("The original array elements are :\n");

   for(i = 0; i<n; i++) {
      printf("LA[%d] = %d \n", i, LA[i]);
   }

   LA[k-1] = item;

   printf("The array elements after updation :\n");

   for(i = 0; i<n; i++) {
      printf("LA[%d] = %d \n", i, LA[i]);
   }
}

当我们编译并执行上述程序时,它会产生以下结果 -

输出

The original array elements are :
LA[0] = 1
LA[1] = 3
LA[2] = 5
LA[3] = 7
LA[4] = 8
The array elements after updation :
LA[0] = 1
LA[1] = 3
LA[2] = 10
LA[3] = 7
LA[4] = 8

2.动态规划

动态编程方法类似于将问题分解为更小但更小的子问题的分而治之。但不同的是,分而治之,这些子问题并没有独立解决。相反,记住这些较小子问题的结果并用于类似或重叠的子问题。

动态编程用于我们遇到问题的地方,可以将其划分为类似的子问题,以便可以重复使用它们的结果。大多数情况下,这些算法用于优化。在解决现有子问题之前,动态算法将尝试检查先前解决的子问题的结果。结合子问题的解决方案以实现最佳解决方案。

所以我们可以说 -

  • 该问题应该能够分成较小的重叠子问题。
  • 通过使用较小子问题的最佳解决方案可以实现最佳解决方案。
  • 动态算法使用Memoization。

对照

与解决局部优化的贪婪算法相反,动态算法被激励用于问题的整体优化。

与分而治之的算法相比,其中解决方案被组合以实现整体解决方案,动态算法使用较小子问题的输出,然后尝试优化更大的子问题。动态算法使用Memoization来记住已经解决的子问题的输出。

实例1

使用动态编程方法可以解决以下计算机问题 -

  • 斐波纳契数系列
  • 背包问题
  • 河内塔
  • 由Floyd-Warshall完成的所有最短路径
  • Dijkstra的最短路径
  • 项目安排

动态编程可以自上而下和自下而上的方式使用。当然,大多数情况下,参考之前的解决方案输出比CPU周期重新计算更便宜。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

3.OSPF与BGP的联动

14.3实验3&#xff1a;OSPF与BGP联动配置 实验目的实验拓扑实验步骤 配置IP地址 AR1的配置 <Huawei>system-view Enter system view, return user view with CtrlZ. [Huawei]undo info-center enable Info: Information center is disabled. [Huawei]sysname AR1 …

我用Python django开发了一个商城系统,已开源,求关注!

起始 2022年我用django开发了一个商城的第三方包&#xff0c;起名为&#xff1a;django-happy-shop。当时纯粹是利用业余时间来开发和维护这个包&#xff0c;想法也比较简单&#xff0c;Python语言做web可能用的人比较少&#xff0c;不一定有多少人去关注&#xff0c;就当是一个…

python flask项目部署

flask上传服务器pyhon安装下载Anacondasudo wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-5.3.1-Linux-x86_64.sh可根据需要安装对应的版本https://repo.anaconda.com/archive/解压anaconda压缩包bash Anaconda3-5.3.1-Linux-x86_64.sh解压过程中会…

电路基础_模拟电路_问答_2023_01

模拟电路 &#xff08;数学、电路、编程、信号处理&#xff09; 模拟电路的历史可以追溯到19世纪初&#xff0c;当时电学理论才刚刚开始发展。经过多年的研究和实践&#xff0c;一些重要的电学定律和基本电路结构被发现和建立&#xff0c;如欧姆定律、基尔霍夫定律、戴维南-诺…

【Docker】MAC电脑下的Docker操作

文章目录安装Docker部署mysql 一主一从登录ChatGPT搞方案本地创建一个文件夹编辑docker-compose.yml文件启动检查并编排容器验证基于command的my.cnf配置的加载主数据库建一个用户给子数据库用于主从复制启动主从同步安装Docker 官网地址 https://www.docker.com/ 下载安装 验…

SQL注入之HTTP请求头注入

Ps&#xff1a; 先做实验&#xff0c;在有操作的基础上理解原理会更清晰更深入。 一、实验 sqli-lab 1. User-Agent注入 特点&#xff1a;登陆后返回用户的 User-Agent --> 服务器端可能记录用户User-Agent 输入不合法数据报错 payload: and updatexml(1,concat("~&…

浅谈计算机视觉HALCON视觉库识别车牌号

如图&#xff0c;使用HALCON视觉库识别车牌号&#xff0c;代码如下&#xff1a; dev_close_window () read_image (Image, ‘Q:/车牌.jpg’) get_image_size (Image, Width, Height) dev_open_window (0, 0, Width, Height, ‘black’, WindowHandle) dev_display (Image) *预…

Python解题 - CSDN周赛第40期

上期问哥没参加&#xff0c;但从赛后大家的反馈来看&#xff0c;又出现了数据上的bug&#xff0c;使用 python 的朋友会遇到第二个用例的柱子高度数组长度不够&#xff0c;200根柱子&#xff0c;只有179个数据&#xff0c;这让人怎么玩&#xff1f;但是用C的选手就没有这个问题…

Linux基础

环境搭建&#xff1a;linux安装、远程连接常用命令&#xff1a;文件、目录、拷贝、移动、打包、压缩、文本编辑安装软件&#xff1a;文件上传、jdk、tomcat、mysql项目部署&#xff1a;Java应用、Python应用、日志查看、系统管理、用户权限Linux是一套免费使用、自由传播的操作…

【C语言】柔性数组

柔性数组1. 柔性数组介绍2. 柔性数组特点3. 用例3.1 代码一&#xff1a;3.2 代码二&#xff1a;4. 柔性数组优势&#xff1a;1. 柔性数组介绍 也许你从来没有听说过柔性数组&#xff08;flexible array&#xff09;这个概念&#xff0c;但是它确实是存在的。 C99 中&#xff0c…

【数据结构】顺序表的深度刨剖析

前言&#xff1a;在上一篇文章中&#xff0c;我们已经对数据结构有了一定了解&#xff0c;我们可以通过优化空间复杂度或者时间复杂度从而提高我们程序运行或存储速率。至此我们就知道了数据结构的重要性&#xff0c;所以今天我们将要了解和学习一种实用的数据结构——线性表。…

批量保存网页为单个网页文件

有时候&#xff0c;总有会遇到一些奇怪的需求&#xff0c;各种搜索都找不到答案&#xff0c;本次记录批量保存网页到单个网页文件。使用背景&#xff1a;只想简单的解决问题&#xff0c;不涉及编程网页带格式,将网页存为PDF格式会变量太大&#xff0c;一个个的处理太累涉及技术…

【差分数组】

差分数组一维差分差分数组的作用差分矩阵结语一维差分 输入一个长度为 n 的整数序列。接下来输入 m个操作&#xff0c;每个操作包含三个整数 l,r,c&#xff0c;表示将序列中 [l,r] 之间的每个数加上 c &#xff0c;请你输出进行完所有操作后的序列。 输入格式 第一行包含两个…

Spring容器实现原理-Spring的结构组成与核心类

Spring容器基本用法 bean是Spring中最核心的东西&#xff0c;因为Spring就像是个大水桶&#xff0c;而bean就像是容器中的水&#xff0c;水桶脱离了水便没有什么用处了&#xff0c;让我们先看看bean的定义&#xff1a; /*** ClassName MyTestBean* Author jiaxinxiao* Date 2…

基于51单片机的室内湿度加湿温度声光报警智能自动控制装置设计

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;单片机湿度 获取完整无水印论文报告&#xff08;内含电路原理图和源程序代码&#xff09; 在日常生活中加湿器得到了广泛的应用&#xff0c;但是现有的加湿器都需要手工控制开启和关闭并且不具备对室内空气温湿度的监测&am…

【微信小程序】-- 页面导航 -- 编程式导航(二十三)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &…

chartgpt 告诉我的,loss 函数的各种知识

一、libtorch中常见的损失函数及其使用场景的总结1. CrossEntropyLoss:CrossEntropyLoss&#xff08;交叉熵损失&#xff09;主要用于分类任务。它适用于多分类问题&#xff0c;其中每个样本只属于一个类别&#xff08;互斥&#xff09;。该损失函数将预测概率与真实标签的one-…

Android DataBinding 自定义View实现数据双向绑定

看不懂的可以先看看单向数据绑定&#xff1a;Android DataBinding数据变化时自动更新界面_皮皮高的博客-CSDN博客 然后再确定已经启动了dataBinding的情况下&#xff0c;按下面的顺序来&#xff1a; 首先创建一个自定义View&#xff1a; import android.content.Context imp…

中国蚁剑AntSword实战

中国蚁剑AntSword实战1.基本使用方法2.绕过安全狗连接3.请求包修改UA特征伪造RSA流量加密4.插件使用1.基本使用方法 打开蚂蚁宝剑&#xff0c;右键添加数据&#xff1a; 输入已经上传马的路径和连接密码&#xff1a; 测试连接&#xff0c;连接成功&#xff01; GetShell了&…

【Linux】Linux下权限的理解

前言&#xff1a;在之前我们已经对基本的指令进行了深入的学习&#xff0c;接下来我将带领大家学习的是关于权限的相关问题。在之前&#xff0c;我们一直是使用的【root】用户&#xff0c;即为“超级用户”&#xff0c;通过对权限的学习之后&#xff0c;我们就会慢慢的切换到普…
最新文章