【计算机考研(408)- 数据结构】绪论

绪论

基本概念(理解即可)

数据是信息的载体,是描述客观事物属性的数、字符及所有能输入到计算机中并被计算机程序识别
和处理的符号的集合。数据是计算机程序加工的原料。(For Example : 声音/图像/字符串等)

数据元素是数据的基本单位,通常作为一个整体进行考虑和处理。
一个数据元素可由若干数据项组成,数据项是构成数据元素的不可分割的最小单位。(For Example : 书籍信息是一个数据元素,其中的书名/价格/作者/ISBN等信息作为一个又一个的数据项)

数据结构是相互之间存在一种或多种特定关系的数据元素的集合。
数据对象是具有相同性质的数据元素的集合,是数据的一个子集。

数据结构三要素

不难知道,数据元素之间都不是孤立存在的,一定存在某种关系,这种数据元素之间的关系我们称之为结构。根据相关特性一般可以分为以下四种:

  • 集合
  • 线性结构
  • 树形结构
  • 图状结构或网状结构
    他们说明的是数据元素之间的逻辑关系,也叫做:逻辑结构

那么 数据结构在计算机中的表示(也称映像),也就被称作物理结构。它包括数据元素的表示和关系的表示。一般地,我们有以下几种主要的物理结构:

  • 顺序存储(以物理位置相邻表示逻辑上的相邻)
  • 链式存储(形成链状)
  • 索引存储(建立索引表)
  • 散列存储(根据关键字算存储位置)

施加在数据上的运算包括运算的定义(逻辑)和实现(物理)被称之为数据的运算

数据类型、抽象数据类型

数据类型是一个值的集合和定义在此集合上的一组操作的总称。
原子类型:其值不可再分的数据类型。(如bool & int)
结构类型:其值可以再分解为若干成分(分量)的数据类型。(如class等)
抽象数据类型(Abstract Data Type,ADT):抽象数据组织及与之相关的操作。

ADT用数学化的语言定义数据的逻辑结构、定义运算。与具体的实现无关。

算法和算法分析

算法

算法(Algorithm)是对特定问题求解步骤的一种描述,它是指令的有限序列,其中的每条指令表示一个或多个操作。从定义上和实际,他应具备如下五种特性:

  • 有穷性。一个算法必须总在执行有穷步之后结束,且每一步都可在有穷时间内完成。
  • 确定性。算法中每条指令必须有确切的含义,对于相同的输入只能得出相同的输出。
  • 可行性。算法中描述的操作都可以通过已经实现的基本运算执行有限次来实现。
  • 输入。一个算法有零个或多个输入,这些输入取自于某个特定的对象的集合。
  • 输出。一个算法有一个或多个输出,这些输出是与输入有着某种特定关系的量。

对于一个”好“算法一定要达到以下目标:

  • 正确性。算法应能够正确地解决求解问题。
  • 可读性。算法应具有良好的可读性,以帮助人们理解
  • 健壮性。输入非法数据时,算法能适当地做出反应或进行处理,而不会产生莫名其妙的输出结果。
  • 高效率(时间复杂度低)与低存储量需求(空间复杂度低)

算法效率的度量

时间复杂度

一个语句的频度是指改语句在算法中被重复执行的次数。算法中所有语句的频度之和被记为T(n)T(n)T(n)。他是关于该算法问题规模n的函数,时间复杂度主要分析T(n)T(n)T(n)的数量级。算法中基本运算(最深层的语句)的频度与T(n)T(n)T(n)同数量级每一次通常将算法中基本运算的执行次数的数量级作为该算法的时间复杂度。于是时间复杂度可以定义为:

T(n)=O(f(n))T(n) = O(f(n))T(n)=O(f(n))

当然,最终我们写出的时间复杂度应取随n增长最快的项,将其系数置为1作为时间复杂度的度量,例如f(n)=3n2+2n+1f(n) = 3n^2 + 2n + 1f(n)=3n2+2n+1,则T(n)=O(n2)T(n) = O(n^2)T(n)=O(n2)

在分析时间复杂度的时候,有以下两条规则:

  • 加法规则:T(n)=T1(n)+T2(n)=O(f(n))+O(g(n))=O(max⁡(f(n),g(n)))T(n) = T_1(n) + T_2(n) = O(f(n)) + O(g(n)) = O(\max(f(n), g(n)))T(n)=T1(n)+T2(n)=O(f(n))+O(g(n))=O(max(f(n),g(n)))
  • 乘法规则:T(n)=T1(n)×T2(n)=O(f(n))×O(g(n))=O(f(n)×g(n))T(n) = T_1(n) \times T_2(n) = O(f(n)) \times O(g(n)) = O(f(n) \times g(n))T(n)=T1(n)×T2(n)=O(f(n))×O(g(n))=O(f(n)×g(n))

常见的渐进时间复杂度有:

O(1)<O(log⁡2n)<O(n)<O(nlog⁡2n)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)O(1) < O(\log_2 n) < O(n) < O(n \log_2 n) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n) O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)

图像表示:

1

相应的我们还有如下定义:

最坏时间复杂度:最坏情况下算法的时间复杂度
平均时间复杂度:所有输入示例等概率出现的情况下,算法的期望运行时间
最好时间复杂度:最好情况下算法的时间复杂度

空间复杂度

算法的空间复杂度S(n)S(n)S(n)定义为该算法所需的存储空间,他是一个关于算法问题规模n的函数。记为:

S(n)=O(f(n))S(n) = O(f(n))S(n)=O(f(n))

他的计算方法与时间复杂度类似,主要分析算法中基本存储单元的使用情况。空间复杂度的计算也有加法和乘法规则。(不在赘述在此)

一个程序在执行时除了需要存储空间来存放自身所用的指令、常数、变量和输入数据外,还需要一些对数据进行操作的工作单元和存储一些为实现计算所需信息的辅助空间。若输入数据所占空间只取决于问题本身,和算法无关,则只需要分析除输入和程序之外的额外空间。如果算法原地工作是指算法所需的辅助空间为常量,即S(n)=O(1)S(n) = O(1)S(n)=O(1)

也就是说:空间复杂度为O(1)O(1)O(1)代表算法所需辅助空间的大小与问题规模无关。

举例:

void test(int n){int a[n];int i;
}

上面代码中,数组a的大小与n有关,因此空间复杂度为O(n)O(n)O(n)

void test(int n){int i;
}

上面代码中,变量i的大小与n无关,因此空间复杂度为O(1)O(1)O(1)

void test(int n){int a[n][n];
}

上面代码中,数组a的大小与n有关,因此空间复杂度为O(n2)O(n^2)O(n2)

void test(int n){int a[n];int b[n][n];int i;
}

上面代码中,数组a的大小与n有关,数组b的大小与n有关,因此空间复杂度为S(n)=O(n2)+O(n)+O(1)S(n) = O(n^2)+O(n)+O(1)S(n)=O(n2)+O(n)+O(1),根据加法原则:S(n)=O(n2)S(n)=O(n^2)S(n)=O(n2)

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

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

相关文章

嵌入式学习-土堆PyTorch(9)-day25

进入尾声&#xff0c;一个完整的模型训练 &#xff0c;点亮的第一个led#自己注释版 import torch import torchvision.datasets from torch import nn from torch.utils.tensorboard import SummaryWriter import time # from model import * from torch.utils.data import Dat…

Java变量详解:局部变量、成员变量、类变量区别及使用场景

作为Java开发者&#xff0c;深入理解不同变量的特性是写出高质量代码的基础。本文将为你全面解析三种核心变量类型&#xff0c;并通过实战案例展示它们的正确使用方式。一、变量类型概览 1. 局部变量&#xff08;Local Variable&#xff09; 定义&#xff1a;在方法、构造方法或…

【收集电脑信息】collect_info.sh

收集电脑信息 collect_info.sh #!/bin/bashoutput"info.txt" > "$output"# 1. OS Version echo " 操作系统名称及版本 " >> "$output" lsb_release -d | cut -f2- >> "$output" echo -e "\n" >…

服务器清理空间--主要是conda环境清理和删除

1.查看空间情况 (base) zhouy24RL-DSlab:~/zhouy24Files$ df -h Filesystem Size Used Avail Use% Mounted on udev 252G 0 252G 0% /dev tmpfs 51G 4.9M 51G 1% /run /dev/nvme0n1p3 1.9T 1.7T 42G 98% / tmpfs 252G …

UE5多人MOBA+GAS 26、为角色添加每秒回血回蓝(番外:添加到UI上)

文章目录添加生命值和蓝量的状态标签创建无限GE并应用监听添加和去除标签每秒回复配上UI添加生命值和蓝量的状态标签 添加新的标签 CRUNCH_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(Stats_Health_Full)CRUNCH_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(Stats_Health_Empty)CRUNCH_API U…

MetaGPT源码剖析(三):多智能体系统的 “智能角色“ 核心实现——Role类

每一篇文章都短小精悍&#xff0c;不啰嗦。今天我们来深入剖析Role类的代码实现。在多智能体协作系统中&#xff0c;Role&#xff08;角色&#xff09;就像现实世界中的 "员工"&#xff0c;是执行具体任务、参与协作的基本单位。这段代码是 MetaGPT 框架的核心&#…

【项目经验】小智ai MCP学习笔记

理论 1、什么是MCP MCP(Model Context Protocol&#xff0c;模型上下文协议)是一种开放式协议&#xff0c;它实现了LLM与各种工具的调用。使LLM从对话、生成式AI变成了拥有调用三方工具的AI。用官方的比喻&#xff0c;MCP就是USB-C接口&#xff0c;只要实现了这个接口&#x…

Matlab学习笔记:矩阵基础

MATLAB学习笔记:矩阵基础 作为MATLAB的核心,矩阵是处理数据的基础工具。矩阵本质上是一个二维数组,由行和列组成,用于存储和操作数值数据。在本节中,我将详细讲解矩阵的所有知识点,包括创建、索引、运算、函数等,确保内容通俗易懂。我会在关键地方添加MATLAB代码示例,…

技术演进中的开发沉思-38 MFC系列:关于打印

打印程序也是MFC开发中不能忽视的一个环节&#xff0c;现在做打印开发so easy。但当年做打印开发还是挺麻烦。在当年的桌面程序里就像拼图的最后一块&#xff0c;看着简单&#xff0c;实则要把屏幕上的像素世界&#xff0c;准确映射到打印机的物理纸张上。而MFC 的打印机制就像…

Apache Ignite 长事务终止机制

这段内容讲的是 Apache Ignite 中长事务终止机制&#xff08;Long Running Transactions Termination&#xff09;&#xff0c;特别是关于分区映射交换&#xff08;Partition Map Exchange&#xff09;与事务超时设置&#xff08;Transaction Timeout&#xff09;之间的关系。下…

网络编程---TCP协议

TCP协议基础知识TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是互联网核心协议之一&#xff0c;位于传输层&#xff08;OSI第4层&#xff09;&#xff0c;为应用层提供可靠的、面向连接的、基于字节流的数据传输服务。它与IP协议共同构成…

K 近邻算法(K-Nearest Neighbors, KNN)详解及案例

K近邻算法&#xff08;K-Nearest Neighbors, KNN&#xff09;详解及案例 一、基本原理 K近邻算法是一种监督学习算法&#xff0c;核心思想是“物以类聚&#xff0c;人以群分”&#xff1a;对于一个新样本&#xff0c;通过计算它与训练集中所有样本的“距离”&#xff0c;找出距…

深入理解 Redis 集群化看门狗机制:原理、实践与风险

在分布式系统中&#xff0c;我们常常需要执行一些关键任务&#xff0c;这些任务要么必须成功执行&#xff0c;要么失败后需要明确的状态&#xff08;如回滚&#xff09;&#xff0c;并且它们的执行时间可能难以精确预测。如何确保这些任务不会被意外中断&#xff0c;或者在长时…

Python机器学习:从零基础到项目实战

目录第一部分&#xff1a;思想与基石——万法归宗&#xff0c;筑基问道第1章&#xff1a;初探智慧之境——机器学习世界观1.1 何为学习&#xff1f;从人类学习到机器智能1.2 机器学习的“前世今生”&#xff1a;一部思想与技术的演进史1.3 为何是Python&#xff1f;——数据科学…

数据库:库的操作

1&#xff1a;查看所有数据库SHOW DATABASES;2&#xff1a;创建数据库CREATE DATABASE [ IF NOT EXISTS ] 数据库名 [ CHARACTER SET 字符集编码 | COLLATE 字符集校验规则 | ENCRYPTION { Y | N } ];[]&#xff1a;可写可不写{}&#xff1a;必选一个|&#xff1a;n 选 1ENCR…

AngularJS 动画

AngularJS 动画 引言 AngularJS 是一个流行的JavaScript框架,它为开发者提供了一种构建动态Web应用的方式。在AngularJS中,动画是一个强大的功能,可以帮助我们创建出更加生动和引人注目的用户界面。本文将详细介绍AngularJS动画的原理、用法以及最佳实践。 AngularJS 动画…

SonarQube 代码分析工具

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 🧠全面掌握 SonarQube:企业代码质量保障的利器 🚀 在当今 DevOps 流水线中,代码…

vmware vsphere esxi6.5 使用工具导出镜像

注&#xff1a;为什么使用这个工具&#xff0c;我这边主要因为esxi6.5自身bug导致web导出镜像会失败一、下载VMware-ovftool到本地系统&#xff08;根据你的操作系统版本到官网下载安装&#xff0c;此处略&#xff09;以下内容默认将VMware-ovftool安装到windows 本地系统为例。…

ES 踩坑记:Set Processor 字段更新引发的 _source 污染

问题背景 社区的一个伙伴想对一个 integer 的字段类型添加一个 keyword 类型的子字段&#xff0c;然后进行精确匹配的查询优化&#xff0c;提高查询的速度。 整个索引数据量不大&#xff0c;并不想进行 reindex 这样的复杂操作&#xff0c;就想到了使用 update_by_query 的存量…

如何彻底搞定 PyCharm 中 pip install 报错 ModuleNotFoundError: No module named ‘requests’ 的问题

如何彻底搞定 PyCharm 中 pip install 报错 ModuleNotFoundError: No module named ‘requests’ 的问题 在使用 PyCharm 开发 Python 项目时&#xff0c;ModuleNotFoundError: No module named requests 是一个常见但令人头疼的问题。本篇博文将从环境配置、原因分析到多种解…