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

  大数据分析应用-初级

第一部分 基础知识

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

       二、计算机基础知识

       三、信息化基础知识

       四、密码学

       五、大数据安全

       六、数据库系统

       七、数据仓库.

第二部分 专业知识

       一、大数据技术与应用

       二、大数据分析模型

       三、数据科学


数据结构与算法

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


前言

数据结构与算法

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…

python:用 sklearn.metrics 评价 K-Means 聚类模型

sklearn 的 metrics 模块提供的聚类模型评价指标如下&#xff1a; ARI 评价法&#xff08;兰德系数&#xff09;: adjusted_rand_score AMI 评价法&#xff08;相互信息&#xff09;: adjusted_mutual_info_score V-measure 评分 : completeness_score FMI 评价法 : fowlkes_m…

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

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

mac电脑可以使用的模拟器

BlueStacks Air 推荐-》亲测可用 BlueStacks Air https://www.bluestacks.com 支持macOS/Windows&#xff0c;刚新增了对Apple Silicon系列M芯片的支持 GameLoop https://www.gameloop.com/ 支持 macOS/Windows Genymotion https://www.genymotion.com/ 支持Android/macO…

qt 类中的run线程

在Qt中&#xff0c;QThread类的run()方法是线程的执行入口&#xff0c;它是由QThread内部自动调用的&#xff0c;而不是用户直接调用。 详细解释&#xff1a; QThread类&#xff1a; QThread是Qt的线程类&#xff0c;提供了用于多线程操作的接口。我们可以创建QThread对象并将…

ElasticSearch 数据聚合与运算

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

人工智能浪潮来袭:2024年技术革命与产业变革深度解析@附64页PDF文件下载

随着2024年的到来&#xff0c;人工智能&#xff08;AI&#xff09;技术正以前所未有的速度、广度和深度改变着我们的生产和生活方式。在这篇深度解析中&#xff0c;我们将带您一探AI技术的最新发展、产业应用的现状以及未来的安全治理趋势。 技术革命&#xff1a;AI技术的新范…

python 渗透测试开发工具之 子域名查询 python脚本逻辑 开发 高阶逻辑思维 CDN解析流程细分到信息收集的域名以及子域名分析

目录 知识点说明 域名收集是信息收集的一部分 而域名分为主域名以及子域名 所以 最后 域名说明 前提 解释域名域IP得作用 DNS解析流程【必控知识点】 解析总结 域名是什么 域名得分段解释 www.baidu.com【必控知识点】 从技术角度来看 总结: 信息收集子域名…

搭建分布式ZooKeeper集群

title: 搭建分布式ZooKeeper集群 date: 2024-11-26 23:39:00 categories: - 服务器 tags: - ZooKeeper - 大数据搭建分布式ZooKeeper集群 本次实验环境&#xff1a;Centos 7-2009、Hadoop-3.1.4、JDK 8、Zookeeper-3.6.3 前提 首先配置好Hadoop集群 为了配置方便&#xff0c…

Python高级游戏开发:打造一款塔防游戏

塔防(Tower Defense)游戏是一种经典的游戏类型,玩家通过建造防御塔来阻止敌人入侵。本文将介绍如何使用Python和Pygame库开发一款简单但高级的塔防游戏,涵盖地图设计、敌人路径规划、防御塔机制以及游戏逻辑实现。 一、游戏开发环境配置 1. 安装Pygame Pygame是Python中最…

unity 雷达

unity 雷达 首先去商店下载TouchScript插件 导入的时候勾选Enable TUIO 然后把预制体Cursors和TouchManager拖上 最后把TuioInput这个脚本挂上 脚本上的端口号尽量不改

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上的…

白话java设计模式

创建模式 单例模式&#xff08;Singleton Pattern&#xff09;&#xff1a; 就是一次创建多次使用&#xff0c;它的对象不会重复创建&#xff0c;可以全局来共享状态。 工厂模式&#xff08;Factory Method Pattern&#xff09;&#xff1a; 可以通过接口来进行实例化创建&a…

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

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

Python发送带key的kafka消息

在Python中发送带有键&#xff08;key&#xff09;的Kafka消息&#xff0c;通常会使用confluent-kafka或kafka-python这样的库。这里我将分别展示如何使用这两个库来实现这个功能。 ### 使用 confluent-kafka 首先&#xff0c;确保你已经安装了confluent-kafka库。如果没有安装…

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

机器学习预处理-表格数据的空值处理 机器学习预处理-表格数据的分析与可视化中详细介绍了表格数据的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…

【mysql】如何解决主从架构从库延迟问题

目录 1. 说明2.优化主库的写入性能3. 优化网络性能4. 增强从库的硬件性能5. 调整从库的配置6. 主从架构优化7. 监控和调优8.使用 GTID 和 Group Replication 1. 说明 1.在 MySQL 数据库中&#xff0c;从库延迟&#xff08;replication lag&#xff09;是指主库和从库之间的数据…

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;支持多种工…