计算机基础知识——数据结构与算法(一)(山东省大数据职称考试)

  大数据分析应用-初级

第一部分 基础知识

       一、大数据法律法规、政策文件、相关标准

       二、计算机基础知识

       三、信息化基础知识

       四、密码学

       五、大数据安全

       六、数据库系统

       七、数据仓库.

第二部分 专业知识

       一、大数据技术与应用

       二、大数据分析模型

       三、数据科学


数据结构与算法

  • 大数据分析应用-初级
  • 前言
  • 一、程序性能分析
  • 二、常见可视化图形的概念
  • 练习题目


前言

数据结构与算法

1、掌握程序性能分析的概念和方法,包括时间复杂性与空间复杂性分析。


一、程序性能分析

(一)时间复杂性分析
  1. 定义

    • 时间复杂性是指算法在执行过程中所需的时间与输入数据规模之间的关系。它通常使用大O表示法来描述,即T(n) = O(f(n)),其中T(n)表示算法的执行时间,n表示输入数据的规模,f(n)是表示算法执行时间与n的关系的函数。
  2. 分析方法

    • 关注核心代码:在分析算法的时间复杂性时,通常只关注执行次数最多的代码段,即核心代码。这是因为大O表示法只关心增长趋势,而忽略低阶项、常数项和系数。
    • 加法法则:如果算法包含多个独立的部分,每个部分的时间复杂性分别为O(f(n))和O(g(n)),则整个算法的时间复杂性为O(max(f(n), g(n)))。
    • 乘法法则:对于嵌套循环或递归调用,算法的时间复杂性等于嵌套内外代码复杂度的乘积。
  3. 常见的时间复杂性

    • O(1):常量级,执行时间不随输入数据规模变化。
    • O(logn):对数级,如二分查找。
    • O(n):线性级,如数组、链表的遍历。
    • O(nlogn):如快速排序、归并排序。
    • O(n^2):平方级,如冒泡排序、插入排序、选择排序。
    • O(2^n):指数级,如回溯穷举算法。

时间复杂性例子

线性查找

假设我们有一个长度为n的数组,需要查找某个元素是否在其中。最直接的方法是线性查找,即从头到尾依次比较数组中的每个元素,直到找到目标元素或遍历完整个数组。

bool linearSearch(int arr[], int n, int target) {for (int i = 0; i < n; i++) {if (arr[i] == target) {return true;}}return false;
}

在这个算法中,最坏情况下需要遍历整个数组,因此时间复杂度为O(n)。

二分查找

如果我们事先知道数组是有序的,那么可以使用二分查找来提高查找效率。二分查找通过每次将查找范围缩小一半,从而在对数时间内找到目标元素。

int binarySearch(int arr[], int n, int target) {int left = 0, right = n - 1;while (left <= right) {int mid = left + (right - left) / 2;if (arr[mid] == target) {return mid;} else if (arr[mid] < target) {left = mid + 1;} else {right = mid - 1;}}return -1; // 未找到目标元素
}

这个算法的时间复杂度为O(logn)。

冒泡排序

冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复进行的,直到没有再需要交换的元素为止。

void bubbleSort(int arr[], int n) {for (int i = 0; i < n - 1; i++) {for (int j = 0; j < n - i - 1; j++) {if (arr[j] > arr[j + 1]) {// 交换arr[j]和arr[j + 1]int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}
}

冒泡排序的时间复杂度为O(n^2),因为有两层嵌套循环。
 

(二)空间复杂性分析
  1. 定义

    • 空间复杂性是指算法在执行过程中所需的存储空间与输入数据规模之间的关系。它通常使用S(n) = O(f(n))来表示,其中S(n)表示算法所需的存储空间,n表示输入数据的规模,f(n)是表示存储空间与n的关系的函数。
  2. 分析方法

    • 考虑输入数据:算法所需的存储空间包括输入数据本身所占用的空间。
    • 考虑额外空间:除了输入数据外,算法在执行过程中还需要额外的存储空间来保存中间结果或辅助数据结构。
    • 忽略常量和低阶项:与时间复杂性类似,空间复杂性也通常只关心增长趋势,而忽略低阶项和常数项。
  3. 常见的空间复杂性

    • O(1):常量级,所需存储空间不随输入数据规模变化。

              2. O(n):线性级,所需存储空间与输入数据规模成正比。

空间复杂性例子

数组排序

对于数组排序问题,如果使用原地排序算法(如冒泡排序、插入排序、选择排序、快速排序等),则空间复杂度为O(1)(不考虑输入数组本身所占用的空间)。因为这些算法在排序过程中只需要常数级别的额外空间来保存临时变量。

然而,如果使用归并排序等需要额外数组的排序算法,则空间复杂度会提高到O(n)。归并排序在每次合并操作时都需要一个与输入数组大小相同的临时数组来保存合并后的结果。

递归算法

递归算法的空间复杂度通常与递归调用的深度有关。例如,计算阶乘的递归算法:

long long factorial(int n) {if (n <= 1) {return 1;} else {return n * factorial(n - 1);}
}

这个算法的空间复杂度为O(n),因为递归调用的深度为n(每次调用都会将n减1,直到n为1时停止调用)。每次递归调用都需要在栈上保存一个函数调用帧,因此总的空间占用与递归调用的深度成正比。

(三)实际应用中的考虑

       在选择算法和数据结构时,需要综合考虑时间复杂性和空间复杂性。例如,哈希表可以在常数时间内完成查找操作,但可能需要较多的存储空间;而二叉搜索树则可以在对数时间内完成查找操作,同时占用较少的存储空间。因此,在选择时需要根据具体应用场景和需求进行权衡。

       此外,还需要注意算法的稳定性和适应性。稳定性是指算法在面对不同输入数据时的表现是否一致;适应性是指算法是否能够在不同环境和需求下保持高效性能。这些因素也是评估算法优劣的重要方面。

  


练习题目

一、单选题

1. 以下关于时间复杂度的说法,正确的是( )
A. 时间复杂度是指算法执行过程中所需要的时间精确值
B. 时间复杂度是算法执行过程中基本操作的执行次数随着问题规模 n 增长的函数
C. 对于一个算法,其时间复杂度与输入数据无关
D. 时间复杂度只能通过实际运行算法来测量

答案:B

解析:

A 选项:时间复杂度不是算法执行所需时间的精确值,因为不同的硬件环境、编程语言实现等都会影响实际执行时间。

B 选项:时间复杂度主要是衡量算法基本操作的执行次数随问题规模 n 的变化情况,它是一个函数关系,例如,对于一个简单的循环遍历长度为 n 的数组,基本操作执行次数是 n 次,时间复杂度可以表示为 O (n)。

C 选项:有些算法的时间复杂度与输入数据有关,例如在排序算法中,已经有序的数组和无序的数组在某些排序算法(如冒泡排序)中的时间复杂度会有所不同。

D 选项:时间复杂度不是通过实际运行算法来测量的,因为实际运行时间会受到很多外部因素干扰。它是通过分析算法的基本操作执行次数和问题规模的关系来确定的。

2. 若某算法的时间复杂度为O (n^2),当n=5 时,基本操作执行次数可能是( )
A. 10
B. 20
C. 25
D. 30

答案:C

解析:
时间复杂度O (n^2)表示算法的基本操作执行次数T (n)满足 T (n)=c * n^2(c 为常数)。当n=5 时,T (n)=c * 5^2=25c。虽然不知道常数 c 的值,但基本操作执行次数与n^2成正比,所以最有可能是 25(假设 c = 1 的情况)。

3. 下面代码片段的时间复杂度是( )

for i in range(n):for j in range(n):print(i * j)

答案:C

解析:
外层循环执行 n 次,对于每次外层循环的迭代,内层循环也执行 n 次。所以总的基本操作(这里是打印语句)执行次数是 n*n=n^2,时间复杂度为O (n^2) 。

4. 空间复杂度用来衡量( )
A. 算法在运行过程中临时占用存储空间大小的量度
B. 算法编写好后,代码占用的存储空间大小
C. 算法所处理的数据占用的存储空间大小
D. 算法在运行过程中,输入数据占用的存储空间大小

答案:A

解析:

A 选项:空间复杂度主要是衡量算法在运行过程中临时占用的存储空间大小,包括程序运行过程中定义的变量、数据结构等占用的空间。

B 选项:代码本身占用的空间不属于空间复杂度考虑的范畴,空间复杂度关注的是运行时的空间占用。

C 选项:算法处理的数据本身占用的空间只是一部分,更重要的是算法运行过程中额外开辟的临时空间。

D 选项:输入数据占用的空间不是空间复杂度主要衡量的内容,重点是算法运行过程中产生的临时空间开销。

5. 对于一个递归算法,若其递归调用的深度为 ,且每次递归调用所需的栈空间为常数 ,则该算法的空间复杂度为( )

答案:B

解析:
因为递归调用深度为n,每次调用需要常数c的栈空间,那么总的空间占用与递归深度n成正比,所以空间复杂度为O (n)。

二、多选题

1. 以下哪些因素会影响算法的时间复杂度?( )
A. 问题规模
B. 输入数据的初始状态
C. 算法的实现语言
D. 计算机的硬件性能

答案:AB

解析:

A 选项:时间复杂度本身就是问题规模 n 的函数,问题规模越大,基本操作执行次数通常会按照时间复杂度所描述的规律增长。

B 选项:例如排序算法,对于已经有序的数组和无序的数组,某些排序算法(如冒泡排序)的时间复杂度会不同,输入数据的初始状态会影响算法执行的基本操作次数。

C 选项:算法的实现语言主要影响代码的执行效率,但不会改变算法时间复杂度的本质。例如,同样是O (n)时间复杂度的算法,用不同语言实现可能运行速度不同,但时间复杂度不变。

D 选项:计算机硬件性能影响算法的实际运行时间,但不影响时间复杂度的分析。时间复杂度是基于算法本身的操作次数和问题规模的理论分析。

2. 下列时间复杂度中,性能从优到劣排序正确的是( )

答案:A

解析:

3. 以下关于空间复杂度的描述,正确的有( )
A. 空间复杂度可以是一个常数
B. 递归算法的空间复杂度一定比非递归算法高
C. 空间复杂度和时间复杂度一样,也是用大 O 记号来表示
D. 一个算法的空间复杂度可能随着问题规模的增长而增长

答案:ACD

解析:

A 选项:如果一个算法在运行过程中占用的临时空间始终是一个固定的值,那么空间复杂度可以是常数,例如O (1) 。

B 选项:并不是所有递归算法的空间复杂度都比非递归算法高。有些简单的递归算法可能空间复杂度很低,而一些非递归算法如果大量使用复杂的数据结构存储数据,空间复杂度可能很高。

C 选项:空间复杂度和时间复杂度一样,常用大 O 记号来表示算法在空间占用方面的渐近行为。

D 选项:例如创建一个长度为 n 的数组,空间复杂度就会随着问题规模 n 的增长而增长,可能是O (n)。

4. 若一个算法的时间复杂度为O (n^3) ,以下说法正确的是( )
A. 当问题规模  增大时,算法执行时间增长速度快于O (n^2)算法
B. 它可能是一个三重嵌套循环的算法
C. 对于较小的n值,其执行时间可能比时间复杂度为O (n^2)的算法短
D. 它的基本操作执行次数一定是n^3

答案:ABC

解析:

A 选项:O (n^3)的增长速度快于O (n^2),当问题规模 n 增大时,O (n^3) 算法的执行时间增长得更快。

B 选项:一个三重嵌套循环,最内层的基本操作执行次数通常是 n*n*n=n^3,时间复杂度可能是O (n^3)。

C 选项:时间复杂度是一种渐近表示,对于较小的 n 值,由于常数等因素的影响,O (n^3)算法的执行时间可能比O (n^2)算法短。

D 选项:O (n^3)表示基本操作执行次数T (n)满足T (n)=c*n^3(c 为常数),不一定是 n^3。

三、判断题

1. 时间复杂度为O (n)的算法一定比时间复杂度为O (n^2)的算法快。(×)

解析:时间复杂度是渐近的表示,当问题规模 n 较小时,O (n^2)算法可能由于常数等因素的影响而比O (n)算法快。而且实际运行时间还受编程语言、计算机硬件等因素影响。

2. 一个算法的空间复杂度越高,其时间复杂度也一定越高。(×)

解析:空间复杂度和时间复杂度衡量的是算法的不同方面。一个算法可能占用大量空间但时间复杂度很低,例如创建一个很大的静态数组来存储数据,空间复杂度高,但如果只是简单地读取数组元素,时间复杂度可以是O (1)。

3. 所有递归算法的时间复杂度都高于非递归算法。(×)

解析:递归算法和非递归算法的时间复杂度高低不能一概而论。有些递归算法时间复杂度较低,如简单的二分查找递归实现,时间复杂度为O (logn),非递归实现的时间复杂度也是O (logn);有些非递归算法如果实现得不好,时间复杂度可能很高。

4. 算法的时间复杂度和空间复杂度在分析时都只考虑最坏情况。(×)

解析:时间复杂度和空间复杂度可以分析最坏情况、最好情况和平均情况。在实际应用中,根据需要来选择分析哪种情况。例如在实时系统中,最坏情况的时间复杂度分析更重要,而在一些数据统计场景中,平均情况的分析可能更有意义。

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

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

相关文章

WebView通过@JavascriptInterface 调用原生方法

1. 创建 WebView 和设置 WebView 设置 在 XML 布局中添加 WebView 在activity_main.xml里创建一个WebView控件 <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android"http://schem…

基于AI对话生成剧情AVG游戏

游戏开发这个领域&#xff0c;一直有较高的学习门槛。作为一个非专业的游戏爱好者&#xff0c;如果想要开发游戏&#xff0c;往往受制于游戏引擎的专业程度&#xff0c;难以完成复杂的游戏项目。 AI IDE的诞生&#xff0c;提供了另外的一种思路&#xff0c;即通过AI 生成项目及…

ElasticSearch 数据聚合与运算

1、数据聚合 聚合&#xff08;aggregations&#xff09;可以让我们极其方便的实现数据的统计、分析和运算。实现这些统计功能的比数据库的 SQL 要方便的多&#xff0c;而且查询速度非常快&#xff0c;可以实现近实时搜索效果。 注意&#xff1a; 参加聚合的字段必须是 keywor…

F5中获取客户端ip地址(client ip)

当F5设备对其原始设置上的所有IP地址使用NAT时&#xff0c;连接到poo成员&#xff08;nodes、backend servers&#xff09;的出站连接将是NAT IP地址。 pool 成员&#xff08;nodes、backend servers&#xff09;将无法看到真实的客户端 ip地址&#xff0c;因为看到的是F5上的…

MATLAB引用矩阵元素的几种方法

引用矩阵元素可以通过索引&#xff0c;也可以通过逻辑值 索引 通过引用元素在矩阵中的位置来提取元素&#xff0c;例如&#xff1a; - 逻辑值 通过某种逻辑运算来使得要提取的值变为逻辑 1 1 1&#xff0c;用 A ( ) A() A()提取即可&#xff0c; A A A为原矩阵的名称。 例如&…

机器学习预处理-表格数据的空值处理

机器学习预处理-表格数据的空值处理 机器学习预处理-表格数据的分析与可视化中详细介绍了表格数据的python可视化&#xff0c;可视化能够帮助我们了解数据的构成和分布&#xff0c;是我们进行机器学习的必备步骤。上文中也提及&#xff0c;原始的数据存在部分的缺失&#xff0…

了解 SpringMVC 请求流程

文章目录 1. Spring 基础 - SpringMVC 请求流程1.1 引入1.2 什么是 MVC1.3 什么是 Spring MVC1.4 请求流程核心架构的具体流程步骤补充 1.5 案例**Maven 包引入****业务代码的编写**DaoServiceControllerwebapp 下的 web.xmlspringmvc.xmlJSP 视图 2. Spring 进阶 - Dispatcher…

Springboot3.x配置类(Configuration)和单元测试

配置类在Spring Boot框架中扮演着关键角色&#xff0c;它使开发者能够利用Java代码定义Bean、设定属性及调整其他Spring相关设置&#xff0c;取代了早期版本中依赖的XML配置文件。 集中化管理&#xff1a;借助Configuration注解&#xff0c;Spring Boot让用户能在一个或几个配…

鸿道Intewell-C纯实时构型,适合有功能安全认证需求的工业操作系统

鸿道Intewell-C纯实时构型&#xff0c;适合有功能安全认证需求的工业操作系统 鸿道Intewell-C是一款工业实时微内核操作系统&#xff0c;由科东软件自主研发&#xff0c;具有超低延迟和最小抖动&#xff0c;保障工业设备可以高效处理时间敏感的现场业务&#xff0c;支持多种工…

Stream– ESP8266物联网应用,(客户端向服务器发送数据信息 客户端向服务器请求数据信息)

Stream– ESP8266物联网应用 Stream对于ESP8266-Arduino语言来说指的是数据序列。请留意&#xff1a;在C编程中Stream常被翻译作“流”。我们认为将Stream称为数据序列更加直观。因为数据序列这一概念有两个很关键特点。 第一个特点是“序”&#xff0c;即数据序列不能是杂乱…

芯品荟|SWM221系列芯片之TFTLCD彩屏显示及控制

“革新未来&#xff0c;智驭控制新纪元”&#xff0c;由广东华芯微特集成电路有限公司市场总监张琢&#xff0c;对SWM221系列的强大功能表现进行了整体介绍。 确实&#xff0c;华芯微特在TFTLCD显示及控制有十多年应用基础和积累的团队&#xff0c;仍勇于挑战&#xff0c;自我…

MIT S6081 2024 Lab 1 | Operating System | Notes

目录 安装与下载 实验1 开始我们的实验 sleep&#xff08;简单&#xff09; pingpong&#xff08;简单&#xff09; primes (中等)/(困难) find&#xff08;中等&#xff09; xargs&#xff08;中等&#xff09; finally Reference I. Tools Debian 或 Ubuntu Arch…

华为认证HCIA——数据传输形式,数据封装的基本概念

前言&#xff1a; 整理下学习笔记&#xff0c;打好基础&#xff0c;daydayup!!! 对网络概念有基本理解后&#xff08;华为认证HCIA——网络基本概念&#xff09;&#xff0c;开始进一步学习数据传输。 数据传输的形式 数据传输主要有三种形式&#xff1a; 1&#xff0c;电路传…

opencv小练习(未完成版)

读取一张彩色图像并将其转换为灰度图。 import cv2# 读取图片 img cv2.imread("./duck.png") img cv2.resize(img, dsizeNone, fx0.4, fy0.4, interpolationcv2.INTER_LINEAR) # 读取一张灰度图 img_gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 展示图片 cv2.im…

WSL (Windows Subsystem for Linux)

文章目录 Windows下使用Linux的三种方式&#xff1a;1.WSL(1)安装WSL(2)初始化Linux系统(3)安装、创建、激活 Python虚拟环境 2.虚拟机3.Docker Windows下使用Linux的三种方式&#xff1a; 1.WSL 是最简单的在 Windows 上运行 Linux 环境的方式&#xff0c;适用于日常开发和命…

金融分析-Transformer模型(基础理论)

Transformer模型 1.基本原理 transformer的core是注意力机制&#xff0c;其本质就是编码器-解码器。他可以通过多个编码器进行编码&#xff0c;再把编码完的结果输出给解码器进行解码&#xff0c;然后得到最终的output。 1.1编码器 数据在编码器中会经过一个self-attention的…

【一本通】两个数的最小公倍数

【一本通】两个数的最小公倍数 C语言代码C 代码Java代码Python代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 输入两个正整数&#xff0c;编程计算两个数的最小公倍数。 输入 两个整数 输出 最小公倍数 样例输入 12 18样例输出 …

D 咖智能饮品机器人:开启商业新篇

在科技迅猛发展的当下&#xff0c;智能机器人正逐步渗透到各个商业领域&#xff0c;D 咖智能饮品机器人便是其中的佼佼者&#xff0c;它的出现为饮品行业带来全新的发展契机&#xff0c;有望开启商业新篇。 从大环境来看&#xff0c;消费者对于饮品的需求日益多元化和个性化。他…

35. Three.js案例-创建带阴影的球体与平面

35. Three.js案例-创建带阴影的球体与平面 实现效果 知识点 WebGLRenderer WebGLRenderer 是Three.js中用于渲染场景的主要类之一&#xff0c;它负责将场景中的对象渲染到画布上。 构造器 new THREE.WebGLRenderer(parameters : Object) 参数类型描述parametersObject可选…

leetcode212. 单词搜索 II

给定一个 m x n 二维字符网格 board 和一个单词&#xff08;字符串&#xff09;列表 words&#xff0c; 返回所有二维网格上的单词 。 单词必须按照字母顺序&#xff0c;通过 相邻的单元格 内的字母构成&#xff0c;其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一…