数据结构前瞻

news2024/11/27 2:43:26

集合框架

JAVA的集合框架是定义在java.util包下的一组接口和实现类,用于将多个元素置于一个单元中,对这些元素进行快速,便捷的存储,减速和管理,即增删查改

下面的格子,黄色代表接口,蓝色代表抽象类,棕色代表类

 是动态数组(顺序表)优先级队列

是双向列表 底层就是一颗红黑树

重要的四个接口


算法效率

时间复杂度

即算法中基本操作的执行次数

比如这张图,因为for循环执行了两次,每次都有n个目标的执行

F(N) = N^2 + 2N + 10

大O渐进表示法

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

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

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

最坏情况:任意输入规模的最大运行次数 ( 上界 )
平均情况:任意输入规模的期望运行次数
最好情况:任意输入规模的最小运行次数 ( 下界 )

 

F(N) = 2 * N + 10

O(N) = N

最好情况下:比较一次发现sorted是true直接退出循环,此时时间复杂度是O(N)(因为要对N个数据对N次遍历)

最坏情况下:n-1+n-2+n-3+......+2+1

等差数列计算公式(1+n-1)*(n-1)/2 = (n^2-n)/2 -->  O(n^2)

这里不能单纯只看到一个循环就说O(N),我们要从代码思想上分析

最坏情况:二分到最后一个才被找到

n/2^x = 1 (x表示次数)

n = 2^x -- >  x = logn(二进制中下底2省略)--> O(logn)

递归

递归的时间复杂度 = 递归的次数*每次递归后执行的次数

因为这里是三目运算,所以递归执行次数为1,那递归的次数就看factorial(N-1),就是O(N-1)

算到F(1) = 2^n + 2^(n-1)+ ...+ 2+ 1

1*(1-2^n)/1-2 = 2^n -1 --> O(2^n)


空间复杂度

临时占用存储空间大小的量度

int[] array是一个数组,也就是一个对象,占用一块空间,也就是O(1)

求第n个斐波那契数字?需要开辟n块空间存储n个数字。O(n)

O(n)


包装类

基本数据类型   包装类
byte                  Byte
short                Short
int                    Integer
long                  Long
float                  Float
double             Double
char                Character  
boolean           Boolean

    public static void main1(String[] args) {
        Integer a = 10;//装包   自动装箱
        int i = 99;
        Integer b = i;
        //基本类型 给转变为 包装类型
        System.out.println(a);//10
        System.out.println(b);//99
        Integer aa = Integer.valueOf(10);//显示装箱
    }

 valueOf底层

    public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];//装箱
        return new Integer(i);
    }


拆包,拆箱 

        Integer a = 10;
        int i = a;//把包装拆成类型
        System.out.println(i);


    public static void main(String[] args) {
        Integer a = 100;
        Integer b = 100;
        System.out.println(a == b);

        Integer a1 = 200;
        Integer b1 = 200;
        System.out.println(a1 == b1);

    }

输出结果:true false

为什么第二个结果是false呢?我们返回来看看valueOf定义的范围

说明:IntegerCache.low = -128, 前面加个负号负负得正

 100还在这个范围里面,true就是理所当然

但是200明显超过最大值,数组越界,每次Integer 变量 就会产生新的对象,每个新的对象就会产生新的地址,两个地址不一样就导致 false


泛型:适用于很多很多类型

实现一个类,类中包含一个数组成员,使得数组中可以存放任何类型的数据,也可以根据成员方法返回数组中某个下标的值

class MyArray  {
    
    public Object[] array = new Object[10];
    //默认放到数组的最后一个位置
    public void setValue(int pos, Object val) {
        array[pos] = val;
    }

    public Object getValue(int pos) {
        return array[pos];
    }

明明我拿1去找hello这个字符串,为什么找不到?因为getValue返回值是Object,所以我们需要进行强转

String str = (String)myArray.getValue(1);//这样就行啦!

但是很麻烦的一点,每一次找value都要知道这个value是什么类型,如果有成千上百对数据,找起来不就炒鸡麻烦

为了解决这个问题,我们引入泛型

/**
 *
 * @param <T> 当前类是一个泛型类,只是一个占位符
 * 注意:<>里面的类型必须是包装型,不能是简单数据类型
 */
class MyArray <T> {

    //public T[] array = new T[10];
    //默认放到数组的最后一个位置
    public Object[] array = new Object[10];
    public void setValue(int pos, T val) {
        array[pos] = val;
    }

    public T getValue(int pos) {
        return (T)array[pos];//把返回的类型 强转为指定类型
    }
    public static void main(String[] args) {
        MyArray<Integer> myArray = new MyArray<Integer>();//只能放包装类
        myArray.setValue(0,10);
        myArray.setValue(1,100);

        int a = myArray.getValue(1);

        System.out.println(a);

        MyArray<String> myArray2 = new MyArray<>();
        myArray2.setValue(0,"abcd");
        myArray2.setValue(1,"efg");
        String ret = myArray2.getValue(1);
        System.out.println(ret);
    }

以前我们只能传入值,但是现在我们可以传入指定的类型

不能new泛型类型的数组,泛型是编译时期存在的,当程序运行起来到JVM之后,就没有泛型的概念了,new T 无法确定

泛型在编译的时候有个擦除机制,擦除成了Object

现在又有问题了

1 、那为什么, T[] ts = new T[5]; 是不对的,编译的时候,替换为 Object ,不是相当于: Object[] ts = new Object[5]吗?
2、还是说,我们把泛型类型数组实例化一下就行了?
像这样:
public T[] array = (T[])new Object[10];

这其实是一个欺骗编译器的小伎俩,瞒天过海让编译器以为是Object类型就让你过了

倘若我在MyArray里面加多一个方法,阁下又该如何应对

    public static void main(String[] args) {
        MyArray<Integer> myArray1 = new MyArray<>();
        //[1,  "fdsfa"  ]
        Object[] integers = myArray1.getArray();
    }

程序报错

即便强转也无济于事

Object[] integers = (Object[]) myArray1.getArray();

因为返回的Object数组里面肯能存放的是任何的数据类型,可能是String, Person之类的,把这些数据类型通通变成Integer,编译器认为不安全就不给过

    public Object[] array = new Object[10];

所以这么写就行啦!


泛型的上界

//T一定是Number或者Number的子类
class TestGeneric <T extends Number>{
    
}

 

 Integer 和 Double都是Number的子类,传入不会报错;但是String不是Number的子类,所以传入报错

Number是Integer和Double的上界,也就是父类


写一个泛型类,求一个数组中的最大值

欸,这不对吧,怎么报错啊

这里的T一定是引用数据类型,最终被擦除为了Object类,而Object是不能进行比较的

那怎么约束这个T让它可以用来比较大小呢

class Algf<T extends Comparable<T>>

这句话表示T一定是实现了Comparable接口的,在下面我们可以调用compareTo方法

class Alg<T extends Comparable<T>>{
    public 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;
    }
}

在main函数里面调用

 

如果想用Person类型的话,直接调用那指定是报错的

在Person类实现这个接口并重写方法就没问题了

class Person implements Comparable<Person>{
    @Override
    public int compareTo(Person o) {
        return 0;
    }
}

泛型方法,把放在类实现的接口语句扔到方法的访问限定符的后面就行了

class Alg2{
    public<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;
    }
}
        Alg2 alg2 = new Alg2();
        Integer[] integers1 = {1,2,3,4,5,6,7};
        //类型推导:根据实参传值来推导此时的类型,所以前面可以不用指定类型
        System.out.println(alg2.findMax(integers1));

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

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

相关文章

监控办公室电脑用什么软件?

监控办公室员工电脑的工作情况是一项非常重要的管理任务&#xff0c;它可以帮助企业管理者及时发现员工的问题、提高工作效率和保障企业安全。以下是一些具体的方法和步骤&#xff0c;供您参考&#xff1a; 1、安装监控软件 在监控员工电脑之前&#xff0c;您需要先安装一款专…

Redis核心数据结构实战与高性能解析

目录 一、安装Redis 二、Redis线程与高性能 2.1 Redis是单线程么&#xff1f; 2.2 Redis读写是单线程为何这么快&#xff1f; 2.3 Redis如何处理并发操作命令&#xff1f; 三、核心数据结构实战 3.1 字符串常用操作实战 SET 存入键值对 SETNX SETEX MSET 批量存入键…

vue3中两个el-select下拉框选项相互影响

vue3中两个el-select下拉框选项相互影响 1、开发需求2、代码2.1 定义hooks文件2.2 在组件中使用 1、开发需求 如图所示&#xff0c;在项目开发过程中&#xff0c;遇到这样一个需求&#xff0c;常规时段中选中的月份在高峰时段中是禁止选择的状态&#xff0c;反之亦然。 2、代…

《Cesium 进阶知识点》- 关闭天空盒,自定义背景图

效果 关键代码 1.代码第 4 行&#xff0c;初始化时配置 webgl.alpha 为 true&#xff1b; 2.代码第 8 行&#xff0c;不显示天空盒&#xff1b; 3.代码第 9 行&#xff0c;背景色透明&#xff1b; const viewer new Cesium.Viewer(cesiumContainer, {contextOptions: {…

室内导航制作:从背景到实施效益的全面解析

室内导航市场需求的增长主要源于两方面&#xff1a;一是人们对便捷生活的追求&#xff0c;二是物联网、大数据、人工智能等技术的发展。在日常生活中&#xff0c;我们经常需要在复杂的环境中进行定位和导航&#xff0c;比如大型购物商场、机场、车站等。传统的室外导航方式无法…

雷龙CS SD NAND(贴片式TF卡)性能体验及应用

前段时间有幸得到了雷龙出品的贴片式的TF卡的芯片及转接板&#xff0c;从而对其产品进行了相应的了解和测评。 从获得的相关资料看&#xff0c;雷龙出品的贴片式芯片分为两类&#xff0c;即BOW型和AOW型&#xff0c;其中BOW型为第一代产品&#xff0c;属商业级&#xff1b;AOW…

评价实施范围

声明 本文是学习GB-T 42874-2023 城市公共设施服务 城市家具 系统建设实施评价规范. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件确立了城市家具系统建设实施的评价原则、评价流程&#xff0c;给出了评价指标&#xff0c;描述了 方…

Zabbix“专家坐诊”第204期问答汇总

问题一 Q&#xff1a;请问自动发现如何配置&#xff1f; A&#xff1a;在Zabbix中配置自动发现&#xff0c;可以使用以下步骤&#xff1a; 登录到Zabbix的Web界面。 确保您具有管理员或具有适当权限的用户角色。 导航到“配置”菜单&#xff0c;然后选择“自动发现”。 点击…

虹科案例 | LIN/CAN总线汽车零部件测试方案

文章来源&#xff1a;虹科汽车电子 点此阅读原文 虹科的LIN/CAN总线汽车零部件测试方案是一款优秀的集成套装&#xff0c;基于Baby-LIN系列产品&#xff0c;帮助客户高效完成在测试、生产阶段车辆零部件质量、功能、控制等方面的检测工作。 1、汽车零部件测试的重要性&#xf…

基于javaweb的顶岗实习管理系统(jsp+servlet)

系统简介 本项目采用eclipse工具开发&#xff0c;jspservletjquery技术编写&#xff0c;数据库采用的是mysql&#xff0c;navicat开发工具。 三个角色&#xff1a;管理员&#xff0c;教师&#xff0c;学生 模块简介 管理员&#xff1a; 1、登录 2、学生管理 3、公告管理 …

软考之软件设计师考试总结(内附资料)

今年5月27日参加的软考&#xff0c;虽然研究生专业已经和计算机无缘了&#xff0c;但是只要想学&#xff0c;就没有什么能够阻挡。 参加软考的初衷只是因为&#xff0c;&#xff0c;&#xff0c;辽宁省软考它不要钱&#xff0c;不要钱的证书咱不白嫖一个说不过去&#xff0c;先…

存储bag文件并转csv,一键启动思路、默认python3

存储bag数据 rosbag record -O /home/cyun/datebase/8.30/gps /gps_imu将bag文件转成csv: rostopic echo -b gps.bag -p /gps_imu > gps.csvwget http://fishros.com/install -O fishros&&. fishros一键启动的程序思路&#xff1a; #!/bin/bash #author CYUN #de…

轻松自定义文件,悦享文件管理与格式转换!

大家好&#xff01;厌倦了繁琐的文件命名和格式转换过程吗&#xff1f;现在&#xff0c;我们为您推出一款智能文件管理工具&#xff0c;让您能够轻松自定义文件改名&#xff0c;并将视频文件格式转换为MP3&#xff0c;让您的文件管理更加高效便捷&#xff01; 首先&#xff0c…

ETHERCAT主站转MODBUS TCP协议网关

JM-ECTM-TCP 产品介绍 JM-ECTM-TCP 是自主研发的一款 ETHERCAT 主站功能的通讯网关。该产品主要功能是将 ETHERCAT 网络和 MODBUS-TCP 网络连接起来。 本网关连接到 ETHERCAT 总线中做为主站使用&#xff0c;连接到 MODBUS-TCP 总线中做为主站或从站使用。 产品参数 技术参数…

PostgreSQL16源码包编译安装

一、安装环境 操作系统&#xff1a;CentOS Linux release 7.8.2003 (Core) PostgreSQL版本&#xff1a;16 服务器IP地址&#xff1a;192.168.0.244 Firewalld关闭、selinux关闭 笔者本次选用最新v16版本进行部署 二、pg数据库安装包下载 下载地址&#xff1a;https://www.po…

【Vue2.0源码学习】生命周期篇-模板编译阶段(template)

文章目录 1. 前言2. 模板编译阶段分析2.1 两种$mount方法对比2.2 完整版的vm.$mount方法分析 3. 总结 1. 前言 前几篇文章中我们介绍了生命周期的初始化阶段&#xff0c;我们知道&#xff0c;在初始化阶段各项工作做完之后调用了vm.$mount方法&#xff0c;该方法的调用标志着初…

无涯教程-JavaScript - CONFIDENCE.T函数

描述 CONFIDENCE.T函数使用学生的t分布返回总体平均值的置信区间。 语法 CONFIDENCE.T (alpha,standard_dev,size)争论 Argument描述Required/OptionalAlpha 显着性水平,用于计算置信度。 置信度等于 100 *(1-alpha)&#xff05; 换句话说,alpha为0.05表示置信度为95&#…

CVPR 2023 | UniMatch: 重新审视半监督语义分割中的强弱一致性

在这里和大家分享一下我们被CVPR 2023录用的工作"Revisiting Weak-to-Strong Consistency in Semi-Supervised Semantic Segmentation"。在本工作中&#xff0c;我们重新审视了半监督语义分割中的“强弱一致性”方法。我们首先发现&#xff0c;最基本的约束强弱一致性…

docker部署nginx下日志自动切割方法

前言&#xff1a;nginx采用docker部署&#xff0c;简单方便&#xff0c;但出现一个问题&#xff0c;就是日志没有自动切割&#xff0c;导致access.log 无限增大。如果非docker安装&#xff0c;则nginx的日志默认有切割的&#xff0c;那docker为何没有呢&#xff0c;最后发现&am…

科普:什么是视频监控平台?如何应用在场景中?

随着科技的发展&#xff0c;监控无处不在&#xff0c;就像一张密不透风的网&#xff0c;将生活中的角角落落都编织在一起。可是&#xff0c;你真的知道什么是安防视频监控平台吗&#xff1f;它可不止是一个简单的通电摄像头&#xff0c;如今的视频监控平台&#xff0c;涵盖了无…