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的条件判断复杂两个分枝部分的复杂度,总体复杂度取三者中最大

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

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

相关文章

关于冯诺依曼体系结构 和 操作系统(Operator System)的概念讲解(冯诺依曼体系结构,操作系统的作用等)

目录 一、冯诺依曼体系结构 二、操作系统 1. 概念 2. 设计操作系统的目的 3.系统调用和库函数概念 4.总结 三、完结撒❀ 一、冯诺依曼体系结构 我们常见的计算机&#xff0c;如笔记本。我们不常见的计算机&#xff0c;如服务器&#xff0c;大部分都遵守冯诺依曼体系。 截…

标贝数据采集标注在自动驾驶场景中落地应用实例

AI数据服务作为人工智能和机器学习的基础&#xff0c;在自动驾驶领域中有着重要地位。与其他人工智能应用场景相比&#xff0c;自动驾驶的落地场景相对复杂&#xff0c;想要让汽车本身的算法做到处理更多、更复杂的场景&#xff0c;就需要运用大量场景化高质量AI数据做支撑。标…

第八节课《大模型微调数据构造》

大模型微调数据构造&#xff08;补充课程&#xff09;_哔哩哔哩_bilibili Tutorial/FineTune at main Focusshang/Tutorial GitHub 一、大模型训练数据介绍 预训练&#xff1a; 网络、论文数据&#xff0c;无标签数据transform算法base model典型&#xff1a;GPT监督微调 对…

【C语言】整数,浮点数数据在内存中的存储

Tiny Spark get dazzling some day. 目录 1. 整数在内存中的存储1.1 原码、反码、补码1.1 大小端存储1.2.1 字节序分类1.2.2 判断字节序 2. 浮点数在内存中的存储2.1 浮点数的存储形式2.2 浮点数的 “ 存 ”2.2.1 S2.2.2 E2.2.3 F 2.3 浮点数的 “ 取 ”2.3.1 S2.3.2 E、F 3. 浮…

ISIS的基本概念

1.ISIS概述 IS-IS是一种链路状态路由协议&#xff0c;IS-IS与OSPF在许多方面非常相似&#xff0c; 例如运行IS-IS协议的直连设备之间通过发送Hello报文发现彼此&#xff0c;然后建立邻接关系&#xff0c;并交互链路状态信息。 CLNS由以下三个部分组成&#xff1a; CLNP&#xf…

新的项目springboot

buybuyshenglombok <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency> 添加依赖 lombok package com.example.demo.pojo;import lombok.AllArgsConstructor; import lombok.Data; import …

LLM应用:prompt提示让大模型总结生成Mermaid流程图;充当角色输出

1、prompt提示让大模型总结生成Mermaid流程图 生成内容、总结文章让大模型Mermaid流程图展示&#xff1a; mermaid 美人鱼, 是一个类似 markdown&#xff0c;用文本语法来描述文档图形(流程图、 时序图、甘特图)的工具&#xff0c;您可以在文档中嵌入一段 mermaid 文本来生成 …

项目实战 | 如何恰当的处理 Vue 路由权限

前言 哈喽&#xff0c;小伙伴你好&#xff0c;我是 嘟老板。最近接了一个成本千万级的前端项目运维工作&#xff0c;本着 知己知彼 的态度&#xff0c;我将整个前端的大致设计思路过了一遍。不看不知道&#xff0c;一看…吓一跳。光是 路由权限 这块儿的设计&#xff0c;都让我…

linux上Redis安装使用

环境centOS8 redis是缓存数据库&#xff0c;主要是用于在内存中存储数据&#xff0c;内存的读写很快&#xff0c;加快系统读写数据库的速度 一、Linux 安装 Redis 1. 下载Redis 官网下载Downloads - Redis 历史版本Index of /releases/ 本文中安装的版本为&#xff1a;h…

Celery + redis 异步分布式任务队列安装测试

Celery 异步分布式任务队列 Celery 5.4.0 官方文档 环境&#xff1a;3台 centos7.9 普通用户 redisSchedulerworkerdp951dp96111dp971 文章目录 Celery 异步分布式任务队列1、Celery 介绍2、安装部署2.1 安装消息中间件&#xff08;broker&#xff09;2.2 安装Celery 3、功能…

mac 本地使用docker 运行es,kibana

1.下载 m芯片一些版本不支持.踩过坑.翻看官网才知道只有部分镜像支持m芯片 https://hub.docker.com/添加链接描述 docker pull elasticsearch:7.17.21 docker pull kibana:7.17.21镜像已经下载下来了 2.创建文件映射-挂载 /Users/lin/dev/dockerMsg 其中lin是自己的用户名…

【数据结构/C语言】单链表的实现

目录 一、单链表的基本概念 单链表的简介 单链表的特点 二、预备知识 三、单链表的基本结构 四、单链表的基本操作 1.链表打印 2.申请节点 3.头插 4.尾插 5.头删 6.尾删 7.查找节点 8.指定位置之前插入 9.指定位置之后插入 10.删除给定节点 11.删除给定节点之…

90、动态规划-最长的有效括号

思路&#xff1a; 找出有效括号并且是最长的有效括号 dp[i]表示以i结尾的括号最长是多少 然后从1开始 因为从0位置不管是左括号还是右括号都是无法形成一个完成的括号。所以dp[0]0&#xff1b; 当i1时候&#xff0c;判断括号是否是&#xff09;如果不是那么无法结尾&#x…

cmake进阶:变量的作用域说明一(从函数作用域方面)

一. 简介 如同 C 语言一样&#xff0c;在 cmake 中&#xff0c;变量也有作用域的概念&#xff0c;本文我们就来聊一聊关于 cmake 中变量作用域的问题。 接下来从三个方面进行介绍&#xff1a;函数作用域、目录作用域以及全局作用域。 二. 函数作用域 我把这个作用域叫做函数…

pycharm安装pandas包

import pandas时提示未安装pandas&#xff0c;点击下图红框选项&#xff0c;进行pandas安装 pycharm底部会有安装中的提示 pycharm底部提示红框的内容&#xff0c;说明安装成功 这个时候就可以看到import pandas不再报错了

LeetCode 611. 有效三角形的个数

原题链接&#xff1a;611. 有效三角形的个数 - 力扣&#xff08;LeetCode&#xff09; 题目说&#xff0c;给定一个包含非负整数的数组 num&#xff0c;返回其中可以组成三角形三条边的三元组个数。 示例&#xff1a; nums [4, 2, 3, 4]&#xff1b; 有效组合如下&#xff1a;…

NIO和NIO.2对比

Java NIO (New Input/Output) 是从Java 1.4版本开始引入的一个新的I/O API&#xff0c;用于替代原来的BIO&#xff08;Blocking I/O&#xff09;API。NIO提供了更加灵活和高效的网络通信方式&#xff0c;特别适合于高吞吐量的网络编程。NIO的主要特点是非阻塞模式&#xff0c;它…

数据结构(C):玩转顺序表

&#x1f37a;0.前言 &#x1f3b7;1.线性表 &#x1f3b8;2.顺序表 &#x1f4c0;动态顺序表的实现 &#x1f4bf;初始化 &#x1f4bf;检查容量是否满了&#xff0c;进行扩容 &#x1f4bf;插入&#xff1a;头插和尾插 &#x1f4bf;删除&#xff1a;头删和尾删 &…

Python实现2048游戏

提供学习或者毕业设计使用,功能基本都有,不能和市场上正式游戏相提比论,请理性对待! 在这篇博客中,我们将使用 Python 和 Pygame 库来编写经典的 2048 游戏。2048 是一个益智类游戏,通过在 4x4 网格上滑动方块并合并它们来创建一个新的数字,直到获得数字 2048 或者无法继…

bfs之走迷宫

文章目录 走迷宫广度优先遍历代码Java代码打印路径 走迷宫 给定一个 nm 的二维整数数组&#xff0c;用来表示一个迷宫&#xff0c;数组中只包含 0或 1&#xff0c;其中 0表示可以走的路&#xff0c;1表示不可通过的墙壁。 最初&#xff0c;有一个人位于左上角 (1,1) 处&#…