数据结构基础(一)

文章目录

  • 1 数据结构基础
    • 1.1 什么是程序?
    • 1.2 数据、数据元素、数据项、数据对象
    • 1.3 基本的逻辑结构
  • 2 算法效率
    • 2.1 时间复杂度
      • 2.1.1 循环执行次数
      • 2.1.2 大O(n)表示法
    • 2.2 空间复杂度

1 数据结构基础

1.1 什么是程序?

​ 程序 = 数据结构 + 算法

  • 数据结构:数据结构就是数据的 “收纳盒”,比如书包的不同夹层帮你快速找到课本、文具。数据结构就是用特定的整理方式,让计算机能快速的存取需要的数据。合理的数据结构能够有效提升数据存取的效率,为算法的高效执行提供基础。
  • 算法:算法就是解决问题的"操作手册",就像菜谱分步教你怎么做菜一样,它用明确的步骤告诉计算机该怎么处理数据、解决问题。所以,算法就是解决问题的具体方法、电脑运算的具体过程。

1.2 数据、数据元素、数据项、数据对象

  • 数据:所有的信息,例如文本、图像、音频、视频等,计算机都会用 “二进制语言”(0和1的组合)记录下来。计算机用 0101 这样的数字记录所有的数据。所以,数据是客观事物的(二进制)符号表示。
  • 数据元素:是数据的基本单位,例如一张图片、一段音频等,在数据结构中,就是链表中的一个节点、树中的一个节点、图中的一个节点。
  • 数据项:是组成数据元素的、有独立含义、不可分割的最小单位,例如一段音频的音高、音量、时间长度等,都是数据项。
  • 数据对象:是有相同性质的数据元素的集合,是数据的一个子集,例如相似的图片,相似风格的音乐等。

​ 举个栗子,以一个学生管理系统为例,将所有学生的信息用 0101 的二进制形式记录下来,这就是数据。而每一个学生就是一个数据元素,数据项就是学生的各种属性,例如学号、姓名、性别等,数据对象就是一堆有相同性质的学生,比如可以按照性别将数据分为男同学数据和女同学数据两种数据对象,所以当数据对象的分类标准不同时,分类结果也就不同了。

​ PS:数据、数据元素、数据项、数据对象这些概念,如果你是需要考试的同学,一定要搞清楚,但在实际的应用中,意义并不大,不必深纠。

1.3 基本的逻辑结构

​ 首先,逻辑结构和存储结构是截然不同的两个概念:

  • 逻辑结构:是指数据元素之间的逻辑关系。
  • 存储结构:是指数据在计算机中的存储形式,即物理上的存储结构。

基本的逻辑结构有以下四种:

在这里插入图片描述

基本的存储结构有以下两种:

在这里插入图片描述

2 算法效率

2.1 时间复杂度

​ 时间复杂度用来表示算法运行时间的长短,用来定性的描述程序的运行时间。

2.1.1 循环执行次数

(1)

for (int i=0; i<n; i++)
{
	printf("%d\n", i);
}
//该代码段内,for() 语句将被执行 n+1 次,而不是 n 次,当 i=n-1 时,循环正常运行,当 i=n 时,for() 仍需要判断 i<n 条件是否成立,不成立,跳出 for() 循环,最后这一次判断导致 for() 语句的执行次数是 n+1 次,而不是 n 次。

//printf()只有在符合 i<n 条件时,才会执行,所以执行次数是 n 次。

(2)

for (int i=0; i<n; i++)
{   
	for (int j=0; j<n; j++)
	{
    	printf("i:%d,j:%d\n", i ,j);
	}  
} 
//该代码段内,for()外部循环语句将执行 n+1 次。for()内部循环将被执行 n(n+1) 次。

//printf()将执行 n*n 次。

(3)

for (i=1; i<=n; i++)
{   
	for (j=1; j<=i; j++)
	{
		for (k=1; k<=j; k++)   
    	{
			printf("i:%d, j:%d, k:%d \n", i, j , k);  
    	}
	}  
} 
//该代码段内,从内到外思考 printf() 的循环次数,内部第一层循环执行 j 次,第二层循环,执行次数是 j 分别取值 0~i 的求和。可得 printf() 的执行次数为:

∑ i = 1 i = n ∑ j = 1 j = i j = 1 / 6 n ( n + 1 ) ( 2 n + 1 ) \sum_{i=1}^{i=n}\sum_{j=1}^{j=i} j = 1/6 n(n+1)(2n+1) i=1i=nj=1j=ij=1/6n(n+1)(2n+1)

​ 这里有些小伙伴会疑惑,为什么就成累加了呢?我们只考虑内部的 j 和 k 两层循环,带入具体的值想一下:

​ 假设 j 的最大值是 5,j 会从 1 一直累加到 5 ,那么 j = 1 时,k <= 1,此时 printf 会被执行一次,之后内部循环就不满足循环条件退出了,而外部循环中的 j 就被累加到了 2 ,此时 k <= 2,此时printf会被执行两次,然后跳出循环,以此类推,执行的次数就是 1+ 2 + 3+ 4 + 5。

(4)

for (i=0; i<n; i=i*2)
{
	printf("Hello World\n");
}
//该代码段内,i=i*2 我们设执行次数为k,所以跳出循环的判断条件可以简化表示为:

2 k − 1 > n 时跳出循环,即 k = l o g 2 ( n + 1 ) 时 2^k-1 > n 时跳出循环,即 k = log_2 (n+1)时 2k1>n时跳出循环,即k=log2(n+1)

2.1.2 大O(n)表示法

(1)对于以上四个循环例子,当 n 趋于无限大时,执行次数的系数和常数项可以忽略不计,因此,以上四个例子的 printf() 语句的时间复杂度用 O(n) 可以表示为:

  1. O ( n ) O(n) O(n)

  2. O ( n 2 ) O(n^2) O(n2)

  3. O ( n 3 ) O(n^3) O(n3)

  4. O ( l o g 2 ( n ) ) O(log_2 (n)) O(log2(n))

简单来看,多项式中有多少 n 相乘,复杂度就是 n 的几次方。

(2)常见的时间复杂度,以及当 n 区域无穷大时的效率:

在这里插入图片描述

(3)在用 O(n) 描述算法的时间复杂度时,我们往往一般说的是平均时间复杂度,除此之外,我们还需要考虑,最差时间复杂度,和最好时间复杂度,具体问题具体分析,才能写出更好的程序。

2.2 空间复杂度

​ 即算法占用内存空间的大小。与时间复杂度不同,我们通常只关注最差空间复杂度。因为内存空间是硬性要求,我们必须确保所有输入的数据都有足够的内存空间。空间复杂度的推算方法与时间复杂度大致相同,只需将统计对象从 “操作数量” 转为 “使用空间大小” 我们举几个例子。

  1. O ( 1 ) :与循环无关的变量 O(1):与循环无关的变量 O(1):与循环无关的变量

  2. O ( l o g 2 ( n ) ) :例如递归树,分治算法 O(log_2 (n)):例如递归树,分治算法 O(log2(n)):例如递归树,分治算法

  3. O ( n ) :例如数组,链表,栈,队列 O(n):例如数组,链表,栈,队列 O(n):例如数组,链表,栈,队列

  4. O ( n 2 ) :例如二维数组 O(n^2):例如二维数组 O(n2):例如二维数组

  5. O ( l o g 2 ( n ) ) :例如二叉树 O(log_2 (n)):例如二叉树 O(log2(n)):例如二叉树

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

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

相关文章

taosd 写入与查询场景下压缩解压及加密解密的 CPU 占用分析

在当今大数据时代&#xff0c;时序数据库的应用越来越广泛&#xff0c;尤其是在物联网、工业监控、金融分析等领域。TDengine 作为一款高性能的时序数据库&#xff0c;凭借独特的存储架构和高效的压缩算法&#xff0c;在存储和查询效率上表现出色。然而&#xff0c;随着数据规模…

RangeError: Maximum call stack size exceeded

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 &#x1f35a; 蓝桥云课签约作者、…

《白帽子讲 Web 安全》之文件操作安全

目录 引言 &#xff08;一&#xff09;文件上传与下载漏洞概述 1.文件上传的常见安全隐患 1.1前端校验的脆弱性与服务端脚本执行危机在文件上传流程中&#xff0c;部分开发者可能会在前端使用 JavaScript 代码对文件后缀名进行简单校验&#xff0c;试图以此阻止非法文件上传…

[FE] React 初窥门径(五):React 组件的加载过程(commit 阶段)

1. 回顾 前一篇文章我们看到&#xff0c;ReactDOM.render 总共包含这些步骤&#xff0c; 然后介绍了 performSyncWorkOnRoot 做的事情&#xff0c;它主要做了两件事&#xff0c; renderRootSync 可称之为 render 阶段&#xff1a;创建了一颗 Fiber Tree&#xff08;包含 html …

Elastic如何获取当前系统时间

文章目录 1. 使用 _ingest.timestamp 在 Ingest Pipeline 中获取当前时间2. 使用 Painless Script 获取当前时间3. 使用 now 关键字在查询中获取当前时间4. 使用 date 类型字段的默认值5. 使用 Kibana 的 Dev Tools 查看当前时间6. 使用 date 聚合获取当前时间7. 使用 Elastics…

Elasticsearch 2025/3/7

高性能分布式搜索引擎。 数据库模糊搜索比较慢&#xff0c;但用搜索引擎快多了。 下面是一些搜索引擎排名 Lucene是一个Java语言的搜索引擎类库&#xff08;一个工具包&#xff09;&#xff0c;apache公司的顶级项目。 优势&#xff1a;易扩展、高性能&#xff08;基于倒排索引…

计算机毕业设计Python+DeepSeek-R1大模型医疗问答系统 知识图谱健康膳食推荐系统 食谱推荐系统 医疗大数据(源码+LW文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

网络安全通信架构图

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 在安全通信里面我经常听到的2个东西就是SSL和TLS&#xff0c;这2个有什么区别呢&#xff1f;以及HTTPS是怎么通信的&#xff1f;包括对称加密、非对称加密、摘要、…

代码随想录算法训练营第22天 | 组合总和 分割回文串

39. 组合总和 39. 组合总和 - 力扣&#xff08;LeetCode&#xff09; 题目链接/文章讲解&#xff1a;代码随想录 视频讲解&#xff1a;带你学透回溯算法-组合总和&#xff08;对应「leetcode」力扣题目&#xff1a;39.组合总和&#xff09;| 回溯法精讲&#xff01;_哔哩哔哩_…

esp32 arduino开发常用函数(需要和乐鑫的arduino文档配合使用)

说明&#xff1a;1、由于写函数参数浪费时间并且没有说明只有参数意义不大&#xff0c;所以在此函数一般只以函数名出现。 2、esp32有两个核心&#xff0c;编号为0和1&#xff0c;如果启动了wifi和蓝牙&#xff0c;则会默认将wifi和蓝牙运行在编号为0的核心上。 3、esp32adc2…

《鸢尾花数学大系:从加减乘除到机器学习》开源资源

《鸢尾花数学大系&#xff1a;从加减乘除到机器学习》开源资源 Gitee&#xff1a;https://gitee.com/higkoo/ bilibili&#xff1a;https://space.bilibili.com/513194466 GitHub&#xff1a;https://github.com/Visualize-ML

Markdown HTML 图像语法

插入图片 Markdown ![图片描述](图片链接)一般来说&#xff0c;直接复制粘贴过来就行了&#xff0c;部分网页/应用可以拖拽&#xff0c;没人会真敲图片的链接吧…… 示例图片&#xff1a; ![Creeper?](https://i-blog.csdnimg.cn/direct/f5031c8c4f15421c9882d7eb23540b8…

deepseek在pycharm 中的配置和简单应用

对于最常用的调试python脚本开发环境pycharm&#xff0c;如何接入deepseek是我们窥探ai代码编写的第一步&#xff0c;熟悉起来总没坏处。 1、官网安装pycharm社区版&#xff08;免费&#xff09;&#xff0c;如果需要安装专业版&#xff0c;需要另外找破解码。 2、安装Ollama…

华为eNSP:配置单区域OSPF

一、什么是OSPF&#xff1f; OSPF&#xff08;Open Shortest Path First&#xff0c;开放最短路径优先&#xff09;是一种链路状态路由协议&#xff0c;属于内部网关协议&#xff08;IGP&#xff09;&#xff0c;主要用于在单一自治系统&#xff08;AS&#xff09;内部动态发现…

live555推流服务器异常

1.后端异常信息&#xff1a; MultiFramedRTPSink::afterGettingFrame1(): The input frame data was too large for our buffer size (100176). 48899 bytes of trailing data was dropped! Correct this by increasing "OutPacketBuffer::maxSize" to at least m…

ubuntu24.04-系统重装

1.下载系统并安装 参考 Ubuntu-24.04安装教程超详细(2024)_ubuntu24.04-CSDN博客 ubuntu.iso下载地址&#xff1a;https://cn.ubuntu.com/download/desktop 2.添加清华源 1.清华大学开源软件镜像站 | Tsinghua Open Source Mirror sudo passwd root #设置 root 密…

中原银行:从“小机+传统数据库”升级为“OceanBase+通用服务器”,30 +系统成功上线|OceanBase DB大咖说(十五)

OceanBase《DB 大咖说》第 15 期&#xff0c;我们邀请到了中原银行金融科技部数据团队负责人&#xff0c;吕春雷。本文为本期大咖说的精选。 吕春雷是一位资历深厚的数据库专家&#xff0c;从传统制造企业、IT企业、甲骨文公司到中原银行&#xff0c;他在数据库技术与运维管理…

性能测试监控工具jmeter+grafana

1、什么是性能测试监控体系&#xff1f; 为什么要有监控体系&#xff1f; 原因&#xff1a; 1、项目-日益复杂&#xff08;内部除了代码外&#xff0c;还有中间件&#xff0c;数据库&#xff09; 2、一个系统&#xff0c;背后可能有多个软/硬件组合支撑&#xff0c;影响性能的因…

第TR3周:Pytorch复现Transformer

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客 &#x1f356; 原作者&#xff1a;K同学啊 Transformer通过自注意力机制&#xff0c;改变了序列建模的方式&#xff0c;成为AI领域的基础架构 编码器&#xff1a;理解输入&#xff0c;提取上下文特征…

操作系统 2.7-CPU调度策略

什么是CPU调度 这张图展示了操作系统中多进程管理和CPU调度的基本概念。图中显示了三个不同的进程&#xff08;PID:1, PID:2, PID:3&#xff09;&#xff0c;它们各自处于不同的执行状态&#xff0c;并由操作系统的调度器&#xff08;Scheduler&#xff09;进行管理。 图中元素…