【数据结构】复杂度包装泛型
目录
1.时间和空间复杂度
1.1时间复杂度
1.2空间复杂度
2.包装类
2.1基本数据类型和对应的包装类
2.2装箱和拆箱
//阿里巴巴面试题
3.泛型
3.1擦除机制
3.2泛型的上界
1.时间和空间复杂度
1.1时间复杂度
定义:一个算法所花费的时间与其语句的执行次数成正比,算法中的基本操作的执行次数,为算法的时间复杂度。
public class Main {public static void main(String[] args) {int n = 10;int count = 0;for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {count++; //F(n)=n^2}}for (int k = 0; k < 2*n; k++) {count++; //F(n)=2n}for (int m = 0; m < 10; m++) {count++; //F(n)=10}}
}
所以此时F(n)=n^2+2n+10, 但实际情况下只需要计算大概执行次数,即——大O渐进法:
大O渐进法:
1> 用常数1代替所有的加法常数;
2> 只保留最高阶项;
3> 如果最高阶项存在且不是1,则去除与这个项相乘的常数。
例:F(n) = 2n^2 + 5n + 100 = O(n^2)
注意:
二分查找 O(n) = log2N
递归 O(n) = 递归的次数*每次递归后执行的次数
public class Main {long factorial(int n) { //阶乘return n<2?n:factorial(n-1)*n; //O(n)=n}long fibonacci(int n) { //菲波那切数列return n<2?n:factorial(n-1)+factorial(n-2); //O(n)=2^n}
}
拓展:平均复杂度
定义:所有情况下代码执行的次数累加起来,再除以所有情况数量,即为平均复杂度。
例如下述代码,判断x在循环中出现的位置,有n+1种情况:1<=x<=n 和 n<x,
所以平均复杂度为=((1+2+3+……+n) + n)/ n+1
public int Function(int n, int x){int sum = 0;for (int i = 1; i <= n; ++i){if (i == x)break;sum += i;}return sum;
}
1.2空间复杂度
定义:空间复杂度是一个算法在运行时临时占用存储空间大小的量度,即计算的是变量的个数。
public class Test {//实例1:使用了常数个额外空间,空间复杂度为O(1)//冒泡排序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;}}}//实例2:动态开辟了N个空间,空间复杂度为O(N)//菲波那切数列long[] 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;}//实例3:递归调用了N次,开辟了N个栈帧,每个栈帧使用了常数个空间,空间复杂度为O(N)//阶乘递归long factorial(int N) {return N < 2 ? N : factorial(N-1)*N;}
}
2.包装类
2.1基本数据类型和对应的包装类
| 基本数据类型 | 包装类 |
|---|---|
| byte | Byte |
| short | Short |
| int | Integer |
| long | Long |
| float | Float |
| double | Double |
| char | Character |
| boolean | Boolean |
2.2装箱和拆箱
装箱:基本类型——>包装类型
拆箱:包装类型——>基本类型
public class Test {public static void main(String[] args) {int a = 10;Integer i = a;//自动装箱Integer ii = new Integer(a);//显示装箱Integer iii = new Integer(a);//显示装箱int m = i.intValue();//显示拆箱float ff = i.intValue();//拆成对应的类型int fff = a;//自动拆箱}
}
//阿里巴巴面试题
public class Test {public static void main(String[] args) {Integer a = 127;Integer b = 127;Integer c = 128;Integer d = 128;System.out.println(a==b);//trueSystem.out.println(c==d);//false}
}
原因:装箱时底层调用了valueOf方法,本质是一个范围在-128~127之间的数组。
3.泛型
先来看看一道编程题,编程要求:创建一个可以存放任何类型数据的数组。
解:所有类的父类默认为Object类,所以可以创建一个Object数组用来存放不同类型的元素:
class MyArray {public Object[] objects = new Object[10];//创建Object类数组public Object getPos(int pos) {//访问数组return objects[pos];}public void setVal(int pos,Object val) {//赋值数组objects[pos] = val;}
}
public class Test {public static void main(String[] args) {MyArray myArray = new MyArray();//此时可以将不同类型的元素放入数组中myArray.setVal(0,"123");myArray.setVal(1,10);//由于父类是Object类型,访问时必须强制类型转换int val = (int)myArray.getPos(1);System.out.println(val);//10}
}
我们发现上述代码有些繁琐,但用泛型来解这道题就会简单可读很多:
定义:通俗来讲,就是适用于许多许多类型,从代码上讲,就是对类型实现了参数化(传递类型)。
意义:在编译时帮我们进行类型的检查和转换,注意在运行时没有泛型这一概念,即JVM中没有泛型。
语法:class 泛型类名称 <类型形参列表> { 代码块 }
常见类型形参列表:E - Element、K - Key、V - Value、N - Number、T - Type、S/U/V等 - 第二、第三、第四个类型。
注意:不能new泛型类型的数组。
class MyArray <T> { //T是一个占位符,表示当前类是一个泛型类public T[] objects = (T[]) new Object[10];//这种写法不是很好,改良版见下public T getPos(int pos) {return objects[pos];}public void setVal(int pos,T val) {objects[pos] = val;}
}
public class Test1 {public static void main(String[] args) {MyArray<Integer> myArray1 = new MyArray<Integer>();//指定类型为Integer myArray1.setVal(0,1); //这里的Integer可不写myArray1.setVal(1,2);int val = myArray1.getPos(1);System.out.println(val);//2MyArray<String> myArray2 = new MyArray<String>();//指定类型为StringmyArray2.setVal(0,"hello"); //这里的String可不写myArray2.setVal(1,"world");String ret = myArray2.getPos(1);System.out.println(ret);//world}
}
3.1擦除机制
定义:在编译过程中,将所有的T替换为Object,这种机制称为擦除机制。
编译器生成的字节码在运行期间并不包含泛型的类型信息。
class MyArray <T> {public Object[] objects =new Object[10];public T getPos(int pos) {return (T)objects[pos];//强转}public void setVal(int pos,Object val) {objects[pos] = val;}
}
3.2泛型的上界
写一个泛型类,其中有个方法,用来求数组中的最大值:
class Alg<T extends Comparable<T>> { //擦除为一个实现了Comparable接口的类型public T findMax(T[] array) { //即限制了T的边界(上界),使其为Comparable的子类或Comparable本身T max = array[0];for (int i = 1; i < array.length; i++) {if(max.compareTo(array[i]) < 0) {max = array[i];}}return max;}
}
class Alg2 {public static<T extends Comparable<T>> T findMax(T[] array) { //静态泛型方法T max = array[0];for (int i = 1; i < array.length; i++) {if(max.compareTo(array[i]) < 0) {max = array[i];}}return max;}
}
public class Test {public static void main(String[] args) {Alg<Integer> alg = new Alg<>();Integer[] array = {1,9,3,7,5,4};Integer max = alg.<Integer>findMax(array);//此处Integer可不写System.out.println(max);}public static void main2(String[] args) {Integer[] array = {1,9,3,7,5,4};Integer max = Alg2.<Integer>findMax(array);//此处Integer可不写System.out.println(max); //静态方法通过类名调用}
}
这一点点只是开胃菜,后面还有更多有趣的知识等着我们去学习!
痛并快乐着捏 ~ ~
相关文章:
【数据结构】复杂度包装泛型
目录 1.时间和空间复杂度 1.1时间复杂度 1.2空间复杂度 2.包装类 2.1基本数据类型和对应的包装类 2.2装箱和拆箱 //阿里巴巴面试题 3.泛型 3.1擦除机制 3.2泛型的上界 1.时间和空间复杂度 1.1时间复杂度 定义:一个算法所花费的时间与其语句的执行次数成…...
Ae:绘画面板
Ae菜单:窗口/绘画 Paint 快捷键:Ctrl 8 绘画工具(画笔工具、仿制图章工具及橡皮擦工具)仅能工作在图层面板上。在使用绘画工具之前,建议先在绘画 Paint面板中查看或进行相关设置。 说明: 如果要在绘画描边…...
常见的锁和zookeeper
zookeeper 本文由 简悦 SimpRead 转码, 原文地址 zhuanlan.zhihu.com 前言 只有光头才能变强。 文本已收录至我的 GitHub 仓库,欢迎 Star:https://github.com/ZhongFuCheng3y/3y 上次写了一篇 什么是消息队列?以后,本来…...
经验总结:(Redis NoSQL数据库快速入门)
一、Nosql概述 为什么使用Nosql 1、单机Mysql时代 90年代,一个网站的访问量一般不会太大,单个数据库完全够用。随着用户增多,网站出现以下问题 数据量增加到一定程度,单机数据库就放不下了数据的索引(B Tree),一个机…...
form表单与模板引擎
文章目录 一、form表单的基本使用1、什么是表单2、表单的组成部分3、 <form>标签的属性4、表单的同步提交及缺点(1) 什么是表单的同步提交(2) 表单同步提交的缺点(3) 如何解决表单同步提交的缺点 二、…...
医院检验信息管理系统源码(云LIS系统源码)JQuery、EasyUI
云LIS系统是一种医疗实验室信息管理系统,提供全面的实验室信息管理解决方案。它的主要功能包括样本管理、检测流程管理、报告管理、质量控制、数据分析和仪器管理等。 云LIS源码技术说明: 技术架构:Asp.NET CORE 3.1 MVC SQLserver Redis等…...
React 组件
文章目录 React 组件复合组件 React 组件 本节将讨论如何使用组件使得我们的应用更容易来管理。 接下来我们封装一个输出 “Hello World!” 的组件,组件名为 HelloMessage: React 实例 <!DOCTYPE html> <html> <head> &…...
硕士学位论文的几种常见节奏
摘要: 本文描述硕士学位论文的几种目录结构, 特别针对机器学习方向. 1. 基础版 XX算法及其在YY中的应用 针对情况: 只有一篇小论文支撑. 第 1 章: 引言 ( > 5页) 1.1 背景及意义 (应用背景、研究意义, 2 页) 1.2 研究进展及趋势 (算法方面, 2 页) 1.3 论文结构 (1 页) 第 …...
找兄弟单词
描述 定义一个单词的“兄弟单词”为:交换该单词字母顺序(注:可以交换任意次),而不添加、删除、修改原有的字母就能生成的单词。 兄弟单词要求和原来的单词不同。例如: ab 和 ba 是兄弟单词。 ab 和 ab 则不…...
python字典翻转教学
目录 第1关 创建大学英语四级单词字典 第2关 合并大学英语四六级词汇字典 第3关 查单词输出中文释义 第4关 删除字典中特定字母开头的单词 第5关 单词英汉记忆训练 第1关 创建大学英语四级单词字典 本关任务:编写一个能创建大学英语四级单词字典的小程序。 测…...
sentinel 随笔 3-降级处理
0. 像喝点东西,但不知道喝什么 先来段源码,看一下 我们在dashboard 录入的降级规则,都映射到哪些字段上 package com.alibaba.csp.sentinel.slots.block.degrade;public class DegradeRule extends AbstractRule {public DegradeRule(String…...
如何解决IP能ping通但无法上网的问题?
当我们在网络环境中遇到无法上网的问题时,可能会尝试使用ping命令来测试网络连接是否正常。如果ping测试成功,说明我们的IP地址能够和网络中其他设备进行通信,但是无法上网。这种情况下,我们需要采取一些措施来解决这个问题。本文…...
Autosar实践-CANTp
文章目录 前言一、CanTp是什么?二、Autosar配置三、诊断数据传输流程1.接收单帧失败,上层没有适当的buffer2.成功接收单帧3.成功发送单帧4.成功接收多帧5.成功发送多帧前言 CANTp模块作为提供数据拆包、组包、流控制传输的服务,在Autosar基础软件通信中起着至关重要的作用。…...
Redis简介
Redis(Remote Dictionary Server)是一个开源的键值对(key-value)数据库,支持网络、可基于内存亦可持久化。 Redis的数据结构包括列表(List)、集合(Set)、有序集合&#…...
报错问题修改
Vue 项目报错:‘$‘ is not defined ( no-undef ) 错误原因是不认识 $ 符,他是 JQuery 中得符号,引入了 JQuery 文件里的函数报错onclick is not defined问题(作用域问题) window.onload function (){ onload function (){ 第二种方法…...
专访惠众科技|元宇宙应用如何借助3DCAT实时云渲染实现流畅大并发呈现?
当前互联网流量红利已经逐渐消失,营销同质化愈发严重。在这样的背景下,催生了以为元宇宙 焦点的虚拟产业经济。元宇宙在各行各业中以不同形式快速萌生、成长,呈现出多元化的应用场景。尤其是众多品牌,将元宇宙视为品牌建设与营销新…...
加速开放计算产业化,OCTC五大原则瞄准需求痛点
回顾计算产业过去十余载的历程,开放计算始终是一个绕不开的核心焦点。 始于2011年Facebook发起的数据中心硬件开源项目--开放计算项目(简称:OCP),开放计算犹如星星之火,不仅迅速形成燎原之势,更…...
【RabbitMQ】安装及六种模式
文章目录 安装rabbitmq镜像访问容器内部15672端口映射到外面的端口地址RabbitMQ六种模式Hello world模式Work queues模式Publish/Subscribe模式交换机fanout类型 Routing模式Topics模式RPC模式 rabbitmq:0->1的学习 学习文档:https://www.cnblogs.com…...
数据结构刷题(三十一):1049. 最后一块石头的重量 II、完全背包理论、518零钱兑换II
一、1049. 最后一块石头的重量 II 1.思路:01背包问题,其中dp[j]表示容量为j的背包,最多可以背最大重量为dp[j]。 2.注意:递推公式dp[j] max(dp[j], dp[j - stones[i]] stones[i]);本题中的重量就是价值,所以第二个…...
opencv_c++学习(四)
图像在opencv中的存储方式 在上图中可以看出,在opencv中采用的是像素值来代表每一个像素三通道颜色的深浅。 Mat对象 Mat对象是在OpenCV2.0之后引进的图像数据结构、自动分配内存、不存在内存泄漏的问题,是面向对象的数据结构。分了两个部分࿰…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
