算法设计和分析1( 算法问题求解基础)

chapter1 算法问题求解基础

1.1算法概述

1.什么是算法

  1. 算法—用计算机实现的问题求解方法。
  2. 5个特征
    (1)输入:0或多个
    (2)输出:至少一个
    (3)确定性:算法每一条指令都有明确的定义
    (4)能行性:算法每一条指令必须足够基本,可以用=已实现的基本运算执行有限次来实现。
    (5)有穷性:有限步骤后终止
  3. 描述方法
    大白话、流程图、伪代码、程序设计语言

例1 计算两个整数的最大公约数(辗转相除法==欧几里得算法、连续整数检测算法)
用于计算两个整数m和n(0<=m<n)的最大公约数gcd(m,n).其计算过程是重复下列等式,直到n mod m=0.
gcd(m,n)=gcd(n mod m,m)
例如gcd(24,60)=gcd(12,24)=gcd(0,12)=12

程序1-1 欧几里得递归算法 (递归调用函数)

#include<iostream>
#include<algorithm>
using namespace std;//欧几里得递归算法void Swap(int &a,int &b)//用于交换两个数的函数,其实有内置的swap函数,注意要变量的引用
{int c=a;a=b;b=c;
}
int RGcd(int m,int n)//0<=m<n
{if(m==0)return n;return  RGcd(n%m,m);
}
int Gcd(int m,int n)
{if(m>n)Swap(m,n);return RGcd(m,n);
}
int main()
{int m,n;cin>>m>>n;cout<<Gcd(m,n);return 0;}

程序1-2 欧几里得迭代算法(循环

#include<bits/stdc++.h>
using namespace std;int Gcd(int m,int n)
{if(m==0)return n;if(n==0)return m;if(m>n)swap(m,n);//n中保存大的数while(m>0){int rem=n%m;n=m;m=rem;}return n;
}
int main()
{int m,n;cin>>m>>n;cout<<Gcd(m,n);return 0;}

连续整数检测算法
最大公约数定义:能够同时整除它们的最大正整数。因此最大公约数小于或等于两数中的较小者。t=min{m,n},然后检查t能否整除m和n ,若能,即为解;否则t–,继续检测

#include<bits/stdc++.h>
using namespace std;int Gcd(int m,int n)
{if(m==0)return n;if(n==0)return m;int t=m>n?n:m;while(m%t ||n%t)t--;return t;
}
int main()
{int m,n;cin>>m>>n;cout<<Gcd(m,n);return 0;}

2.为什么学习算法

重要重要重要
一个受过良好的计算机科学知识训练的人知道如何处理算法,即构造算法、操纵算法、理解算法和分析算法。算法远不只是为了编写好的计算程序,它是一种具有一般意义的智能工具,必定有助于对其他学科的理解。

1.2 问题求解方法

软件开发的过程----使用计算机求解问题的过程。
计算机解题的核心任务----设计算法

1.问题和问题求解

问题----与希望的目标不一致

2.问题求解过程

  1. 理解问题
  2. 设计方案
  • 何处着手,类似问题
  • 一些特殊示例进行分析
  1. 实现方案
  2. 回顾复查
  • 评估:改进、简化和推广

3.系统生命周期

系统生命周期:软件工程将软件开发和维护过程分成若干阶段。分析(做什么)、设计(如何做)、编码、测试和维护

1.3 算法设计和分析

1.算法问题求解过程

精确算法、启发式算法(可能更有效,但未必是最优解)

2.如何设计算法

学习基本算法
如合并排序和快速排序都可以视为分治法产生的排序算法,但二者是不同的算法。

3.如何表示算法

自然语言、流程图、伪代码、程序设计语言等,(下面主要用c/c++来描述)

4.如何确认算法

算法确认:对于所有的合法术后如,都能在有限时间输出预期结果。
算法证明:使用数学方法

5.如何分析算法

执行时间和所需空间

1.4 递归和归纳

重复性计算
(1)递归
(2)迭代
归纳法和递归关系密切,可以用归纳法证明递归算法的正确性。

1.递归

递归定义:直接或间接引用自身的定义方法。包括基础情况和递归部分

例1-1 斐波那契数列

F0=0,F1=1;
Fn=Fn-1+Fn-2;

需要注意的是,递归实现的斐波那契数列在计算过程中会存在大量的重复计算,效率较低。如果需要计算较大的斐波那契数列,建议使用迭代或动态规划的方法,可以避免重复计算,提高效率。

long Fib(int n)
{if(n<=1)return n;else return Fib(n-1)+Fib(n-2);
}

2.递归算法示例

例1-2 逆序输出整数的各位数 设有正整数n=12345,现希望逆序输出54321.
设k位整数为d1d2…dk,要得到dkdk-1…d1可以分两步:
(1)首先输出dk
(2)然后输出由前k-1位组成的正整数d1d2…dk-1

得到下面的递归程序

#include<bits/stdc++.h>
using namespace std;void PrintDigit(unsigned int n)
{cout<<n%10;if(n>=10)PrintDigit(n/10);
}
int main()
{unsigned int n;cin>>n;PrintDigit(n);return 0;
}

例1-3 汉诺塔问题
假定有三个塔座:x,y,z,在塔座上有n个直径不同的圆盘,它们按直径大小从小到大编号为1,2,…,n。现要求将x塔座上的n个圆盘移动到y上,并按相同的顺序叠排。移动时:
(1)每次只能移动一个圆盘
(2)圆盘可以加到塔座x、y、z中任意一个之上
(3)任何时刻都不能将一个较大的圆盘放在较小的圆盘之上

假定圆盘从小到大编号为1-n,移动圆盘的算法可以粗略地描述如下:
(1)以y为中介,将前n-1个圆盘从x移到z上
(2)将第n个圆盘移到y上
(3)以x为中介,将z上的n-1个圆盘移到y上

#include<bits/stdc++.h>
using namespace std;
enum tower{A='X',B='Y',C='Z'};
void Move(int n,tower x,tower y)
{//将第n个圆盘从x移到y的顶部cout<<"The disk "<<n<<" is moved from "<<char(x)<<" to top of tower "<<char(y)<<endl;
}
void Hanoi(int n,tower x,tower y,tower z)//将n个圆盘从x->y,z作为中介
{if(n){Hanoi(n-1,x,z,y);Move(n,x,y);Hanoi(n-1,z,y,x);}
}
int main()
{Hanoi(3,A,B,C);return 0;}

输出如下

The disk 1 is moved from X to top of tower Y
The disk 2 is moved from X to top of tower Z
The disk 1 is moved from Y to top of tower Z
The disk 3 is moved from X to top of tower Y
The disk 1 is moved from Z to top of tower X
The disk 2 is moved from Z to top of tower Y
The disk 1 is moved from X to top of tower Y

例1-4 产生各种可能的排列
给定n个自然数,{0,1,2,…n-1}的集合。设计一个算法,输出该集合所有可能的排列(permutation).n个自然数的集合有n!个不同的排列。

介绍一种求此问题的简单递归算法。

由四个自然数组成的排列通过以下方式构造:
(1)以0 开头,紧随其后为{1,2,3}的各种排列
(2)以1 开头,紧随其后为{0,2,3}的各种排列
(3)以2 开头,紧随其后为{0,1,3}的各种排列
(4)以3 开头,紧随其后为{0,1,2}的各种排列
语句(1)中“紧随其后为{1,2,3}的各种排列”实质上是求比原始问题少一个数的排列生成问题。相当于原题目,这是一个同类子问题,但规模小一些。意味着可用递归求解

template <class T>void Perm(T a[],int k,int n)
{if(k=n-1){for(int i=0;i<n;i++)//输出一种排列cout<<a[i]<<" ";}elsefor(int i=k;i<n;i++){T t=a[k];a[k]=a[i];a[i]=t;//产生{a[k],...a[n-1]}各种排列Perm(a,k+1,n);t=a[k];a[k]=a[i];s[i]=t;//产生{a[k+1],...a[n-1]}各种排列}
}

本章小结

递归是强有力的算法算法结构。

习题

1.写一个递归算法和一个迭代算法计算二项式系数。 Cnm=Cn-1m+Cn-1m-1=n!/m!(n-m)!

递归法

#include<bits/stdc++.h>
using namespace std;
int Combine(int m,int n)
{if(m==0||m==n)return 1;//注意递归出口,是一个确定的值else return Combine(m,n-1)+Combine(m-1,n-1);
}int main()
{int m,n;cin>>m>>n;cout<<Combine(m,n);return 0;}

迭代法是不是用一个数组保存结果呀,然后依次计算。

2.S是有n个元素的集合,S的幂集是S的所有可能的子集组成的集合。例如,S={a,b,c},S的幂集={{},{a},{b},{c},{a,b},{a,c},{b,c},{a,b,c}}.写一个递归函数,以S为输入,输出S的幂集。

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

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

相关文章

QCC发射(TX SOURCE)USB发射A2DP音乐,实现MIC声音到主机

之前写过 CSR8670/8675 发射&#xff08;TX SOURCE&#xff09;USB发射A2DP音乐&#xff0c;实现MIC声音到主机的文章&#xff0c;目前把该方案移植到QCC方案&#xff08;QCC3040 QCC3056&#xff09;。 因 CSR8670/8675成本比较贵&#xff0c;现在移植到QCC平台。 由于众多游…

Pytorch for training1——read data/image

blog torch.utils.data.Dataset create dataset with class torch.utils.data.Dataset automaticly import torch from torch.utils.data import Datasetclass MyDataset(Dataset):def __init__(self, data):self.data datadef __getitem__(self, index):# 根据索引获取样本…

一句命令pip卸载所有已安装库

pip3 list --formatfreeze | grep -v ^\-e | grep -v pip | grep -v setuptools | cut -d -f 1 | xargs -n1 pip3 uninstall -y 这个命令的解释如下&#xff1a; pip list --formatfreeze&#xff1a;列出所有已安装的库及其版本号。grep -v ^\-e&#xff1a;排除那些以-e开…

华为OD面试手撕算法-合并排序数组

题目描述 本题是leetcode一道简单题&#xff1a;合并两个有序数组&#xff0c;但是对于时间和空间复杂度面试官明确给出了限制。 // 给定两个排序后的数组 A 和 B&#xff0c;其中 A 的末端有足够的缓冲空间容纳 B。 编写一个方法&#xff0c;将 B 合并入 A 并排序。 // 初始化…

maya移除节点 修改节点

目录 maya移除节点 使用 Maya 用户界面&#xff1a; 使用脚本&#xff1a; maya 修改节点名字 使用 Maya 用户界面&#xff1a; 使用 MEL 脚本&#xff1a; 使用 Python 脚本&#xff1a; 注意事项&#xff1a; maya移除节点 使用 Maya 用户界面&#xff1a; 在“层次…

Gin框架(3)

文件上传与下载 文件上传 单文件上传 单文件上传指的是一次只上传一个文件。在Gin中&#xff0c;可以使用c.SaveUploadedFile方法来保存单个上传的文件。 // SaveUploadedFile uploads the form file to specific dst. func (c *Context) SaveUploadedFile(file *multipart…

对 NGINX、Kong 和 Amazon 的 API 管理解决方案进行基准测试:它们能否交付实时 API?

原文作者&#xff1a;Alessandro Fael Garcia of F5 原文链接&#xff1a;对 NGINX、Kong 和 Amazon 的 API 管理解决方案进行基准测试&#xff1a;它们能否交付实时 API&#xff1f; 转载来源&#xff1a;NGINX 开源社区 NGINX 唯一中文官方社区 &#xff0c;尽在 nginx.org.c…

HAL STM32 硬件I2C方式读取AS5600磁编码器获取角度例程

HAL STM32 硬件I2C方式读取AS5600磁编码器获取角度例程 &#x1f4cd;相关篇《STM32 软件I2C方式读取AS5600磁编码器获取角度例程》 ✨stm32使用硬件I2C去读取角度数据&#xff0c;通过STM32CubeMX工具配置工程&#xff0c;读取角度数据&#xff0c;只需要调用一个函数&#xf…

常见的服务器技术

常见的服务器技术 1.虚拟化技术&#xff1a;虚拟化技术允许在一台物理服务器上创建多个虚拟服务器&#xff0c;每个虚拟服务器都可以独立运行不同的操作系统和应用程序。这大大提高了服务器的资源利用率&#xff0c;并提供了更好的灵活性、可扩展性和可靠性。 2.负载均衡技术&…

谷歌(Google)技术面试——在线评估问题(一)

谷歌&#xff08;Google&#xff09;面试过程的第一步&#xff0c;你可能会收到一个在线评估链接。 评估有效期为 7 天&#xff0c;包含两个编码问题&#xff0c;需要在一小时内完成。 以下是一些供你练习的在线评估问题。 在本章结尾处&#xff0c;还提供了有关 Google 面试不…

使用 RisingWave、NATS JetStream 和 Superset 进行实时物联网监控

在物联网&#xff08;IoT&#xff09;背景下&#xff0c;处理实时数据会遇到一些特定的障碍&#xff0c;如边缘计算资源不足、网络条件限制、扩展性存在问题、设备间有多样性差异。要克服这些挑战&#xff0c;需要高效的边缘计算技术、强大的安全措施、标准化协议、可扩展的管理…

接口自动化框架搭建(六):多进程执行

1&#xff0c;背景目的 当测试用例太多之后&#xff0c;想缩短执行时间&#xff0c;就需要多线程或者多进程执行。 多线程执行&#xff1a; 每条测试用例是独立的&#xff0c;测试用例之间的参数不能共同使用 采坑举例&#xff1a;接口自动化中请求头是公共参数&#xff0c;…

Sqlite插入单引号和双引号,防止sql注入

1. 方法1 sqlite3_mprintf替换sprintf,%q替换%s. 1.1. 举例 修改前代码 //修改前, hello123写入失败char sql[1000]char* sql sprintf("UPDATE table SET name %s WHERE name_id %d","hello123", 1);rc sqlite3_exec(db, sql, NULL, NULL, &err…

WebGIS 地铁交通线网 | 图扑数字孪生

数字孪生技术在地铁线网的管理和运维中的应用是一个前沿且迅速发展的领域。随着物联网、大数据、云计算以及人工智能技术的发展&#xff0c;地铁线网数字孪生在智能交通和智慧城市建设中的作用日益凸显。 图扑软件基于 HTML5 的 2D、3D 图形渲染引擎&#xff0c;结合 GIS 地图…

人人都离不开的算法:AI 时代的生存指南

文章目录 一、算法在生活中的“无处不在”二、算法在工作学习中的“智慧助力”三、算法在社会发展中的“驱动力量”四、算法带来的“双刃剑”效应五、应对算法挑战的策略《人人都离不开的算法——图解算法应用》编辑推荐1、通俗易懂2、技术科普3、贴近时代、贴近生活4、启发思考…

List、Set、Map 之间的区别是什么?

List、Set和Map之间的主要区别体现在它们的定义、特性、用途和常见实现上。 首先&#xff0c;List、Set和Map都是Java集合框架中的重要接口&#xff0c;用于存储和操作数据&#xff0c;但它们各自有不同的特性。 List&#xff08;列表&#xff09;是一个有序的集合&#xff0…

婴儿沐浴椅CPC认证 亚马逊沐浴椅子CPC认证

婴儿沐浴椅 如果您在亚马逊商城发布商品&#xff0c;则必须遵守适用于这些商品和商品信息的所有联邦、州和地方法律以及亚马逊政策&#xff08;包括本政策&#xff09;。 本政策适用的婴儿沐浴椅 婴儿沐浴椅是一种用于浴缸、盥洗盆或类似沐浴设备中的一种支撑物&#xff0c;…

深入剖析JavaScript中的this(上)

在Javascript中&#xff0c;this 关键字是一个非常重要的概念&#xff0c;this这个关键字可以说是很常见也用的很多&#xff0c;说它简单也很简单&#xff0c;说它难也很难。我们经常会用到this&#xff0c;也经常会因为this头疼&#xff0c;是一个经常被误解和误用的概念&…

基于DWT(离散小波变换)的图像加密水印算法,Matlab实现

博主简介&#xff1a; 专注、专一于Matlab图像处理学习、交流&#xff0c;matlab图像代码代做/项目合作可以联系&#xff08;QQ:3249726188&#xff09; 个人主页&#xff1a;Matlab_ImagePro-CSDN博客 原则&#xff1a;代码均由本人编写完成&#xff0c;非中介&#xff0c;提供…

einops中的rearrange的使用方法

einops中的rearrange的使用方法 在 einops 中&#xff0c;rearrange 函数用于对张量进行重排操作&#xff0c;即重新排列张量的维度顺序或形状。它的语法如下&#xff1a; einops.rearrange(tensor, pattern)tensor&#xff1a;要重排的张量。 pattern&#xff1a;用于指定重排…