01-基本概念

1. 到底什么是数据结构?

        数据结构是指在计算机中组织存储数据的方式,它涉及到数据元素之间的关系以及对这些关系进行操作的方法。数据结构可以看作是一种将数据组织起来以便有效使用的方式,它关注数据的组织、存储和操作,以及如何优化这些操作以提高计算机程序的性能和效率。常见的数据结构包括:数组、链表、栈、队列、树、图等。每种数据结构都有其特定的优缺点和适用场景,程序员在设计和实现算法时需要根据实际情况选择合适的数据结构。

2. 抽象数据类型

        抽象数据类型(Abstract Data Type,ADT)是一种数学模型或者说是一种数据模型,用来描述数据对象的逻辑结构以及对这些对象进行操作的方法。它主要关注数据的逻辑特性而不涉及具体的实现细节,是一种对数据结构的抽象描述。

        ADT 的定义包括两个部分:

        ①. 数据对象集(Data Objects):即数据的逻辑结构,描述了数据对象的属性和关系
        ②. 操作集(Operations):定义了对数据对象进行的操作,包括:对数据的创建、销毁、添加、删除、修改、查询等操作

        举个例子,以栈(Stack)为例,栈是一种具有先进后出(LIFO)特性的数据结构。其数据对象集可以描述为一组元素,这些元素按照入栈顺序排列;而操作集包括入栈(Push)、出栈(Pop)、判空(isEmpty)、获取栈顶元素(Top)等操作。

        在实际编程中,ADT 提供了一种规范的描述方式,可以让程序员在实现数据结构时更加专注于数据结构的逻辑特性而不必过多关注具体的实现细节。常见的 ADT 包括:栈、队列、链表、树等,它们在计算机科学领域中被广泛应用于解决各种问题。

3. 什么是算法

        算法是指解决特定问题或执行特定任务的一组有限步骤的规则或者指令。它是一种对问题进行抽象和描述的方式,能够在计算机或者其他设备上被实现和执行。算法通常包括输入(Input)、处理(Processing)和输出(Output)三个基本部分,它们描述了算法如何接受输入数据、对数据进行处理,并生成输出结果。

        算法的特点包括:

        ①. 有限性:算法必须由有限个步骤组成,且在有限时间内执行完成。
        ②. 确定性:算法的每一步骤必须精确地定义,没有歧义,不会出现二义性。
        ③. 有效性:算法必须能够解决特定问题,即能够产生正确的输出结果。
        ④. 输入输出:算法必须接受输入数据,并根据输入产生输出结果。
        ⑤. 可行性:算法必须是可以实现和执行的,能够利用计算机或其他工具来进行实际操作。
        算法在计算机科学和信息技术领域中扮演着非常重要的角色,它们被广泛用于解决各种问题,例如:排序、搜索、优化、数据处理等。

        算法的设计和分析涉及到:时间复杂度、空间复杂度、正确性、可读性等方面,对于提高程序性能、优化资源利用、提升用户体验等方面具有重要意义。

3.1 什么是好的算法

        时间复杂度[S(n)]和空间复杂度[T(n)]是衡量算法性能的两个重要指标

        时间复杂度(Time Complexity):时间复杂度是对算法运行时间的估计,通常用大O符号(O)来表示。它描述了算法的运行时间随着输入规模增大而增长的趋势。时间复杂度可以分为:最坏情况时间复杂度、平均情况时间复杂度和最好情况时间复杂度,其中最坏情况时间复杂度是最常用的衡量指标
        空间复杂度(Space Complexity):空间复杂度是对算法所需存储空间的估计,通常也用大O符号表示。它描述了算法在运行过程中所需的额外空间随着输入规模增大而增长的趋势
在分析算法性能时,常常关注算法的时间复杂度和空间复杂度,因为它们能够帮助我们评估算法在大规模数据处理时的效率和资源消耗情况,从而选择合适的算法来解决问题。

3.2 时间复杂度的渐进表示法

        时间复杂度的渐进表示法是用来描述算法运行时间或空间需求与输入数据量之间关系的数学模型。主要有以下几种符号:

  1. 大O表示法 (O-notation)用于描述算法的上界表示算法在最坏情况下的运行时间。形式为 𝑂(𝑓(𝑛)),意味着存在常数 𝐶 和 n_0​,使得对所有 𝑛≥n_0​,算法的运行时间 𝑇(𝑛)≤𝐶⋅𝑓(𝑛)。

  2. 大Ω表示法 (Ω-notation)用于描述算法的下界表示算法在最好情况下的运行时间。形式为 Ω(𝑔(𝑛)),意味着存在常数 𝐶和 n_0​,使得对所有 𝑛≥n_0​,算法的运行时间 𝑇(𝑛)≥𝐶⋅𝑔(𝑛)。

  3. 大Θ表示法 (Θ-notation):用于精确描述算法的界限,当算法的上界和下界相同时使用。形式为 Θ(ℎ(𝑛)),意味着同时满足大O和大Ω的条件,即存在常数 𝐶1,𝐶2 和 n_0​,使得对所有 𝑛≥n_0​,𝐶1⋅ℎ(𝑛)≤𝑇(𝑛)≤𝐶2⋅ℎ(𝑛)。

  4. 小o表示法 (o-notation):用于描述算法的非紧致上界,即 𝑇(𝑛) 在 𝑓(𝑛)增长速度之下但没有达到 𝑓(𝑛)的速度。形式为 𝑜(𝑓(𝑛)),意味着对于任何常数 𝐶>0,存在 n_0,使得对所有 𝑛≥n_0,算法的运行时间 𝑇(𝑛)<𝐶⋅𝑓(𝑛)。

  5. 小ω表示法 (ω-notation):用于描述算法的非紧致下界,即 𝑇(𝑛)在 𝑔(𝑛)增长速度之上但不是其严格的下界。形式为 𝜔(𝑔(𝑛)),意味着对于任何常数 𝐶>0,存在n_0​,使得对所有 𝑛≥n_0,算法的运行时间 𝑇(𝑛)>𝐶⋅𝑔(𝑛)。

3.3 常见的时间复杂度

        ①. 常数时间复杂度 O(1): 不管数据量多大,算法所需的时间总是固定的。例如,访问数组的某个具体位置。
        ②. 对数时间复杂度 O(log n): 随着输入数据量的增加,算法执行时间的增长速度逐渐减慢。典型的例子是二分查找。
        ③. 线性时间复杂度 O(n): 算法执行时间与输入数据的大小成正比。例如,遍历一个数组。
        ④. 线性对数时间复杂度 O(nlog n): 比线性时间复杂度慢,常见于某些高效的排序算法,如快速排序和归并排序。
        ⑤. 二次时间复杂度 O(n^2): 算法执行时间与输入数据量的平方成正比。典型的例子包括:简单排序算法,如冒泡排序和插入排序。
        ⑥. 立方时间复杂度 O(n^3): 算法执行时间与输入数据量的立方成正比,例如,三重循环的简单算法。
        ⑦. 指数时间复杂度 O(2^n): 算法的执行时间随数据量指数级增长,这在某些递归算法中常见。
        ⑧. 阶乘时间复杂度 O(n!): 算法的执行时间随输入数据的阶乘增长,典型的例子是求解旅行推销员问题的穷举搜索。

        作为程序员,通常应该朝着具有较低时间复杂度的算法努力。这意味着尽可能选择和设计时间复杂度较低的算法,以提高程序的效率和性能。以下是一些具体的建议:

        ①. 避免指数级和阶乘级复杂度:应尽量避免设计指数级(O(2^n))和阶乘级(O(n!))时间复杂度的算法,因为它们在处理大规模数据时会非常低效
        ②. 优先选择线性对数级及以下复杂度:优先选择具有线性对数级(O(n log n))及以下时间复杂度的算法,例如快速排序、归并排序等。这些算法在大部分情况下都能提供良好的性能

3.4 分析时间复杂度小窍门

        ①. 若两段算法 分别有复杂度T_1(n)=O(f_1(n))T_2(n)=O(f_2(n)),则

        T_1(n) + T_2(n) = Max(O(f_1(n)), O(f_2(n))

        T_1(n) * T_2(n) = O(f_1(n)) * O(f_2(n))

        ②. 若T(n)是关于n的k阶多项式,那么T(n)=\theta (n^k)

        ③. 一个for循环的时间复杂度等于:循环次数乘以循环体代码的复杂度

        ④. if-else结构的复杂度取决于if的条件判断复杂两个分枝部分的复杂度,总体复杂度取三者中最大

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

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

相关文章

解决github的remote rejected|git存储库的推送保护

前言 git存储库的推送保护。当你试图推送代码到GitHub仓库时&#xff0c;由于存在与主分支&#xff08;master&#xff09;相关的仓库规则违规行为&#xff0c;推送会被拒绝了。这种保护机制帮助确保只有经过授权和符合规定的代码才能被合并到主分支&#xff0c;从而保护了主分…

上海亚商投顾:沪指创年内新高 化工板块掀涨停潮

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 三大指数昨日高开震荡&#xff0c;沪指涨超1%续创年内新高&#xff0c;深成指、创业板指均涨约2%。化工股集体…

SQL 基础 | AS 的用法介绍

SQL&#xff08;Structured Query Language&#xff09;是一种用于管理和操作数据库的标准编程语言。 在SQL中&#xff0c;AS关键字有几种不同的用法&#xff0c;主要用于重命名表、列或者查询结果。 以下是AS的一些常见用法&#xff1a; 重命名列&#xff1a;在SELECT语句中&a…

maven冲突问题

在编写maven当中的依赖时&#xff0c;有时候会出现一些问题&#xff0c;这种问题为Maven的当中的依赖。 在导入依赖的时候&#xff1a;出现了两种依赖发生了版本冲突的问题&#xff1f; <?xml version"1.0" encoding"UTF-8"?> <project xmlns…

VBA 创建透视表,录制宏,自动化报表

目录 一. 数据准备二. 需求三. 准备好报表模板四. 执行统计操作&#xff0c;录制宏4.1 根据数据源创建透视表4.2 填充数据到报表4.3 结束宏录制 五. 执行录制好的宏&#xff0c;自动化报表 一. 数据准备 ⏹数据源1 姓名学科成绩丁志敏语文91李平平语文81王刚语文64张伊语文50…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-13-按键实验

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

自动化运维工具---Ansible

一 Puppet Puppet是历史悠久的运维工具之一。它是一种基础架构即代码(laC)工具&#xff0c;使用户可以定义其基础 架构所需的状态&#xff0c;并使系统自动化以实现相同状态。 Puppet可监视用户的所有系统&#xff0c;并防止任何偏离已定义状态的情况。从简单的工作流程自动…

Mysql数据在磁盘上的存储结构

一. 前言 一行数据的存储格式大致如下所示: 变长字段的长度列表&#xff0c;null值列表&#xff0c;数据头&#xff0c;column01的值&#xff0c;column02的值&#xff0c;column0n的值… 二. 变长字段 在MySQL里有一些字段的长度是变长的&#xff0c;是不固定的&#xff0c;…

设计模式Java实现-工厂模式

✨这里是第七人格的博客✨小七&#xff0c;欢迎您的到来~✨ &#x1f345;系列专栏&#xff1a;设计模式&#x1f345; ✈️本篇内容: 工厂模式✈️ &#x1f371;本篇收录完整代码地址&#xff1a;https://gitee.com/diqirenge/design-pattern &#x1f371; 楔子 记得刚…

Python量化炒股的统计数据图

Python量化炒股的统计数据图 单只股票的收益统计图 查看单只股票的收盘价信息 单击聚宽JoinQuant量化炒股平台中的“策略研究/研究环境”命令&#xff0c;进入Jupyter Notebook的研究平台。然后单击“新建”按钮&#xff0c;创建Python3文件&#xff0c;输入如下代码如下&am…

ComfyUI搭建和注意事项for WIN[笔记]

下载ComfyUI(GitHub - comfyanonymous/ComfyUI: The most powerful and modular stable diffusion GUI, api and backend with a graph/nodes interface.) 从源码上搭建比较麻烦&#xff0c;一般不推荐&#xff0c;所以跑到release里面找一个下载。我的显卡是GeFore GTX 1050 …

STM32编译前置条件配置

本文基于stm32f104系列芯片&#xff0c;记录编程代码前需要的操作&#xff1a; 添加库文件 在ST官网下载标准库STM32F10x_StdPeriph_Lib_V3.5.0&#xff0c;解压后&#xff0c;得到以下界面 启动文件 进入Libraries&#xff0c;然后进入CMSIS&#xff0c;再进入CM3&#xff…

深度学习中的不确定性量化:技术、应用和挑战综述(一)

不确定性量化(UQ)在减少优化和决策过程中的不确定性方面起着关键作用&#xff0c;应用于解决各种现实世界的科学和工程应用。贝叶斯近似和集成学习技术是文献中使用最广泛的两种UQ方法。在这方面&#xff0c;研究人员提出了不同的UQ方法&#xff0c;并测试了它们在各种应用中的…

018、Python+fastapi,第一个Python项目走向第18步:ubuntu24.04 安装cuda和pytorch环境

一、说明 我们安装了pytorch环境之后&#xff0c;会用yolo v9 来测试一下&#xff0c;看8g 显存能不能跑下来&#xff0c;上次用无影云电脑&#xff0c;4cpu8g内存直接爆了&#xff0c;云电脑也死机了&#xff0c;提示一直占用内存不释放&#xff0c;我自己的云电脑不能占用内…

Java中的maven的安装和配置

maven的作用 依赖管理 方便快捷的管理项目依赖的资源&#xff0c;避免版本冲突问题 统一项目管理 提供标准&#xff0c;统一的项目结构 项目构建 标准跨平台&#xff08;Linux、windows、MacOS&#xff09;的自动化项目构建方式 maven的安装和配置 在maven官网下载maven Ma…

【革命启示录】Spring框架:Java开发的“核聚变”能量源!

Hello&#xff0c;我是阿佑&#xff0c;今天给大家整的活是 《Java开发的“核聚变”能量源》 文章目录 Spring框架原理详解一、引言简介目的特点例子 二、背景介绍问题解决方案例子 三、核心概念3.1 控制反转&#xff08;Inversion of Control, IoC&#xff09;定义实现例子与代…

多商户Docker Supervisor进程管理器部署

Dockerfile 根目录下没有Dockerfile的可以复制下面的命令 # 使用基础镜像 FROM leekay0218/crmeb-mer## 复制代码 ## 在本地调试注释掉&#xff0c;使用映射把文件映射进去 #ADD ./ /var/www# 设置工作目录 WORKDIR /var/www# 设置时区为上海 ENV TZAsia/Shanghai RUN ln -sn…

python安装问题及解决办法(pip不是内部或外部命令也不是可运行)

pip是python的包管理工具&#xff0c;使python可在cmd&#xff08;命令行窗口&#xff0c;WinR后输入cmd&#xff09;中执行 针对 “pip不是内部或外部命令也不是可运行” 问题&#xff0c;需要在安装的时候将python添加到环境变量中 上图第三个选项必须勾选才能在cmd中使用pi…

python从0开始学习(四)

目录 前言 1、算数运算符 1.1 //:整除运算符 1.2 %:取模操作 1.3 **&#xff1a;幂运算 2、赋值运算符 3、比较运算符 4、逻辑运算符 5、位运算符 5.1 &&#xff1a;按位与 5.2 |&#xff1a;按位或 5.3 ^&#xff1a;按位异或 5.4 ~&#xff1a;按位取反 5.5…

如何保证Redis双写一致性?

目录 数据不一致问题 数据库和缓存不一致解决方案 1. 先更新缓存&#xff0c;再更新数据 该方案数据不一致的原因 2. 先更新数据库&#xff0c;再更新缓存 3. 先删除缓存&#xff0c;再更新数据库 延时双删 4. 先更新数据库&#xff0c;再删除缓存 该方案数据不一致的…