欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 国际 > 计算机基础知识——数据结构与算法(一)(山东省大数据职称考试)

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

2024/12/21 23:36:18 来源:https://blog.csdn.net/sinat_30702153/article/details/144555735  浏览:    关键词:计算机基础知识——数据结构与算法(一)(山东省大数据职称考试)

  大数据分析应用-初级

第一部分 基础知识

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

       二、计算机基础知识

       三、信息化基础知识

       四、密码学

       五、大数据安全

       六、数据库系统

       七、数据仓库.

第二部分 专业知识

       一、大数据技术与应用

       二、大数据分析模型

       三、数据科学


数据结构与算法

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


前言

数据结构与算法

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. 算法的时间复杂度和空间复杂度在分析时都只考虑最坏情况。(×)

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com