【算法设计与分析】(一)介绍算法与复杂度分析

【算法设计与分析】(一)介绍算法与复杂度分析

  • 前言
  • 一、什么是算法?
  • 二、算法的抽象机制
  • 三、描述算法
  • 四、复杂度分析
      • 4.1 时间复杂度
      • 4.2 空间复杂度


前言

  • 从搜索引擎的高效检索,到推荐系统的个性化推荐,再到人工智能领域的复杂决策过程,算法都扮演着至关重要的角色

于每一个从事计算机相关工作或对编程有浓厚兴趣的人来说,深入理解算法设计与分析的原理和方法,不仅是提升编程技能的关键,更是解决实际问题、推动技术创新的必备能力。

  • 这篇博客将作为一个起点,带领大家逐步探索算法设计与分析的奇妙世界。我们将从基础的概念入手,为后续深入的学习和实践打下坚实的基础。

在这里插入图片描述

一、什么是算法?

  • 算法,简单来说,就是为解决特定问题而设计的一系列明确且有限的步骤。

  • 例如,我们要计算两个数的和,设计一个算法可能包括输入两个数、执行加法运算、输出结果这几个步骤。

  • 程序则是算法在特定编程语言中的具体实现。以 C 语言为例,实现上述计算两数之和的程序如下:

#include <stdio.h>

int main() {
    float a, b, result;
    printf("请输入第一个数: ");
    scanf("%f", &a);
    printf("请输入第二个数: ");
    scanf("%f", &b);

    result = a + b;
    printf("两数之和为: %.2f\n", result);

    return 0;
}

在这段 C 语言代码中,我们首先包含了标准输入输出头文件stdio.h,以便使用printf和scanf函数进行输入输出操作。然后在main函数中,定义了三个变量a、b和result,分别用于存储输入的两个数和计算得到的和。通过scanf函数获取用户输入的两个数,执行加法运算后,使用printf函数将结果以保留两位小数的形式输出。

  • 可以看出,算法是程序的灵魂程序是算法的载体。算法关注的是解决问题的逻辑和步骤,而程序则侧重于如何用具体的代码将算法实现出来。

在这里插入图片描述

二、算法的抽象机制

  • 算法的抽象机制是一种强大的工具,它允许我们将复杂的问题简化,提取出核心的逻辑和操作。

通过抽象,我们可以忽略问题中不必要的细节,专注于关键的步骤和关系。

  • 比如,在排序算法中,无论是冒泡排序、插入排序还是快速排序,它们都可以被抽象为对一组数据进行重新排列的过程我们可以将数据的比较和交换操作抽象出来,形成一个通用的排序框架。这种抽象不仅有助于我们理解不同排序算法的本质,还能方便我们在不同的场景中选择合适的算法。

以冒泡排序为例,以下是 C 语言冒泡排序算法:

#include <stdio.h>

// 交换两个整数的值
void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

// 冒泡排序函数
void bubbleSort(int arr[], int n) {
    int i, j;
    for (i = 0; i < n - 1; i++) {
        for (j = 0; j < n - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                swap(&arr[j], &arr[j + 1]);
            }
        }
    }
}

int main() {
    int arr[] = { 64, 34, 25, 12, 22, 11, 90 };
    int n = sizeof(arr) / sizeof(arr[0]);

    bubbleSort(arr, n);

    printf("排序后的数组: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    return 0;
}

在上述代码中,swap函数用于交换两个整数的值,bubbleSort函数实现了冒泡排序的逻辑。通过多次比较相邻元素并交换顺序,最终将数组中的元素按照从小到大的顺序排列。

  • 抽象机制还可以帮助我们复用算法
  • 当我们设计出一个有效的算法解决某个问题后,通过抽象,我们可以将其应用到类似的问题中,提高开发效率。

在这里插入图片描述

三、描述算法

  • 为了清晰地表达算法,我们需要选择合适的描述方式。常见的描述算法的方式有自然语言、流程图、伪代码等
  • 自然语言是最容易理解的描述方式,它使用我们日常的语言来描述算法的步骤。
  • 例如,描述一个计算阶乘的算法:“首先输入一个整数 n,然后从 1 开始,依次乘以 2、3 直到 n,最后输出得到的结果。” 但自然语言描述可能存在歧义,不够精确。

  • 流程图则通过图形化的方式展示算法的流程。它使用各种图形符号(如矩形表示操作、菱形表示判断等)和箭头来表示算法的执行顺序。流程图直观易懂,有助于我们理清算法的逻辑结构。
    在这里插入图片描述
  • 伪代码是一种介于自然语言和编程语言之间的描述方式。它使用类似编程语言的语法结构,但更侧重于表达算法的逻辑,而不涉及具体的编程语言细节。例如,计算阶乘的伪代码可以写成:
input n
factorial = 1
for i from 1 to n
    factorial = factorial * i
end for
output factorial

以下是用 C 语言实现计算阶乘的代码

#include <stdio.h>

int main() {
    int n, i;
    long long factorial = 1;  // 使用long long类型以处理较大的阶乘结果

    printf("请输入一个整数: ");
    scanf("%d", &n);

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

    printf("%d 的阶乘为: %lld\n", n, factorial);

    return 0;
}

在这段 C 语言代码中,我们通过for循环从 1 到输入的整数n进行累乘,最终得到n的阶乘结果,并将其输出。

不同的描述方式各有优缺点,在实际应用中,我们可以根据具体情况选择合适的方式来描述算法。

四、复杂度分析

  • 复杂度分析是算法设计与分析中非常重要的一个环节。它主要用于评估算法的效率,包括时间复杂度和空间复杂度。在深入探讨复杂度之前,我们先引入一个重要的概念:f(n)正函数
    在这里插入图片描述

4.1 时间复杂度

时间复杂度衡量的是算法执行所需的时间随着输入规模的增长而变化的趋势。我们通常使用大O符号( O O O)来表示时间复杂度

  • 大O符号的定义:设 f ( n ) f(n) f(n) g ( n ) g(n) g(n)是定义在正整数集上的正函数,如果存在正常数 c c c n 0 n_0 n0,使得当 n ≥ n 0 n \geq n_0 nn0时,有 f ( n ) ≤ c ⋅ g ( n ) f(n) \leq c \cdot g(n) f(n)cg(n),则称 f ( n ) f(n) f(n)在渐近意义下小于等于 g ( n ) g(n) g(n),记作 f ( n ) = O ( g ( n ) ) f(n) = O(g(n)) f(n)=O(g(n))

例如,对于一个算法,如果它的执行时间 T ( n ) T(n) T(n)可以表示为 T ( n ) = 3 n 2 + 2 n + 1 T(n) = 3n^2 + 2n + 1 T(n)=3n2+2n+1,我们可以找到 c = 4 c = 4 c=4 n 0 = 1 n_0 = 1 n0=1,当 n ≥ 1 n \geq 1 n1时, 3 n 2 + 2 n + 1 ≤ 4 n 2 3n^2 + 2n + 1 \leq 4n^2 3n2+2n+14n2,所以 T ( n ) = O ( n 2 ) T(n) = O(n^2) T(n)=O(n2)。这意味着随着输入规模 n n n的增大, n 2 n^2 n2这一项起主导作用,其他低阶项(如 2 n 2n 2n 1 1 1)对整体时间的影响越来越小,可以忽略不计。

常见的时间复杂度有:

  • O ( 1 ) O(1) O(1)(常数时间):算法的执行时间不随输入规模 n n n的变化而变化,例如访问数组中的一个固定位置的元素。
  • O ( log ⁡ n ) O(\log n) O(logn)(对数时间):常见于二分查找等算法,随着输入规模 n n n的增大,执行时间增长缓慢。
  • O ( n ) O(n) O(n)(线性时间):如顺序查找算法,执行时间与输入规模 n n n成正比。
  • O ( n log ⁡ n ) O(n \log n) O(nlogn):许多高效的排序算法(如归并排序、快速排序的平均情况)具有这种时间复杂度。
  • O ( n 2 ) O(n^2) O(n2)(平方时间):像冒泡排序、插入排序等简单排序算法的时间复杂度为 O ( n 2 ) O(n^2) O(n2),当输入规模较大时,算法的执行时间会显著增加。

4.2 空间复杂度

空间复杂度则关注算法在执行过程中所需的额外空间。同样使用大O符号来表示,即分析随着输入规模 n n n的增加,算法所需额外空间的变化趋势。

例如,一个算法在执行过程中,除了输入数据本身占用的空间外,只使用了固定数量的额外变量,无论输入规模 n n n如何变化,额外空间都不改变,那么该算法的空间复杂度就是 O ( 1 ) O(1) O(1)

如果一个算法需要创建一个大小与输入规模 n n n成正比的数组来存储中间结果,那么它的空间复杂度就是 O ( n ) O(n) O(n)

以之前的冒泡排序算法为例,其时间复杂度为 O ( n 2 ) O(n^2) O(n2),因为它有两层嵌套的循环,对于长度为 n n n的数组,总的比较和交换操作次数大约为 n ∗ ( n − 1 ) / 2 n * (n - 1) / 2 n(n1)/2,随着 n n n的增大,时间增长的趋势与 n n n的平方成正比。而其空间复杂度为 O ( 1 ) O(1) O(1),因为在排序过程中,除了输入的数组本身外,只使用了有限的额外变量(如循环变量 i i i j j j和用于交换的临时变量),额外空间的使用不随输入规模 n n n的变化而变化。

通过复杂度分析,我们可以在设计算法时选择更高效的方案,避免在实际应用中出现性能瓶颈。


非常感谢您的阅读,喜欢的话记得三连哦

在这里插入图片描述

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

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

相关文章

自动驾驶两个传感器之间的坐标系转换

有两种方式可以实现两个坐标系的转换。 车身坐标系下一个点p_car&#xff0c;需要转换到相机坐标系下&#xff0c;旋转矩阵R_car2Cam&#xff0c;平移矩阵T_car2Cam。点p_car在相机坐标系下记p_cam. 方法1&#xff1a;先旋转再平移 p_cam T_car2Cam * p_car T_car2Cam 需要注…

OpenGL ES -> GLSurfaceView绘制点、线、三角形、正方形、圆(顶点法绘制)

XML文件 <?xml version"1.0" encoding"utf-8"?> <com.example.myapplication.MyGLSurfaceViewxmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"…

基于springboot大学生学科竞赛管理系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 学科竞赛一直是检测学生学习能力好坏的重要手段&#xff0c;随着社会的发展&#xff0c;学科竞赛已经渗透到各个方面。但是传统方式的竞赛方式已经不能更好的胜任越来越多的需求&#xff0c;所以需要设计一个大学生学科竞赛管理系统&#xff0c;来满足日益重要的学科竞赛…

Dify私有化部署自己的AI Agent

1、下载Dify git clone gitgithub.com:langgenius/dify.git 2、创建Dify配置 进入dify目录下的docker目录中,复制.env.example为 .env 3、使用Docker命令进行部署Dify docker compose up -d 4、访问Dify http://localhost/install 5、 设置模型供应商 配置环境变量&#xff1…

【Deepseek+Browser-Use搭建 Web UI自动化】

参考文档&#xff1a;browser-use WebUI DeepSeek V3 把浏览器整成自动化了!_browser use webui 执行run agent chrome没出来-CSDN博客 1、 安装完成&#xff1a; 三、安装步骤&#xff08;适用于macOs、windows、linux&#xff09; 1、拉取WebUI项目 git clone https://gi…

DeepSeek + Mermaid编辑器——常规绘图

下面这张图出自&#xff1a;由清华大学出品的 《DeepSeek&#xff1a;从入门到精通》。 作为纯文本生成模型&#xff0c;DeepSeek虽不具备多媒体内容生成接口&#xff0c;但其开放式架构允许通过API接口与图像合成引擎、数据可视化工具等第三方系统进行协同工作&#xff0c;最终…

解决数据库建表错误:ERROR 1064 (42000) You have an error in your SQL

[TOC](解决数据库建表错误&#xff1a;ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘desk tb_user’ at line 1) 运用MySQL命令运行sql语句进行建表时&am…

compare-form.vue 的 v 来源(来自父组件index.vue中的row行数据)

文章目录 compare-form.vue 的父组件compare-form.vue 的 v 来源相关代码片段1. value 的 Prop 定义2. Watch(value) 及其 watchValue 方法3. 与 value 间接相关的代码&#xff08;影响 v 的初始化或使用&#xff09; 总结 子组件 compare-form.vue父组件 index.vue 以下是关于…

【深度学习神经网络学习笔记(三)】向量化编程

向量化编程 向量化编程前言1、向量化编程2、向量化优势3、正向传播和反向传播 向量化编程 前言 向量化编程是一种利用专门的指令集或并行算法来提高数据处理效率的技术&#xff0c;尤其在科学计算、数据分析和机器学习领域中非常常见。它允许通过一次操作处理整个数组或矩阵的…

基于 SpringBoot Vue 的生鲜商城系统设计和实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…

电机控制的空间矢量调制 (SVPWM)

目录 概述 1 电机控制的空间矢量调制 (SVPWM)介绍 2 实现原理 2.1 设计要求 2.2 SVPWM 的实现 3 SVPWM的C语言 3.1 代码文件 3.2 STM32G4平台上验证 4 源代码文件 概述 本文主要介绍电机控制的空间矢量调制 (SVPWM)&#xff0c;空间矢量调制 (SVPWM) 是感应电机和永磁…

服务器离线部署DeepSeek

目标 本次部署的目标是在本地服务器上部署DeepSeek。但是该服务不能连接外网&#xff0c;因此只能使用离线部署的方式。为了一次完成部署。现在云服务器上进行尝试。 云服务器部署尝试 云服务器配置 CentOS72080Ti 11GB 安装准备 1、上传iso并配置为本地yum源 安装前先将…

Unity打包APK报错 using a newer Android Gradle plugin to use compileSdk = 35

Unity打包APK报错 using a newer Android Gradle plugin to use compileSdk 35 三个报错信息如下 第一个 WARNING:We recommend using a newer Android Gradle plugin to use compileSdk 35This Android Gradle plugin (7.1.2) was tested up to compileSdk 32This warning…

Ubuntu 22.04安装K8S集群

以下是Ubuntu 22.04安装Kubernetes集群的步骤概要 一、设置主机名与hosts解析 # Master节点执行 sudo hostnamectl set-hostname "k8smaster" # Worker节点执行 sudo hostnamectl set-hostname "k8sworker1"# 所有节点的/etc/hosts中添加&#xff1a; ca…

《AI 大模型 ChatGPT 的传奇》

《AI 大模型 ChatGPT 的传奇》 ——段方 某世界 100 强企业大数据/AI 总设计师 教授 北京大学博士后 助理 &#xff1a;1三6三二四61四五4 1 AI 大模型的概念和特点 1.1 什么是”大模型、多模态“&#xff1f; 1.2 大模型带来了什么&#xff1f; 1.3 大模型为什么能产生质变&am…

期权帮|股指期货多单和空单有什么区别?

锦鲤三三每日分享期权知识&#xff0c;帮助期权新手及时有效地掌握即市趋势与新资讯&#xff01; 股指期货多单和空单有什么区别&#xff1f; 一、股指期货多单和空单定义与操作方向&#xff1a; &#xff08;1&#xff09;股指期货多单定义&#xff1a;投资者买入股指期货合…

从【人工智能】到【计算机视觉】,【深度学习】引领的未来科技创新与变革

前几天偶然发现了一个超棒的人工智能学习网站&#xff0c;内容通俗易懂&#xff0c;讲解风趣幽默&#xff0c;简直让人欲罢不能。忍不住分享给大家&#xff0c;点击这里立刻跳转&#xff0c;开启你的AI学习之旅吧&#xff01; 前言 – 人工智能教程https://www.captainbed.cn/l…

如何在VMware虚拟机的window10系统中安装网易mumu模拟器

安卓模拟器是可以在电脑的windows环境中运行手机软件的工具,喜欢网游或者是要逆向安卓应用应该都要安装这个模拟器,如果要模拟器正常工作,主机的虚拟化应该开启,也就是要开启vt。在有些情况下,需要把模拟器安装到电脑的虚拟机里,隔离模拟器与主机,这时vt的开启就稍麻烦些…

【Rust中级教程】2.10. API设计原则之受约束性(constrained) Pt.1:对类型进行修改、`#[non_exhaustive]`注解

喜欢的话别忘了点赞、收藏加关注哦&#xff08;加关注即可阅读全文&#xff09;&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 2.10.1. 接口的更改要三思 如果你的接口要做出对用户可见的更改&#xff0c;那么一定要三思…

【阿】(阿联酋)迪拜求职指南(Gulftalent)

https://www.gulftalent.com/resources/dubai-jobs-guide 文章目录 Types of Employers 雇主类型Multinationals 跨国公司Large local firms 大型本地公司Local SMEs 本地中小企Government 政府Assessing your Chances 评估您的机会其他城市&#xff08;阿布扎比和沙迦&#xf…