初识数据结构及复杂度

1、数据结构

        数据结构=数据+结构(描述和组织数据),Java会把一些数据结构封装起来,在java中数据结构叫做集合。

        数据结构:(data structer)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。

        Q:数据库与数据结构的关系?

        A:数据库一般用来存数据,我们需要了解数据库底层如何存储数据,同时数据库底层也使用了数据结构。

        Q:什么是算法?

        A:算法(Algorithm):就是定义良好的计算过程,通过取一个或一组的值为输入,并产生出一个或一组值作为输出。简单来说算法就是一系列的计算步骤,用来将输入数据转化成输出结果。

2. 时间复杂度

        时间复杂度的定义:在计算机科学中,算法的时间复杂度是一个数学函数,它定量描述了该算法的运行时间。一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度。        

2.1 算法效率

        算法效率分析分为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度,而空间效率被称作 空间复杂度。

        时间复杂度主要衡量的是一个算法的运行速度,而空间复杂度主要衡量一个算法所需要的额外空间。

2.1 大O的渐进表示法

        我们计算时间复杂度时,我们其实并不一定要计算精确的执行次数,而只需要大概执行次数,那么这里我们使用大O的渐进表示法。

        大O符号(Big O notation):是用于描述函数渐进行为的数学符号,以下内容为大o渐进表示法的操作。

        1、用常数1取代运行时间中的所有加法常数。

        2、在修改后的运行次数函数中,只保留最高阶项。

        3、如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。

即我们将算出的基本语句修改如下:

---------------->

        F(N)=N^2+2*N+10(最初)  --->F(N)=N^2+2*N+1(第一步) --->F(N)=N^2(第二步和第三部不用变,因为其系数为1) 

        同时有些算法的时间复杂度存在最好、平均和最坏情况:

        最坏情况:任意输入规模的最大运行次数(上界)

        平均情况:任意输入规模的期望运行次数

        最好情况:任意输入规模的最小运行次数(下界)

        eg:在一个长度为N数组中搜索一个数据x 最好情况:1次找到;最坏情况:N次找到;平均情况:N/2次找到

        在实际中一般情况关注的是算法的最坏运行情况,所以数组中搜索数据时间复杂度为O(N)

2.1 常见时间复杂度计算举例 

        【eg1】:

public static void main(String[] args) {int count = 0;for (int k = 0; k < 2 * N ; k++) {count++;}int M = 10;while ((M--) > 0) {count++;}System.out.println(count);}

         基本语句执行2N+10次,大o记为0(N);

        【eg2】: 

 public static void main(String[] args) {int count = 0;for (int k = 0; k < M; k++) {count++;}for (int k = 0; k < N ; k++) {count++;}System.out.println(count);}

        基本语句执行N+M次,大o记为0(N+M); 

【eg3】: 

public static void main(String[] args) {int count = 0;for (int k = 0; k < 100; k++) {count++;}System.out.println(count)}

        基本语句执行100次,大o记为0(1);  

【eg4】: 计算冒泡法的时间复杂度

for (int end = array.length; end > 0; end--) {boolean sorted = true;for (int i = 1; i < end; i++) {if (array[i - 1] > array[i]) {Swap(array, i - 1, i);sorted = false;}}if (sorted == true) {break;}}

        第一波进行依次比较,若该数组的长度为N,则第一波比较N-1次,第二波比较N-2次.....一直到比较一次结束,故基本代码执行次数为:

        N-1+N-2+N-3+.........+1-------------------->(等差数列)

        F(N)=1/2(N^2-N)------------------------->O(N^2)

【eg5】: / 计算binarySearch的时间复杂度

int binarySearch(int[] array, int value) {
int begin = 0;int end = array.length - 1;while (begin <= end) {int mid = begin + ((end-begin) / 2);if (array[mid] < value)begin = mid + 1;else if (array[mid] > value)end = mid - 1;elsereturn mid;}return -1;
}

        对于二分查找来说,当最后一个找到结果的时候,这是就是最坏的结果。 

        这道题原本的思想是,已知数组的长度,对数组不停地进行一半的去除,最坏的结果就是当你去除到剩最后一个的时候,发现这个数就是我们要找的数。所谓的基本语句执行次数就是你去除一半数组这个操作进行了多少次?

        我们可以反向进行思考,一直目前数组的长度为1,该数组的最终长度为N,我们通过每次对原来的数组进行*2的操作,问多少操作之后最初的数组的长度和目标数组长度一样?

        我们设操作次数为x,由此可知2^x = N,所以x=

        故此。综上所述为o(log 2 N)

【eg6】: 计算阶乘递归factorial的时间复杂度

// 计算阶乘递归factorial的时间复杂度?
long factorial(int N) {
return N < 2 ? N : factorial(N-1) * N;
}

        该代码时和递归函数有关,则关于递归函数的时间复杂度的公式如下:

         F(N)=递归的次数*每次递归代码的执行次数 

                

如上图所示,当N=3时,代码会一直递到N=1时开始往回归,同时每次回归之前会执行一次factorial(N-1) * N语句,将上层所缺的factorial(N-1)部分补充完整,故此我们需要递归2次,所以F(N) = N-1;------>O(N)

【eg7】:  计算斐波那契递归fibonacci的时间复杂度

int fibonacci(int N) {
return N < 2 ? N : fibonacci(N-1)+fibonacci(N-2);
}

         假设N=5,树状图如下分析:

                        

可以直观的感受出,树状图结束的点是走下交的叶子结点是F(1)和F(0);由此可分析为下图完整所示:

        由此可发现这是一个等比数列,F(1)= F(N-(N-1)),所以最后一行为2^(N-1);

        所以F(n)=2^0+2^1+2^2+......+2^(N-1);-------(等比数列求和)--------------------------->

                F(n)=2^n-1------------------------->o(2^n)

3.空间复杂度

        空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度 。空间复杂度不是程序占用了多少bytes的空 间,空间复杂度算的是变量的个数。空间复杂度计算规则基本跟时间复杂度类似,也 使用大O渐进表示法。

        eg1:

for (int end = array.length; end > 0; end--) {boolean sorted = true;for (int i = 1; i < end; i++) {if (array[i - 1] > array[i]) {Swap(array, i - 1, i);sorted = false;}}if (sorted == true) {break;}}

        分析:上述使用了常数个额外空间,所以空间复杂度为 O(1) 

          eg2:

// 计算fibonacci的空间复杂度?
int[] fibonacci(int n) {
long[] fibArray = new long[n + 1];
fibArray[0] = 0;
fibArray[1] = 1;
for (int i = 2; i <= n ; i++) {
fibArray[i] = fibArray[i - 1] + fibArray [i - 2];
}
return fibArray;
}

        分析:动态开辟了N个空间,空间复杂度为 O(N) 

         eg3:

// 计算阶乘递归factorial的时间复杂度?
long factorial(int N) {
return N < 2 ? N : factorial(N-1) * N;
}

       分析: 递归调用了N次,开辟了N个栈帧,每个栈帧使用了常数个空间。空间复杂度为O(N) 

ps:本次的内容就到这里了,喜欢的话还请大家一键三连哦!!!

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

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

相关文章

GAN:DCGAN-深度卷积生成对抗网络

论文&#xff1a;https://arxiv.org/pdf/1511.06434.pdf 发表&#xff1a;ICLR 2016 一、架构创新 1&#xff1a;全卷积网络&#xff1a;用逐步卷积代替确定性的空间池化函数&#xff08;如maxpooling&#xff09;&#xff0c;使网络学习自己的空间下采样。使用这种方法&#…

Android Studio 添加so无法打包进apk问题

1.开发环境&#xff1a; Android Studio 2022.3.1 Patch 2 jdk 17 gradle-7.4 2.build.grade配置检查 首先查看build.gradle中是否设置sourceSets &#xff0c;如果设置的话&#xff0c;打包的时候so是被指导libs目录下的&#xff0c;所有就不能把jnilibs下。 sourceSets {mai…

如何使用APP UI自动化测试提高测试效率与质量?

pythonappium自动化测试系列就要告一段落了&#xff0c;本篇博客咱们做个小结。 首先想要说明一下&#xff0c;APP自动化测试可能很多公司不用&#xff0c;但也是大部分自动化测试工程师、高级测试工程师岗位招聘信息上要求的&#xff0c;所以为了更好的待遇&#xff0c;我们还…

如何与LEONI建立EDI连接?

莱尼LEONI是一家为汽车及其他行业提供能源数据管理产品、解决方案及服务的全球供应商。供应链范围从研发生产标准化电缆、特种电缆和数据电缆到高度复杂的布线系统和相关组件。本文将介绍如何与莱尼LEONI建立EDI连接。 什么是EDI&#xff1f; EDI全称Electronic Data Interch…

P8A004-系统加固-磁盘访问权限

【预备知识】 访问权限&#xff0c;根据在各种预定义的组中用户的身份标识及其成员身份来限制访问某些信息项或某些控制的机制。访问控制通常由系统管理员用来控制用户访问网络资源&#xff08;如服务器、目录和文件&#xff09;的访问&#xff0c;并且通常通过向用户和组授予…

运算符重载

运算符重载 类对象不能直接参与运算&#xff0c;需要对运算符进行重载。 运算符预定义的操作只能针对基本数据类型&#xff0c;但是对于自定义类型&#xff0c;若需要类似的运算符操作&#xff0c;此时也可以重新定义这些运算符的功能&#xff0c;使其支持特定类型&#xff0c…

数学建模-基于LightGBM和BP神经网络的互联网招聘需求分析与预测

基于LightGBM和BP神经网络的互联网招聘需求分析与预测 整体求解过程概述(摘要) 就业是民生之本&#xff0c;是发展之基&#xff0c;也是安国之策。2020 年新冠肺炎疫情的爆发&#xff0c;稳就业成为应对疫情、稳定社会的重要保障之一。随着数据新动能的发展&#xff0c;互联网…

这个变量要不要用volatile修饰呢?

正文 大家好&#xff0c;又见面了&#xff0c;我是bug菌~ 在嵌入式软件开发过程中&#xff0c;如果对volatile不熟&#xff0c;那可以你应该是个"假嵌入式程序员"&#xff0c;因为一个变量需不需要使用volatile考虑的场景挺多的&#xff0c;如果在某些场景下乱用&…

(附源码)基于NET学生信息管理系统-计算机毕设 24077

基于NET学生信息管理系统 摘 要 随着互联网趋势的到来&#xff0c;各行各业都在考虑利用互联网将自己推广出去&#xff0c;最好方式就是建立自己的互联网系统&#xff0c;并对其进行维护和管理。在现实运用中&#xff0c;应用软件的工作规则和开发步骤&#xff0c;采用C#技术建…

【vue ui 一直卡在 Starting GUI..】

vue ui 解决问题 1.如果项目一直卡在 Starting GUI..2.解决方法 (切换数据源)3.成功解决 1.如果项目一直卡在 Starting GUI… 2.解决方法 (切换数据源) 直接在cmd中输入如下 npm config set registry http://registry.npm.taobao.org/3.成功解决

璞华大数据产品入选中国信通院“铸基计划”

武汉璞华大数据技术有限公司HawkEye设备数字化管理平台产品&#xff0c;凭借优秀的产品技术能力&#xff0c;通过评估后&#xff0c;入选中国信通院“铸基计划”《高质量数字化转型产品及服务全景图&#xff08;2023&#xff09;》的工业数字化领域。 “铸基计划”是中国信通院…

MS1242/MS1243:24bit 高精度、低功耗模数转换器

产品简述 MS1242/MS1243 是一款高精度、宽动态范围、 ∆-Σ 模数转 换芯片&#xff0c;其工作电压为 2.7V 至 5.25V &#xff0c;可以达到 24bit 无失码转 换&#xff0c;有效精度可达 21bit 。 MS1242/MS1243 可以广泛使用在工 业控制、称重、液体 / 气体化学分析、血液分…