【数据结构】初识集合框架

🎇🎉🎉🎉点进来你就是我的人了
博主主页:🙈🙈🙈戳一戳,欢迎大佬指点!
人生格言: 当你的才华撑不起你的野心的时候,你就应该静下心来学习!
欢迎志同道合的朋友一起加油喔 💪💪💪
目标梦想:进大厂,立志成为一个牛掰的Java程序猿,虽然现在还是一个🐒嘿嘿
谢谢你这么帅气美丽还给我点赞!比个心

目录

  • 1. 前提(了解)
  • 2. 什么集合框架
    • 2.1 类和接口总览
  • 3.集合框架的重要性
    • 3.1 开发中的使用
    • 3.2 笔试及面试题
  • 4. 背后所涉及的数据结构以及算法
    • 4.1 什么是数据结构
    • 4.2 容器背后对应的数据结构
    • 4.3 Java相关知识
      • 4.3.1 泛型 Generic
      • 4.3.2 自动装箱autobox 和自动拆箱autounbox
      • 4.3.3 Object 的 equals 方法
      • 4.3.4 Comparable 和 Comparator 接口
    • 4.4 什么是算法
    • 4.5 如何学好数据结构以及算法
  • 5. 时间和空间复杂度
    • 5.1 如何衡量一个算法的好坏
    • 5.2 算法效率
    • 5.3 时间复杂度
      • 5.3.1 时间复杂度的概念
      • 5.3.2 大O的渐进表示法
      • 5.3.2 推导大O阶方法
      • 5.3.4 常见时间复杂度计算举例
      • 5.3.5空间复杂度

1. 前提(了解)

集合框架数据结构 有关系,需要去学习 数据结构,学完 数据结构 就会知道 集合框架 是什么了

  • 通俗的说:

集合框架 是很多 组成的, 每个类的背后就是一种 数据结构
比如说学习了一个链表 哪一个Java已经实现好的类是链表呢?
优先级对列 哪一个Java已经实现好的类是优先级对列呢?

  • 倒退回来

要认识集合框架,就必须懂数据结构,要懂数据结构,就需要知道数据结构是如何实现的

  • 什么是数据结构呢?

数据 + 结构
用 某些结构来组织或者描述 数据…
树形结构,链式结构,图形结构…

  • 数据结构为什么有很多种?

就是在某些时刻下描述和组织数据的方式是不一样的
数组就是一种数据结构…

如何组织好14亿人呢?
数据库的底层就用到了数据结构 通过SQL语言来操作
java的数据结构和C语言的数据结构有区别吗?
没有区别~
数据结构是单独的学科
所以集合框架的背后是数据结构

2. 什么集合框架

官方教程
Java集合框架 Java Collection Framework,又被成为容器 container ,是定义在 java.util 包下的一组接口 interfaces 和其实现类 classes
其主要表现为将多个元素 element 置于一个单元中,用于对这些元素进行快速、便捷的存储 store、检索 retrieve 管理 manipulate ,即平时我们俗称的增删查改 CRUD

2.1 类和接口总览

在这里插入图片描述

简单认识
Map:接口 和 Iterable 接口是独立的
Iterable: 迭代器
Stack: 栈
Arraylist: 顺序表
Linkedlist: 链表 双向非循环不带头 链表
PriorityQueue: 优先级队列:底层实际是一个二叉树
Treeset、TreeMap: 他俩底层是 一颗特殊的搜索树 ---- 》》》红黑树
HashSet、HashMap: 是哈希表: 数组 + 链表 + 红黑树组成

每一个集合类背后都是一个数据结构
每个数据结构怎么设计 ,怎么实现-----》》》对应的集合类怎么用???
部分集合类Java源代码的实现
数据结构是每个程序员的内功

3.集合框架的重要性

3.1 开发中的使用

  • 使用成熟的集合框架,有助于我们便捷、快速的写出高效、稳定的代码
  • 学习背后的数据结构知识,有助于我们理解各个集合的优缺点及使用场景

3.2 笔试及面试题

  • 腾讯-Java后台开发面经
  1. Hash Map 了解不 ,介绍一下 ,如果一个对象为 key 时 ,hashCode 和 equals 方法的用法要注意什么?
  2. HashSet 和 Hash Map 的区别是什么?
  3. Hash Map 是线程安全的么?那需要线程安全需要用到什么?
  • 阿里巴巴-Java后台开发面经
  1. ArrayList 和 LinkedList 的区别是什么?
  2. 有了解过 Hash Map 的具体实现么?
  3. Hash Map 和 ConcurrentHash Map 哪个效率更高?
  • 今日头条-Java后台开发面经
  1. 编程题 :判断一个链表是否是一个回文链表。
  2. Redis 的 zset 类型对应到 java 语言中大致是什么类型?
  3. hashCode 主要是用来做什么用的?

4. 背后所涉及的数据结构以及算法

4.1 什么是数据结构

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

数据结构 + 算法
数据结构与算法是相辅相成的
数据结构是为算法提供支持的
而好的算法是一定依赖于好的数据结构

4.2 容器背后对应的数据结构

  • 每个容器其实都是对某种特定数据结构的封装,大概了解一下,后序会给大家详细讲解并模拟实现:
  1. Collection :是一个接口,包含了大部分容器常用的一些方法

  2. List:是一个接口,规范了ArrayList 和 LinkedList中要实现的方法

    ArrayList:实现了List接口,底层为动态类型顺序表
    LinkedList:实现了List接口,底层为双向链表

  3. Stack:底层是栈,栈是一种特殊的顺序表

  4. Queue:底层是队列,队列是一种特殊的顺序表

  5. Deque:是一个接口

  6. Set:集合,是一个接口,里面放置的是K模型

    HashSet:底层为哈希桶,查询的时间复杂度为O(1)
    TreeSet:底层为红黑树,查询的时间复杂度为O(log2N),关于key有序的

  7. Map:映射,里面存储的是K-V模型的键值对
    HashMap:底层为哈希桶,查询时间复杂度为O(1)
    TreeMap:底层为红黑树,查询的时间复杂度为O(log2N),关于key有序

4.3 Java相关知识

4.3.1 泛型 Generic

4.3.2 自动装箱autobox 和自动拆箱autounbox

4.3.3 Object 的 equals 方法

4.3.4 Comparable 和 Comparator 接口

4.4 什么是算法

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

4.5 如何学好数据结构以及算法

注意画图和思考
在这里插入图片描述
多写博客总结
多刷题
牛客网 和 LeetCode都可以
在这里插入图片描述

5. 时间和空间复杂度

5.1 如何衡量一个算法的好坏

下面求斐波那契数列的算法好还是不好,为什么?该如何衡量一个算法的好坏呢?

public static long Fib(int N) {if (N < 3) {return 1;}return Fib(N - 1) + Fib(N - 2);
}

5.2 算法效率

  • 算法效率分析分为两种:

第一种是时间效率: 时间效率被称为时间复杂度,时间复杂度主要衡量的是一个算法的运行速度.

第二种是空间效率: 空间效率被称作 空间复杂度。 空间复杂度主要衡量一个算法所需要的额外空间.

在计算机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计 算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再特别关注一个算法的空间复杂度。

5.3 时间复杂度

5.3.1 时间复杂度的概念

时间复杂度的定义:在计算机科学中, 算法的时间复杂度是一个数学函数,它定量描述了该算法的运行时间。 一个 算法执行所耗费的时间,从理论上说,是不能算出来的,只有你把你的程序放在机器上跑起来,才能知道。但是我 们需要每个算法都上机测试吗?是可以都上机测试,但是这很麻烦,所以才有了时间复杂度这个分析方式。 一个算 法所花费的时间与其中语句的执行次数成正比例, 算法中的基本操作的执行次数,为算法的时间复杂度。

5.3.2 大O的渐进表示法

代码示例:(找循环)

// 请计算一下func1基本操作执行了多少次?
void func1(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++;}System.out.println(count);
}
  • Func1 执行的基本操作次数 :

  • N = 10 F(N) = 130

  • N = 100 F(N) = 10210

  • N = 1000 F(N) = 1002010

  • F(N) = N* N +2 * N + 10

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

  • 大O符号(Big O notation):是用于描述函数渐进行为的数学符号。

5.3.2 推导大O阶方法

1、用常数1取代运行时间中的所有加法常数。
2、在修改后的运行次数函数中,只保留最高阶项。
3、如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。
使用大O的渐进表示法以后, Func1的时间复杂度为:o(N * N)

N = 10 F(N) = 100
N = 100 F(N) = 10000
N = 1000 F(N) = 1000000
通过上面我们会发现大O的渐进表示法去掉了那些对结果影响不大的项,简洁明了的表示出了执行次数。 另外有些算法的时间复杂度存在最好、平均和最坏情况:
最坏情况:任意输入规模的最大运行次数(上界) 平均情况:任意输入规模的期望运行次数
最好情况:任意输入规模的最小运行次数(下界) 例如:在一个长度为N数组中搜索一个数据x
最好情况: 1次找到
最坏情况: N次找到
平均情况: N/2次找到

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

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

【实例1】

// 计算func2的时间复杂度?
// 约等于 O(N)
void func2(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);
}

【实例2】

// 计算func3的时间复杂度?
// 约等于 O(M + N)
void func3(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);
}

【实例3】

// 计算func4的时间复杂度?
// 约等于 O(1)
void func4(int N) {int count = 0;for (int k = 0; k < 100; k++) {count++;}System.out.println(count);
}

【实例4】

//冒泡排序
// 计算bubbleSort的时间复杂度?
// 约等于 O(N * N)
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;}}
}

【实例5】

基本操作执行最好1次,最坏log2N次,时间复杂度为 O(log2N) ps:log2N在算法分析中表示是底数 为2,对数为N,有些地方会写成lgN。
(建议通过折纸查找的方式讲解logN是怎么计算出来的)
(因为二分查 找每次排除掉一半的不适合值,一次二分剩下: n/2两次二分剩下: n/2/2 = n/4)

// 二分查找
// 计算binarySearch的时间复杂度?
// 约等于 O(N * N)
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;
}

在这里插入图片描述

【实例6】

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

在这里插入图片描述
【实例7】
(建议画图递归栈帧的二叉树讲解)

// 计算斐波那契递归fibonacci的时间复杂度?
intbonacci(int N) {return N < 2 ? N :bonacci(N - 1) +bonacci(N - 2);
}

在这里插入图片描述

5.3.5空间复杂度

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

【实例1】


// 计算bubbleSort的空间复杂度?
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】

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

【实例3】

// 计算阶乘递归Factorial的空间复杂度?
long factorial(int N) {return N < 2 ? N : factorial(N - 1) * N;
}
//实例3递归调用了N次,开辟了N个栈帧,每个栈帧使用了常数个空间。空间复杂度为O(N)

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

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

相关文章

Python爬虫(6) --深层爬取

深层爬取 在前面几篇的内容中&#xff0c;我们都是爬取网页表面的信息&#xff0c;这次我们通过表层内容&#xff0c;深度爬取内部数据。 接着按照之前的步骤&#xff0c;我们先访问表层页面&#xff1a; 指定url发送请求获取你想要的数据数据解析 我们试着将以下豆瓣读书页…

河南萌新联赛2024第(二)场:南阳理工学院

A 国际旅行Ⅰ D A*BBBB F 水灵灵的小学弟 H 狼狼的备忘录 I 重生之zbk要拿回属于他的一切 J 这是签到 ##A 国际旅行Ⅰ 链接&#xff1a;https://ac.nowcoder.com/acm/contest/87255/A 来源&#xff1a;牛客网 题目描述 很久很久以前&#xff0c;有 n n n 个国家&#xff0c;第…

字符的统计——423、657、551、696、467、535

423. 从英文中重建数字 最初思路 首先要有一个指针&#xff0c;对于3/4/5为一组地跳跃。起初想的是后瞻性&#xff0c;如果符合0-9任意&#xff0c;则更换index、跳跃。此时写了一个函数&#xff0c;用来判断s的截取段和0-9中有无符合。这个思路并没有进行下去&#xff0c;虽然…

昇思25天学习打卡营第九天|本地安装mindspore之一|Linux的系统在vmware上的安装以及mindspore的安装

课程已经学完了&#xff0c;打算再深入一些。初步的想法是&#xff0c;在本地安装&#xff0c;本地执行。 根据老师的指引&#xff0c;MindSpore官网&#xff0c;“https ://www.mindspore.cn/install/”&#xff0c;注意&#xff0c;因为csdn博客编辑器的原因&#xff0c;当我…

软考:软件设计师 — 6.信息安全

六. 信息安全 1. 加密技术与认证技术 &#xff08;1&#xff09;对称与非对称加密 关于对称与非对称加密算法的详细内容&#xff0c;可以参考文章&#xff1a;信息安全基础技术与原理 对称加密 对称加密也称为共享密钥加密。 对称加密中&#xff0c;加密和解密的密钥是同一…

【豆包Marscode体验官】揭秘MarsCode AI编辑助手:高效智能编辑新纪元之入门指导与最佳实践

文章目录 1. 概述2. 工具使用过程2.1 MarsCode插件简介2.2 安装和配置2.2.1 安装MarsCode插件2.2.2 配置MarsCode插件 2.3 各个功能的使用2.3.1 代码补全2.3.2 代码补全 Pro【操作提示&#xff0c;No suggestion from Model&#xff0c;不知道是不是版本的问题】2.3.3 代码生成…

从零开始构建你的第一个Python Web应用

在本文中&#xff0c;我们将带领你从零开始构建一个简单的Python Web应用。不需要任何先验知识&#xff0c;我们会一步步地指导你完成设置、框架选择、代码编写到部署的整个过程。无论你是Web开发新手还是希望扩展技能的老手&#xff0c;这篇文章都将为你提供一个实践操作的起点…

C语言 | Leetcode C语言题解之第278题第一个错误的版本

题目&#xff1a; 题解&#xff1a; int firstBadVersion(int n) {int left 1, right n;while (left < right) { // 循环直至区间左右端点相同int mid left (right - left) / 2; // 防止计算时溢出if (isBadVersion(mid)) {right mid; // 答案在区间 [left, mid] 中…

abc363+cf960div.2+牛客周赛49轮

C - Avoid K Palindrome 2 (atcoder.jp) 思路&#xff1a; 罗列出排列的每一种情况&#xff0c;再根据题目要求进行判断 代码&#xff1a; void solve() {ll n, k;cin >> n >> k;string s;vector<char>a;cin >> s;for (int i 0; i < n; i)a.pus…

C++与lua联合编程

C与lua联合编程 一、环境配置二、lua基本语法1.第一个lua和C程序2.基本数据类型和变量2.1 Nil2.2 Booleans2.3 Numbers2.4 String(最常用) 3. 字符串处理3.1 错误处理3.2 字符串长度:string.len3.3 字符串子串 :string.sub3.4 字符串查找: string.find3.5字符串替换: string.gs…

sortablejs使用filter属性后,元素的默认事件失效了

在使用vue-draggable-plus或者sortablejs时。为了防止某个元素可以拖拽&#xff0c;一般会加上filter属性 但是加上后&#xff0c;会发现这个元素不能点击了&#xff0c;像我这里的滑块也不能滑动了。 查了很久才发现&#xff0c;还有一个属性是 preventOnFilter: true, // 在触…

安宝特方案|解放双手,解决死角,AR带来质量监督新体验

AR质量监督 解放双手&#xff0c;解决死角 在当今制造业快速发展的背景下&#xff0c;质量监督成为确保产品高质量和完善的管理制度的关键环节。然而&#xff0c;传统的质量监督方式存在诸多挑战&#xff0c;如人工操作带来的效率低下、查岗不及时、摄像头死角等问题。 为了解…

浅谈C语言整型类数据在内存中的存储

1、整型类数据 C语言中的整型类数据都归类在整型家族中&#xff0c;其中包括&#xff1a;char、short、int、long、long long这5个大类&#xff0c;而每个大类中又分为两类signed和unsigned,这些都是C语言中的内置类型。以下重点基于char和int这两种类型的数据进行阐述&#x…

C++学习笔记-C++11中的智能指针

1.智能指针介绍 智能指针是C的特性用法&#xff0c;是一个类似指针功能的类对象&#xff0c;其目的是为了更好的管理动态分配的内存&#xff0c;避免出现内存泄漏、悬空指针等问题。C11的标准库里提供了三种智能指针模板类&#xff0c;分别是std::unique_ptr、std::shared_ptr…

苹果笔记本电脑如何优化系统 苹果电脑系统优化软件哪个好 cleanmymac x怎么用

随着时间的推移&#xff0c;你可能会发现你的MacBook运行速度变慢&#xff0c;甚至在执行一些基本任务时也会感觉到卡顿。这不仅影响了工作效率&#xff0c;也大大降低了使用体验。但别担心&#xff0c;优化你的Mac系统比做早餐还简单。本文将用一种轻松的风格向你介绍7种简单易…

函数的介绍

目录 一、函数介绍 1、函数的介绍 2、自定义函数 3、函数的好处 二、函数的定义 1、函数的定义 2、函数的调用 3、快速入门案例 三、函数-调用机制 1、函数-调用过程 2、return语句 一、函数介绍 1、函数的介绍 1&#xff09;为了完成某一功能的程序指令(语句)的集…

【Postgres实战】Postgres的角色权限本地/在线不一致?

背景 Gin-Vue-Admin是开源的全栈开发平台&#xff0c;可以担任企业内部后台管理的职责。官网地址是&#xff1a;gin-vue-admin | GVA 文档站。上图为在线demo展示页面。 它的后台使用Golang&#xff08;The Go Programming Language (google.cn)&#xff09;&#xff0c;基于…

JSON 文件第一段飘红

问题 原因 这个问题通常发生在尝试用 ESLint 去解析 JSON 文件时。ESLint 主要设计用于检查 JavaScript 代码的语法和风格&#xff0c;而JSON是一种数据交换格式&#xff0c;不包含 JavaScript 的逻辑结构&#xff0c;如函数、变量声明等。 解释报错原因 当ESLint遇到它不能识…

让 AI 开发更高效、低成本,DigitalOcean 公布 GPU Droplet 云主机产品

全球知名云服务供应商 DigitalOcean 在近期举行的 Deploy 大会上公布了全新的 GPU Droplet 云主机服务&#xff0c;这标志着DigitalOcean 在支持AI和机器学习工作负载方面迈出了重要一步。 DigitalOcean 的 GPU Droplet&#xff08;云主机&#xff09; DigitalOcean 自 2023 …

【STM32嵌入式系统设计与开发拓展】——12_Timer(定时器中断实验)

目录 1、什么是定时器&#xff1f;定时器用于测量时间间隔&#xff0c;而计数器用于计数外部事件的次数 2、定时器的主要功能和用途&#xff1f;3、定时器类型&#xff1f;4、定时器的编写过程5、代码分析定时器计算&#xff1f; 1、什么是定时器&#xff1f; 定时器就是计数器…