算法01-算法概念与描述

简介: 算法01-算法概念与描述


总结


本系列为C++算法学习系列,会介绍 算法概念与描述,入门算法,基础算法,数值处理算法,排序算法,搜索算法,图论算法, 动态规划等相关内容。本文为C+算法概念与描述部分。


大纲要求

【 1 】算法概念

【 2 】算法描述:自然语言描述、流程图描述、 伪代码描述


算法概念

信息学奥赛算法是指用计算机解决问题的方法和技巧。其核心在于算法的设计和优化,包括时间复杂度和空间复杂度等方面的优化。下面是一些常见的算法概念介绍:


  1. 排序算法:将一组数据按照指定的规则进行排序的算法,包括冒泡排序、快速排序、归并排序等。
  2. 搜索算法:通过遍历某个数据集合来查找特定元素的算法,包括二分查找、深度优先搜索、广度优先搜索等。
  3. 图论算法:用于解决图论相关问题的算法,包括最短路径算法、最小生成树算法、拓扑排序等。
  4. 动态规划算法:将一个问题分解成一个个子问题来求解的算法,包括最大子序列和、最长公共子序列等。
  5. 贪心算法:在每一步选择中都采取在当前状态下最优的选择,从而希望导致结果是全局最优的算法,包括背包问题等。
  6. 分治算法:将问题分解成多个小问题来求解的算法,包括快速排序、归并排序等。
  7. 字符串算法:用于解决字符串相关问题的算法,包括KMP算法、Trie树等。


举个例子:量水问题

假设有两只没有刻度的桶A和B,A可以装7升水,B可以装5升水,问:如何通过A和B互相倒腾得到六升水。


解:


将A装满(0升变7升)

将A的水倒向B,(A从7升剩2升,B变5升)

将B倒掉,

将A(2升b变0)倒向B(0变2升)

将A装满水

将A倒向B(此时A从7升变4升,B从2升变5升)

将B倒掉,

将A(4升)倒向B(从0升变4升)

将A装满水

将A再倒向B(从4升变5升,A此时剩余6升。


简化步骤:


将下面(2,3,4,5)重复两次

2、将A装满

3、将A的水倒向B

4、将B倒掉

5、将A倒向B

6、将A装满水

7、将A再倒向B


算法简单来说就是准确描述的“操作步骤”。

什么是计算机算法 —— 从特殊到一般的追求。

上面的例子我们给定的是具体的值,但是计算机算法是要追求一般的规律。

我们可以理解为数学公式,它不是具体的值,但解释了一般规律。


算法描述

算法描述:自然语言描述、流程图描述、 伪代码描述

**自然语言描述:**通过自然语言来描述算法的步骤和操作。例如,冒泡排序算法可以用如下自然语言描述:从数组的第一个元素开始,依次比较相邻的两个元素,如果前一个元素大于后一个元素,则交换它们的位置,直到将最大的元素移动到数组的最后一个位置。重复上述操作,直到所有元素都排好序为止。


初始化变量 i 和 j 为 0,表示当前需要比较的元素下标。

在数组 A 中比较 A[i] 和 A[j] 两个元素,如果 A[i] 大于 A[j],则交换它们的位置。

将 j 增加 1,如果 j < n,则回到步骤 2;否则,将 i 增加 1,将 j 重置为 i,如果 i < n-1,则回到步骤 2。

当 i >= n-1 时,排序结束。


**流程图描述:**通过图形化方式来表示算法的步骤和操作。例如,下图是一个简单的冒泡排序算法的流程图描述:

a97bfed7e0bd104933bccf9e562ea768_d4d65da6780d432b9af6a7ae9cf8cdac.png


**伪代码描述:**通过一种类似编程语言的语法来描述算法的步骤和操作。伪代码通常比自然语言描述更具体和精确。例如,下面是一个用伪代码描述的冒泡排序算法:


procedure bubbleSort(A : list of sortable items)
    n = length(A)
    repeat
        swapped = false
        for i = 1 to n-1 do
            if A[i] > A[i+1] then
                swap(A[i], A[i+1])
                swapped = true
            end if
        end for
        n = n - 1
    until not swapped
end procedure

假设有两只没有刻度的桶A和B,A可以装7升水,B可以装5升水,问:如何通过A和B互相倒腾得到六升水。

8a3279a0092226c1b468bf2b19c580f5_26633b6657de4d82b3c0b41fe8189548.png


算法的时间复杂度

算法的时间复杂度是衡量算法运行时间效率的一种指标,通常用大O表示法来表达。它描述了算法在处理问题时所需的时间资源,即算法的时间复杂度越低,算法的执行效率越高。


时间复杂度通常表示为一个函数T(n),其中n表示输入规模。时间复杂度可以分为以下几类:


1.常数时间复杂度O(1),表示算法的执行时间与输入规模 n 无关,比如说访问数组中的一个元素。

int i = 1;
int j = 2;
++i;
j++;
int m = i + j;

2.线性时间复杂度O(n),表示算法的执行时间与输入规模 n 成正比,比如说遍历一个数组。

for(i=1; i<=n; ++i)
{
   j = i;
   j++;
}

3.对数时间复杂度O(logn),表示算法的执行时间与输入规模 n 的对数成正比,通常出现在二分查找等算法中。

int i = 1;
while(i<n)
{
    i = i * 2;
}

3.线性对数阶O(nlogN)

线性对数阶O(nlogN) 其实非常容易理解,将时间复杂度为O(logn)的代码循环N遍的话,那么它的时间复杂度就是 n * O(logN),也就是了O(nlogN)。


for(m=1; m<n; m++)
{
    i = 1;
    while(i<n)
    {
        i = i * 2;
    }
}

4.平方时间复杂度O(n^2),表示算法的执行时间与输入规模 n 的平方成正比,通常出现在多重循环嵌套的算法中。

for(x=1; i<=n; x++)
{
   for(i=1; i<=n; i++)
    {
       j = i;
       j++;
    }
}

指数时间复杂度O(2^n),表示算法的执行时间与输入规模 n 的指数成正比,通常只出现在具有递归性质的算法中。

2e4bbb8698714aeac97f9aed8c5afa16_b2ee18280d6947b9b1cee48c7916574f.png


综上所述,算法的时间复杂度是评价算法效率的重要指标之一。在实际编程中,我们需要根据不同的需求选择不同的算法和数据结构,以提高程序的执行效率。算法的时间复杂度是衡量算法运行时间效率的一种指标,通常用大O表示法来表达。它描述了算法在处理问题时所需的时间资源,即算法的时间复杂度越低,算法的执行效率越高。


4111e3c56c3ca4163896ea4004a787a1_d530f251860b4fbc853a19c479e89df8.png

14466502de6f66d419fd85b8e5b44267_8706e23d731143618e752cdb30904bee.png


d51985f381a63591bc7cfba3270ca465_2c03438aaed540dda3f94bd5c37dedba.png

相关文章
|
存储 JSON Java
Sentinel 持久化的四种方案 | 学习笔记
快速学习 Sentinel 持久化的四种方案
1138 0
|
5月前
|
数据采集 监控 安全
怎样能购买到静态IP?静态IP有什么用处和优点?
本文将详细探讨购买静态IP的多种方式,包括静态IP采集的方法和如何有效购买代理IP。我们将分析不同途径的优缺点,帮助读者选择最适合自己的静态IP解决方案,让网络活动更加稳定和安全。无论是个人用户还是企业需求,均能找到合适的参考。
|
5月前
|
JavaScript Java 关系型数据库
基于springboot的医院药品管理系统
本文探讨基于Java的医院药品管理系统的设计与实现。针对传统人工管理效率低、易出错等问题,系统采用Java语言,结合Spring Boot、Vue、MySQL等技术,构建B/S架构的信息化管理平台,提升药品管理效率与安全性,优化资源配置,助力医疗信息化发展。
|
9月前
|
Web App开发 存储 Ubuntu
Ubuntu 23.04 新特性一览
Ubuntu 23.04 使用 Linux kernel 6.2,并提供 Mesa 23.0 图形驱动程序来支持一些顶级游戏体验。
371 0
|
缓存 负载均衡 应用服务中间件
深入解析Nginx配置文件
Nginx是一个高性能HTTP服务器和反向代理,其配置文件`nginx.conf`包含全局、事件、HTTP、Server和Location块。全局块设置如用户和工作进程数,事件块设定连接数,HTTP块涉及MIME类型、日志和包含其他配置。Server块定义虚拟主机,Location块处理URI匹配。Nginx常用于反向代理和负载均衡,如`proxy_pass`指令转发请求至后端服务器组。理解这些配置有助于服务器优化和测试。
|
人工智能 Java 程序员
一文彻底搞清楚C语言的循环语句
本文介绍了C语言中的三种循环语句:`while`、`do-while`和`for`,并详细解释了它们的语法格式、执行流程及应用场景。此外,还讲解了循环控制语句`break`和`continue`的使用方法。希望这些内容能帮助你在编程道路上不断进步,共同成长!
1465 0
一文彻底搞清楚C语言的循环语句
|
C语言
C 标准库 - <math.h>详解
`&lt;math.h&gt;` 是 C 标准库中的头文件,提供了丰富的数学计算函数和常量。重要常量包括自然常数 `M_E` 和圆周率 `M_PI`。常用函数涵盖指数、对数、幂、平方根、三角及反三角函数等,如 `exp`、`log`、`pow`、`sqrt`、`sin`、`cos` 等。
807 12
|
安全 网络协议 网络安全
在实现HTTPS时,有哪些常见的安全协议
在实现HTTPS时,有哪些常见的安全协议
892 1
|
算法 数据安全/隐私保护
数字通信中不同信道类型对通信系统性能影响matlab仿真分析,对比AWGN,BEC,BSC以及多径信道
本项目展示了数字通信系统中几种典型信道模型(AWGN、BEC、BSC及多径信道)的算法实现与分析。使用Matlab2022a开发,提供无水印运行效果预览图、部分核心代码及完整版带中文注释的源码和操作视频。通过数学公式深入解析各信道特性及其对系统性能的影响。
|
敏捷开发 监控 Devops
探索自动化测试的利剑:持续集成与持续部署(CI/CD)在软件测试中的应用
在软件开发的快速迭代中,传统的手动测试方法已经无法满足效率和质量的双重需求。本文将深入探讨如何通过实施持续集成(CI)和持续部署(CD)来优化自动化测试流程,提升软件交付速度及质量保证水平。我们将分析CI/CD在测试中的关键作用,并通过实际案例数据展示其对提高测试覆盖率、缩短反馈周期和增强开发协作的积极影响。
610 27