【数据结构】_1.集合与复杂度

目录

1. 集合框架

2. 时间复杂度

2.1 时间复杂度和空间复杂度

2.2 时间复杂度的概念

2.3 大O的渐进表示法

2.3.1 精确的时间复杂度表达式

2.3.2 大O渐进表示法的三条规则

2.3.3 时间复杂度的最好、平均与最坏情况

2.4 时间复杂度计算示例

3.空间复杂度


1. 集合框架

Java集合矿机又被称为集合容器,是定义在java.util包下的一组接口和其实现类。

主要表现为将多个元素置于同一个单元中,用于对这些元素进行快速、便捷地存储、检索、管理;

2. 时间复杂度

2.1 时间复杂度和空间复杂度

算法效率分析为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度,空间效率被称为空间复杂度。时间复杂度主要衡量算法的运行速度,空间复杂度主要衡量算法的额外空间。

计算机的飞速发展使得计算机的存储容量已经达到了很高的程度,目前衡量一个算法优劣的重要标准是时间复杂度;

2.2 时间复杂度的概念

在计算机科学中,算法的时间复杂度是一个数学函数,它定量地描述了该算法的运行时间。

一个算法所花费的时间与其语句的执行次数成正比例,算法中的基本操作的执行次数就是算法的时间复杂度;

2.3 大O的渐进表示法

2.3.1 精确的时间复杂度表达式

试分析以下代码的时间复杂度:

    public static void fun1(int N){int count = 0;for(int i = 0; i < N; i++){for(int j = 0;j < N; j++){count++;}}for(int k=0;k<2*N;k++){count++;}int M = 10;while(M-->0){count++;}}

 分析如下:

精确的时间复杂度表达式为:F(N) = N^2 + 2*N + 10;

实际在我们计算时间复杂度时,并不需要精确的执行次数,而只需要大概执行次数,故而引入大O渐进表示法;

2.3.2 大O渐进表示法的三条规则

(括号中的表达式与上表达式简化过程对应)

(1)用常数1取代运行时间中所有的加法常数;(F(N) = N^2 + 2*N + 1)

(2)在修改后的运行次数函数中,只保留最高阶项;(F(N) = N^2 )

(3)如果最高阶项存在且不是1,则去除与这个项目相乘的常数;

(假如表达式为F(N) = 3*N^2  则去掉3,改为F(N) = N^2 )

即大O渐进表示法是将精确的时间复杂度表达式去掉了对结果影响不大的项,更为简洁地表示出了执行次数;

2.3.3 时间复杂度的最好、平均与最坏情况

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

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

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

一般的时间复杂度指的就是最坏情况下的时间复杂度:

如在一个长度为N的数组中查找某个元素,最好情况是1次找到,最坏情况是N次找到,平均情况是N/2次找到,但数组中搜索数据的时间复杂度是O(N)

2.4 时间复杂度计算示例

例1:

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

时间复杂度为O(N);

例2:

    public static void fun3(int N,int M){int count=0;for(int k=0;k<M;k++){count++;}for(int k=0;k<N;k++){count++;}System.out.println(count);}

时间复杂度是O(M+N);

例3:

    public static void fun4(int N){int count=0;for(int k=0;k<100;k++){count++;}System.out.println(count);}

 时间复杂度是O(1);

例4:(冒泡排序)

    public void bubbleSort(int[] array){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(N^2);

注:① N代表的是当前问题规模而非程序中的变量;

② 最好情况是数组本身就有序,只需遍历一次,时间复杂度是O(N);

③ 还有稍有区别的冒泡排序写法:

public static void bubble_sort(int[] array){for(int i=0;i<array.length-1;i++){boolean flag = false;for(int j=0;j<array.length-1-i;j++){if(array[j]>array[j+1]){int tmp=array[j];array[j]=array[j+1];array[j+1]=tmp;flag=true;}}if(flag==false){return;}}}

其计算复杂度过程为:

故其时间复杂度也为O(N^2); 

例5:(二分查找)

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;}

计算过程如下:

也可用列举法:当数据个数分别为2,4,8时,需要执行的次数依次为2,3,4,故而有:2^(x-1)=N,即x=logN+1;

有:时间复杂度是O(logN); 

例6:计算阶乘递归factorial的时间复杂度:

public static long factorial(int N) {return N < 2 ? N : factorial(N-1) * N;}

三目运算符的时间复杂度为1,执行了N次,即:时间复杂度为O(N);

例7:计算斐波那契递归fibonacci的时间复杂度:

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

求时间复杂度过程如下:

根据以上二叉树可知:时间复杂度为 O(2^N);

注:递归的时间复杂度是递归的次数*每次递归后代码的执行次数

3.空间复杂度

空间复杂度是对一个算法在运行过程中临时占用储存空间大小的量度。

空间复杂度不是程序占用了多少bytes的空间,而计算的是临时变量的个数,该空间不会随着问题规模的增大而增大;

空间复杂度与时间复杂度计算方法类似,也使用大O渐进表示法;

例1:冒泡排序

    public void bubbleSort(int[] array){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);

例2:斐波那契数列

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;}

该程序将计算的斐波那契数列计算的每一个数字都放在fibArray数组中,故而空间复杂度为O(N);

例3:

long factorial(int N) {
return N < 2 ? N : factorial(N-1)*N;
}

调用N次则开辟N个栈帧,每个栈帧使用了常数个空间,故空间复杂度为O(N);

例4:

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

空间复杂度为O(N);

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

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

相关文章

字节跳动后端面试,笔试部分

var code "7022f444-ded0-477c-9afe-26812ca8e7cb" 背景 笔者在刷B站的时候&#xff0c;看到了一个关于面试的实录&#xff0c;前半段是八股文&#xff0c;后半段是笔试部分&#xff0c;感觉笔试部分的题目还是挺有意思的&#xff0c;特此记录一下。 笔试部分 问…

【多线程例题】顺序打印abc线程

顺序打印-进阶版 方法一&#xff1a;三个线程竞争同一个锁&#xff0c;通过count判断是否打印 方法二&#xff1a;三个线程同时start&#xff0c;分别上锁&#xff0c;从a开始&#xff0c;打印后唤醒b 三个线程分别打印A&#xff0c;B&#xff0c;C 方法一&#xff1a;通过co…

JavaFX中MVC例子理解

JavaFX可以让你使用GUI组件创建桌面应用程序。一个GUI应用程序执行三个任务&#xff1a;接受用户的输入&#xff0c;处理输入&#xff0c;并显示输出。而一个GUI应用程序包含两个 类型的代码&#xff1a; 领域代码。处理特定领域的数据和遵循业务规范。交互代码。处理用户输入…

【Linux】多线程(上)

本文详细介绍了多线程的常见概念 生产者消费者模型将在多线程&#xff08;下&#xff09;继续讲解 欢迎大家指正 提起讨论进步啊 目录 多线程的理解 线程的优点 线程的缺点&#xff1a; 线程的用途 线程VS进程 用户级线程库 POSIX线程库 线程创建&#xff1a; 线程…

springboot整合jwt

JWT介绍 JWT是JSON Web Token的缩写&#xff0c;即JSON Web令牌&#xff0c;是一种自包含令牌。 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。 JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息&#xff0c;以便于从资源服务器获…

DICOM开源库兼容性问题

常见的DICOM开源库有dcmtk、fo-dicom、dcm4che3等&#xff0c;DICOM开源库遇到的兼容性问题类似&#xff0c;——dcmtk兼容性最强&#xff0c;fo-dicom次之&#xff0c;dcm4che3最差。 本人在dicom医学影像方面从事软件开发已有10几年&#xff0c;用过dcmtk&#xff0c;fo-dico…

Android国际化各国语言简写

<?xml version"1.0" encoding"utf-8"?> <locale-config xmlns:android"http://schemas.android.com/apk/res/android"><locale android:name"af"/> <!-- 南非荷兰语 --><locale android:name"am&qu…

Spark(32):Spark性能调优之Shuffle调优

目录 0. 相关文章链接 1. 调节 map 端缓冲区大小 2. 调节 reduce 端拉取数据缓冲区大小 3. 调节 reduce 端拉取数据重试次数 4. 调节 reduce 端拉取数据等待间隔 5. 调节 SortShuffle 排序操作阈值 0. 相关文章链接 Spark文章汇总 1. 调节 map 端缓冲区大小 在 Spark 任…

基于.net6的WPF程序使用SignalR进行通信

之前写的SignalR通信&#xff0c;是基于.net6api&#xff0c;BS和CS进行通信的。 .net6API使用SignalRvue3聊天WPF聊天_signalr wpf_故里2130的博客-CSDN博客 今天写一篇关于CS客户端的SignalR通信&#xff0c;后台服务使用.net6api 。其实和之前写的差不多&#xff0c;主要在…

Ubuntu22.04密码忘记怎么办 Ubuntu重置root密码方法

在Ubuntu 22.04 或其他更高版本上不小心忘记root或其他账户的密码怎么办&#xff1f; 首先uname -r查看当前系统正在使用的内核版本&#xff0c;记下来 前提&#xff1a;是你的本地电脑&#xff0c;有物理访问权限。其他如远程登录的不适用这套改密方法。 通过以下步骤&#…

写字楼/办公楼能源管理系统的具体应用 安科瑞 许敏

0 引言 随着社会的进步&#xff0c;我国经济的快速发展&#xff0c;企业的办公环境和方式发生了巨大的变化&#xff0c;专业的写字楼在各大城市遍布林立。写字楼的出现使得各地企业办公集中化、高效化&#xff0c;然而写字楼物业管理的同步发展对于企业服务来说更是一个很大的…

SciencePub学术 | 区块链类重点SCIEEI征稿中

SciencePub学术 刊源推荐: 区块链类重点SCIE&EI征稿中&#xff01;信息如下&#xff0c;录满为止&#xff1a; 一、期刊概况&#xff1a; SCI-01 【期刊简介】IF&#xff1a;4.0-4.5&#xff0c;JCR2区&#xff0c;中科院3区&#xff1b; 【检索情况】SCIE&EI双检&…

Mysql+ETLCloud CDC+StarRocks实时数仓同步实战

一、业务需求及其痛点 大型企业需要对各种业务系统中的销售及营销数据进行实时同步分析&#xff0c;例如库存信息、对帐信号、会员信息、广告投放信息&#xff0c;生产进度信息等等&#xff0c;这些统计分析信息可以实时同步到StarRocks中进行分析和统计&#xff0c;StarRocks…

vue注意点:$attrs、$slots!插槽

$attrs 当父组件给子组件传值&#xff0c;子组件并没有接收数据时&#xff0c;此时数据在$attrs中可以拿到&#xff0c;并且如果子组件不需要使用数据&#xff0c;而孙组件需要&#xff0c;则可以直接v-bind"$attrs"传给孙。 <-- 父组件 --> <div><…

[java安全]URLDNS

文章目录 [java安全]URLDNS前言HashMapURLURLStreamHandler调用过程调用链流程图POC [java安全]URLDNS 前言 URLDNS利用链是一条很简单的链子&#xff0c;可以用来查看java反序列化是否存在反序列化漏洞&#xff0c;如果存在&#xff0c;就会触发dns查询请求 它有如下优点&a…

Centos 8 / TencentOS Server 3.1 安装 docker-ce

目录 前言安装 docker-ce设置Docker Hub 镜像缓存参考 前言 TencentOS Server 3.1(与 CentOS 8用户态完全兼容&#xff0c;配套基于社区5.4 LTS 内核深度优化的 tkernel4版本) 安装 docker-ce 先卸载老版本&#xff0c;没有老版本的跳过 yum remove docker \docker-client \d…

vue3学习

响应式数据 const searchFormState reactive({})const searchFormRef ref()两者差不多&#xff0c;reactive(&#xff09;多用于复杂数据结构 ref()多用与简单数据结构 组件传值父传子 属性传值 父组件给子组件传值属性aa值为data :aa"data" 子组件接收数据方法 引…

常见面试题之HashMap

1. 二叉树 1.1 二叉树概述 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只有左子节点&#xff0c;有的节…

前端基本功 用 React Hooks + Antd 实现一个 Todo-List

背景 使用 React Hooks 以及组件库 Antd 来实现一个可以 增删 标记是否完成 的 todo-list 思路 要实现一个 todo-list 首先想到用 useState 维护一个状态数组来保存当前 list &#xff0c;还要用一个状态维护添加框中的内容 const [todos, setTodos] useState(initialValu…

Excel之VLOOKUP()函数介绍

Excel之VLOOKUP()函数介绍 Excel的VLOOKUP函数语法&#xff1a; VLOOKUP(lookup_value, table_array, col_index_num, [range_lookup]) 参数说明&#xff1a; lookup_value&#xff1a;要查找的值或要比较的值。 table_array&#xff1a;包含要在其中进行查找的数据表的区…