当前位置: 首页 > news >正文

XXX公司面试真题

一、一面问题

1.线程池的主要参数

  • 核心线程数
  • 最大线程数
  • 空闲线程存活时间
  • 存活时间单位
  • 任务队列
  • 线程工厂
  • 拒绝策略
  • 允许核心线程超时

2. 线程的状态

  • 新建状态
  • 就绪状态
  • 运行状态
  • 阻塞状态
  • 死亡状态

补充:线程阻塞的原因

  • 线程调用sleep()方法进入睡眠状态 
  • 线程得到一个锁,但是该锁正在被其他线程占用
  • 线程可能在等待某个触发条件
  • 线程调用了一个在I/O上被阻塞的操作

3. 双精度类型转整型精度丢失问题(底层原因)

(1)在数据表示方式的差异

  • 双精度类型:在Java等编程语言中,double类型使用64位二进制数表示一个双精度浮点数。这64位被分为三部分:1位符号位、11位指数位和52位尾数位。这种表示方式可以精确地表示非常大或非常小的数值,但在表示某些十进制小数时,由于二进制和十进制之间的转换限制,可能会出现精度损失。
  • 整型:int类型是一个32位的有符号整数,没有小数部分。它只能表示整数范围内的数值。

(2)浮点数的运算特性

  • 不精确性:由于浮点数采用二进制科学计数法表示,某些十进制小数在转换为二进制时无法精确表示,因此浮点数运算通常是不精确的。
  • 舍入误差:当双精度浮点数转换为整型时,由于浮点数本身可能存在精度损失,且整型没有小数部分,因此必须进行舍入。

(3)底层实现的原因

  • 二进制与十进制的转换:计算机内部使用二进制进行数据存储和运算,而人类通常使用十进制。当十进制小数转换为二进制浮点数时,可能会出现无法精确表示的情况。
  • 硬件和指令集的限制:计算机硬件和指令集对浮点数的运算和表示方式有特定的要求。这些要求可能导致在浮点数转换为整型时出现精度丢失。

(4)代码示例

  • double originalDouble = 9.99; 
    int convertedInt = (int) originalDouble;
    System.out.println(" 原始 double 值: " + originalDouble); 
    System.out.println(" 转换后的 int 值: " + convertedInt);

(5)解决方法

  • 使用BigDecimal类:BigDecimal类可以提供任意精度的浮点数运算,从而避免精度丢失。
    四舍五入:在转换之前使用Math.round() 等方法对浮点数进行四舍五入处理,以减小精度丢失的影响。
  • 四舍五入:在转换之前使用Math.round() 等方法对浮点数进行四舍五入处理,以减小精度丢失的影响。

4.static修饰的类和修饰方法在底层上有什么不同。

  • 内存分配:静态内部类拥有独立的内存空间,而静态方法是分配在类的内存区域中,不占用对象的内存。
  • 加载时机:静态内部类在编译时被加载,而静态方法在类加载时被初始化。
  • 访问方式:静态内部类可以直接访问外部类的静态成员,但不能直接访问非静态成员;而静态方法只能访问静态属性和其他静态方法,不能直接访问实例变量和实例方法。

5.代码题

需求: 输入两个字符串类型的数,两数相加,最后返回一个字符串类型的结果。

(1)步骤

  • 类定义:定义了一个名为StringNumberAdder的公开类。
  • 方法定义:在StringNumberAdder类中定义了一个静态方法addStrings,该方法接收两个字符串参数num1和num2,并返回一个字符串类型的结果。
  • 字符串转整数:使用Integer.parseInt(num1) 和Integer.parseInt(num2) 方法将输入的字符串转换为整数。
  • 整数相加:将转换后的两个整数相加,得到和sum。
  • 整数转字符串:使用Integer.toString(sum) 方法将和转换回字符串。
  • 主方法:在main方法中,创建了两个字符串num1和num2,并调用addStrings方法将它们相加。打印出结果。

 (2)代码

public class StringNumberAdder {/** * 将两个字符串类型的数字相加,并返回结果字符串。 * * @param num1 第一个字符串数字 * @param num2 第二个字符串数字 * @return 相加后的结果字符串*/ public static String addStrings(String num1, String num2) { // 将字符串转换为整数进行相加 int intNum1 = Integer.parseInt(num1); int intNum2 = Integer.parseInt(num2); // 计算和 int sum = intNum1 + intNum2; // 将和转换回字符串并返回return Integer.toString(sum);  } public static void main(String[] args) {// 测试用例 String num1 = "123"; String num2 = "456"; String result = addStrings(num1, num2);System.out.println("The  result of adding " + num1 + " and " + num2 + " is: " + result);} 
}

二、二面问题

1.说一下数据库的存储引擎有哪些? 

MySQL/MariaDB

  • InnoDB

    • MySQL的默认存储引擎。
    • 支持ACID事务、行级锁定和外键约束。
    • 适用于需要高并发和事务处理能力的应用。
    • 提供了自动崩溃恢复功能。
  • MyISAM

    • MySQL早期的默认存储引擎之一。
    • 提供了高速的读操作性能,但写操作性能相对较差。
    • 支持表级锁定、全文索引和数据压缩。
    • 适用于读多写少的应用场景。
  • Memory(HEAP)

    • 将数据存储在内存中,提供极快的读写速度。
    • 由于数据存储在内存中,重启后会丢失数据。
    • 适用于需要快速访问的临时数据,如会话信息和缓存。
  • CSV

    • 将数据存储在CSV文件中,便于数据的导入和导出。
    • 不支持事务和索引,性能较低。
    • 适用于需要与其他应用进行数据交换的场景。
  • Archive

    • 适用于存储大量历史数据和归档数据。
    • 提供了高效的数据压缩能力,但只支持INSERT和SELECT操作。
    • 不支持事务和外键约束。
  • Federated

    • 允许在不同的MySQL实例之间创建分布式表。
    • 适用于分布式数据库系统。
    • 不存储实际数据和索引,只是一个指向远程表的接口。
  • Aria

    • MariaDB的默认存储引擎。
    • 旨在替代MyISAM,提供了更好的崩溃恢复能力和事务支持。
    • 支持事务和行级锁定,但不支持外键约束。
  • TokuDB

    • 适用于处理大数据量和高写入负载的应用。
    • 采用了Fractal Tree索引技术,提供了高效的压缩和写入性能。
    • 支持事务和行级锁定。
  • RocksDB

    • 由Facebook开发,以高效的写入性能和低延迟著称。
    • 使用了LSM(Log-Structured Merge)树索引结构。
    • 支持事务和行级锁定。

MySQL Cluster

  • NDB

    • MySQL Cluster的默认存储引擎。
    • 支持高可用性和高扩展性。
    • 提供了数据的水平分片和自动故障转移功能。

其他

  • XtraDB

    • Percona Server的默认存储引擎。
    • 在InnoDB的基础上进行了多项优化,如支持更多的并发线程和更高效的缓存管理。
  • MERGE

    • 允许将多个MyISAM表组合成一个逻辑表。
    • 适用于需要对大数据集进行分区管理的场景。
  • EXAMPLE

    • 一个示例存储引擎,主要用于学习和开发自定义存储引擎。
    • 不实际存储数据,仅用于展示如何实现一个存储引擎的基础框架。
  • BLACKHOLE

    • 一种虚拟存储引擎,所有写入的数据都会被丢弃。
    • 通常用于测试和调试数据库复制和日志记录机制。

2. 数据库的存储结构是?

(1)关系型数据库的存储结构

  • 关系表
  • 索引
  • 视图
  • 触发器

(2) 键值对

  • 文档
  • 图形
  • 列族

(3)储存层次

  • 表空间 

(4)连接器

3. B树和B+树的区别?

(1)节点存储数据的方式不同

  • B树:叶子结点和非叶子节点都会存储数据,指针和数据共同保存在同一节点中。
  • B+树:数据均保存在叶子节点,非叶子节点只存储索引信息。

(2)查找数据过程不同

  • B树:需要在各个节点上进行查找,查找数据的效率不稳定。
  • B+树:需要在叶子节点上查找,非叶子节点只用于索引定位,每次查找都会从父节点到叶子节点结束。

(3)空间利用率不同

  • B树:每个节点都存储数据,空间利用率相对较低。
  • B+树:只有叶子节点存储数据,非叶子节点只存储索引信息,空间利用率更高。

(4)结构稳定性不同

  • B树:插入和删除数据需要频繁变更树的结构,结构不稳定。
  • B+树:插入和删除数据操作均放在叶子节点,维护了树结构的稳定性

(5)范围查找性能不同

  • B树:需要在各个节点上逐个查找,范围查找效率较低。
  • B+树:所有数据记录都存储在叶子节点上,且叶子节点同时还维护了一条双向链表,提高了范围查询的效率。

(6)使用场景不同

  • B树:更适合于数据库的索引结构,处理大量点查询。
  • B+树:更适合文件系统等场景,处理大量范围查询和排序操作。

4.HashMap底层实现(HashMap相关知识)

 一、什么是

  • 基于哈希表的数据结构
  • 允许以O(1)的时间复杂度进行元素的插入,查询和删除

二、底层结构

1.数据结构

  • 在1.8以后,数组+链表+红黑树
数组:HashMap底层是一个数组,每个数组元素存放一个链表或红黑树(在JDK 1.8之后,链表过长时会转化为红黑树)。链表:当新元素插入HashMap时,它首先根据哈希值找到数组中的某个位置(桶)。如果该位置为空,则直接插入;如果该位置已经存在元素(发生碰撞),则通过链表解决冲突。红黑树:在JDK 1.8中,当链表长度超过一定阈值(默认是8)时,链表会转换为红黑树,从而将时间复杂度从O(n)降低到O(log n)。

 2.哈希函数和哈希值

  • 每个键都会通过哈希函数计算出一个哈希值,然后通过哈希值决定数据应该存储在哪个桶中。桶是一个数组的存储位置。
  • 哈希函数的主要目的是将数据均匀地分布在不同的桶中,从而减少哈希碰撞(即两个不同的键映射到同一个桶中的情况)。

3.负载因子和扩容

(1)负载因子

  • HashMap有一个重要的参数叫负载因子,它决定了当数组中元素数量超过数组容量的多大比例时会触发扩容操作。默认的负载因子是0.75。

(2)扩容操作

  • 当HashMap的元素数量达到数组容量的75%时,HashMap会自动进行扩容操作,通常会将数组容量扩展为原来的2倍。
  •  扩容时,HashMap会重新分配一个更大的数组,并将原来的元素重新映射到新的数组中

三、底层代码

1.关键点解析

(1)构造函数

  • HashMap提供了多个构造函数,包括无参构造函数、指定初始容量的构造函数、指定初始容量和负载因子的构造函数等。

(2)put方法

  • put方法是插入元素的核心逻辑。
  • 首先,计算键的哈希值。
  • 其次,根据哈希值找到数组中的桶位置。
  • 最后,如果该位置为空,则直接插入新元素;如果该位置已经存在元素,则通过链表或红黑树解决冲突。
  • 如果链表长度超过阈值(默认是8),则链表会转换为红黑树。
  • 如果元素数量超过扩容阈值(默认是数组容量的75%),则进行扩容操作。

(3)get方法

  •  get方法用于根据键查找对应的值。
  • 首先,计算键的哈希值。
  • 其次,根据哈希值找到数组中的桶位置。
  • 最后,如果该位置为空,则返回null;如果该位置上有元素,则遍历该位置对应的链表或红黑树,找到与键相等的键值对,然后返回该键值对的值。

(4)resize方法 

  • resize方法是扩容的核心逻辑。
  • 重新分配一个更大的数组,并将原来的元素重新映射到新的数组中。
  • 在重新映射过程中,会根据元素的哈希值计算在新数组中的位置,并将元素插入到相应的桶中。

2.示例代码

(1)思路

  • 首先创建了一个HashMap实例,并插入了一些键值对。
  • 然后,通过键来访问元素,并遍历了HashMap中的所有键值对。
  • 最后,通过插入大量元素来触发扩容操作,并再次遍历了HashMap。

(2)代码

import java.util.HashMap;  public class HashMapExample { public static void main(String[] args) { // 创建HashMap实例 HashMap<String, Integer> map = new HashMap<>();// 插入键值对 map.put("apple",  1);map.put("banana",  2); map.put("cherry",  3); // 访问元素System.out.println(map.get("apple"));   // 输出: 1 System.out.println(map.get("orange"));  // 输出: null // 遍历HashMap for (String key : map.keySet())  {System.out.println(key  + ": " + map.get(key));  }// 扩容操作(自动触发) for (int i = 0; i < 1000; i++) {map.put("key"  + i, i); } // 再次遍历HashMap for (String key : map.keySet())  {System.out.println(key  + ": " + map.get(key)); } } 
} 

四、线程安全性

1.HashMap是非线程安全

  • 多个线程同时访问和修改HashMap时,可能会出现数据不一致的情况。
  • 解决方法:增加额外的同步机制

2.ConcurrentHashMap

  • 一个线程安全的哈希表
  • 通过分段锁来实现并发访问

五、键的null值

1.HashMap允许null值

  • HashMap允许使用一个null键和多个null值。当使用null键时,它会被映射到数组的第一个位置(索引为0的桶)。
  • map.put(null,  "value1"); // 允许键为 null 
    map.put("key1",  null);   // 允许值为 null

 2.与HashTable的区别

  • Hashtable不允许键或值为null。
  • 如果强制将null作为键或值插入Hashtable,会抛出NullPointerException

六、遍历方式

1. 使用 for-each 循环遍历键值对

for (Map.Entry<String, String> entry : map.entrySet())  {String key = entry.getKey(); String value = entry.getValue(); System.out.println("Key:  " + key + ", Value: " + value);
}

2. 使用 Iterator 遍历键值对

Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator(); 
while (iterator.hasNext())  {Map.Entry<String, String> entry = iterator.next(); String key = entry.getKey(); String value = entry.getValue(); System.out.println("Key:  " + key + ", Value: " + value);
}

3. 使用 keySet 遍历键

for (String key : map.keySet())  {String value = map.get(key); System.out.println("Key:  " + key + ", Value: " + value);
}

4. 使用 values 遍历值

for (String value : map.values())  {System.out.println("Value:  " + value);
}

七、常见面试题

1.为什么 HashMap 在 JDK 1.8 中引入了红黑树?

  • 在 JDK 1.8 之前,HashMap 使用链表来解决哈希冲突。当链表过长时,查找、插入和删除操作的时间复杂度会退化为 O(n)。引入红黑树后,当链表长度超过 8 时,链表会转换为红黑树,将时间复杂度降低到 O(log n),提高了性能。 

2.HashMap 的初始容量和负载因子是多少?

  • HashMap 的默认初始容量是 16,负载因子是 0.75。 

3.HashMap 的扩容机制是什么?

  • 当 HashMap 的元素数量超过数组容量的 75% 时,会触发扩容操作,数组容量会扩展为原来的 2 倍。扩容时,HashMap 会重新分配一个更大的数组,并将原来的元素重新映射到新的数组中。 

4.HashMap 如何保证线程安全?

  • HashMap 本身不是线程安全的。如果需要在多线程环境下使用 HashMap,可以使用 ConcurrentHashMap 或者对 HashMap 进行同步处理,例如使用 Collections.synchronizedMap 方法。 

八、HashMap性能优化

1.初始容量的选择

2.负载因子的调整

3.自定义哈希函数

九、Hashmap、HashTable和LinkedHashMap区别

特点/实现类HashMapHashTableLinkedHashMap
线程安全非线程安全线程安全非线程安全
允许null键/值允许一个null键和多个null值不允许null键和null值允许一个null键和多个null值
迭代顺序不保证顺序不保证顺序保持插入顺序
底层实现数组+链表+红黑树(JDK 1.8及以后)数组+链表继承自HashMap,内部维护一个双向链表
性能特点通常性能最高,但不安全性能较低,但线程安全性能略低于HashMap,因为维护了顺序
同步机制使用synchronized关键字
扩容机制当元素数量超过数组容量的75%时扩容同HashMap同HashMap
适用场景单线程环境下,需要高性能的键值对存储多线程环境下,需要线程安全的键值对存储需要保持键值对插入顺序的场景

5.多线程的执行过程

  • 线程创建:定义线程类并创建线程实例。
  • 线程启动:调用 start() 方法启动线程。
  • 线程调度:线程进入就绪状态,等待 CPU 时间片,然后进入运行状态。
  • 线程同步:使用同步机制避免竞态条件。
  • 线程阻塞:线程在等待某个条件或资源时进入等待或阻塞状态。
  • 线程终止:线程正常或异常终止,或通过显式终止。
  • 线程销毁:线程终止后,资源被释放,垃圾回收器回收不再使用的线程对象。

6.代码题

需求:字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。

 (1)步骤

在这个实现中,我们使用了StringBuilder来构建压缩后的字符串,因为它比直接使用字符串拼接(使用+操作符)更加高效。StringBuilder内部维护了一个可变的字符数组,可以在不创建新字符串对象的情况下追加字符和字符串。

另外,我们注意到在遍历字符串时,我们只需要遍历到n - 1的位置,因为最后一个字符的处理是在循环之外单独完成的。这是为了避免在循环中处理最后一个字符时越界访问数组。

最后,我们通过比较压缩后的字符串长度和原始字符串长度来决定返回哪个字符串。如果压缩后的字符串更短,则返回它;否则,返回原始字符串。

(2)代码

public class StringCompression {public static String compressString(String str) {if (str == null || str.length()  <= 1) {return str;}StringBuilder compressed = new StringBuilder();int count = 1;char lastChar = str.charAt(0); for (int i = 1; i < str.length();  i++) {if (str.charAt(i)  == lastChar) {count++;} else {compressed.append(lastChar).append(count); lastChar = str.charAt(i); count = 1;}}// 添加最后一个字符及其计数compressed.append(lastChar).append(count); // 比较原始字符串和压缩字符串的长度 return compressed.length()  < str.length()  ? compressed.toString()  : str;}public static void main(String[] args) {String input = "aabcccccaaa";String compressed = compressString(input);System.out.println("Original:  " + input);System.out.println("Compressed:  " + compressed);}
}

(3)结果

对于输入字符串 "aabcccccaaa",输出将是:

Original: aabcccccaaa
Compressed: a2b1c5a3

相关文章:

XXX公司面试真题

一、一面问题 1.线程池的主要参数 核心线程数最大线程数空闲线程存活时间存活时间单位任务队列线程工厂拒绝策略允许核心线程超时 2. 线程的状态 新建状态就绪状态运行状态阻塞状态死亡状态 补充&#xff1a;线程阻塞的原因 线程调用sleep()方法进入睡眠状态 线程得到一个…...

第一节:电路连接【51单片机+A4988+步进电机教程】

摘要&#xff1a;本节介绍如何搭建一个51单片机A4988步进电机控制电路&#xff0c;所用材料均为常见的模块&#xff0c;简单高效的方式搭建起硬件环境 一、硬件清单 ①51单片机最小控制模块 ②开关电源 ③A4988模块转接座 ④二相四线步进电机 ⑤电线若干 二、接线 三、A49…...

机器学习算法深度解析:以支持向量机(SVM)为例的实践应用

机器学习算法深度解析&#xff1a;以支持向量机&#xff08;SVM&#xff09;为例的实践应用 在当今的数据驱动时代&#xff0c;机器学习作为人工智能的核心分支&#xff0c;正以前所未有的速度改变着我们的生活与工作方式。从图像识别到自然语言处理&#xff0c;从金融预测到医…...

解决Postman一直在转圈加载无法打开问题的方法

在使用Postman这款强大的API测试工具时&#xff0c;有时可能会遇到程序长时间加载而无法正常使用的情况。面对这样的问题&#xff0c;可以尝试以下几种解决办法&#xff1a; 方法一&#xff1a;直接运行Postman可执行文件 定位到Postman的安装目录 如果您不确定Postman的具体安…...

利用 LangChain 构建对话式 AI 应用

随着人工智能技术的快速发展&#xff0c;对话式 AI 已成为现代应用的核心部分。在构建智能客服、虚拟助手以及交互式学习平台时&#xff0c;一个强大且灵活的框架显得尤为重要。本文将深度解析 LangChain 这一框架的功能及实际使用&#xff0c;帮助开发者快速上手。 什么是 La…...

力扣--34.在排序数组中查找元素的第一个和最后一个位置

题目 给你一个按照非递减顺序排列的整数数组 nums&#xff0c;和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target&#xff0c;返回 [-1, -1]。 你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。 示例 1&…...

【Java回顾】Day2 正则表达式----异常处理

参考资料&#xff1a;菜鸟教程 https://www.runoob.com/java/java-exceptions.html 正则表达式 有一部分没看完 介绍 字符串的模式搜索、编辑或处理文本java.util.regex包&#xff0c;包含了pattern和mathcer类&#xff0c;用于处理正则表达式的匹配操作。 捕获组 把多个字符…...

【SpringBoot】当 @PathVariable 遇到 /,如何处理

1. 问题复现 在解析一个 URL 时&#xff0c;我们经常会使用 PathVariable 这个注解。例如我们会经常见到如下风格的代码&#xff1a; RestController Slf4j public class HelloWorldController {RequestMapping(path "/hi1/{name}", method RequestMethod.GET)publ…...

【FlutterDart】页面切换 PageView PageController(9 /100)

上效果&#xff1a; 有些不能理解官方例子里的动画为什么没有效果&#xff0c;有可能是我写法不对 后续如果有动画效果修复了&#xff0c;再更新这篇&#xff0c;没有动画效果&#xff0c;总觉得感受的丝滑效果差了很多 上代码&#xff1a; import package:flutter/material.…...

Backend - C# 的日志 NLog日志

目录 一、注入依赖和使用 logger 二、配置记录文件 1.安装插件 NLog 2.创建 nlog.config 配置文件 3. Programs配置日志信息 4. 设置 appsettings.json 的 LogLevel 5. 日志设定文件和日志级别的优先级 &#xff08;1&#xff09;常见的日志级别优先级 &#xff08;2&…...

Flask是什么?深入解析 Flask 的设计与应用实践

文章目录 一、引言&#xff1a;从微框架到生态系统二、Flask 的核心设计理念三、Flask 的关键组件解析3.1 路由系统3.2 请求与响应对象3.3 模板引擎 Jinja23.4 扩展系统 四、Flask 的并发与性能优化4.1 默认的单线程模型4.2 提升并发性能的方法4.3 性能优化技巧 五、在企业级场…...

malloc函数和calloc函数的区别是什么?

malloc函数和calloc函数在动态内存管理中都起着分配内存空间的作用&#xff0c;但它们存在以下区别&#xff1a; 参数方面 - malloc函数&#xff1a;它只有一个参数&#xff0c;该参数表示要分配的字节数。例如&#xff0c; int *ptr (int *)malloc(10 * sizeof(int)); &#…...

Ansys Maxwell:3PH 变压器电感计算

各位变形金刚粉丝们&#xff0c;大家好&#xff1a; 在本博客中&#xff0c;我讨论了如何使用 Ansys Maxwell 计算三相变压器中的自感、互感和漏感。有多种方法和表达式可用于计算这些电感。 基本电感定义 电感的单位是亨利&#xff08;H&#xff09;&#xff0c;其基本单位…...

【Go】Go文件操作详解

1. 前言 相信如果看过之前文章的朋友们一定知道我想讲什么了&#xff1f;灵魂三问&#xff1a;文件是什么&#xff1f;为什么需要文件&#xff1f;文件怎么操作&#xff1f;前面章节我们已经能够编写各种各样的功能代码了&#xff0c;但是一个很现实的问题就是我们没有任何 持…...

[react+ts] useRef获取自定义组件dom或方法声明

想用useRef获取自定义组件? 如果获取dom,直接写 const sonRef useRef<HTMLDivElement>(null); 然后子组件用forwardRef包一层,注意是HTMLDivElement,别写错, 写HTMLElement不行 const Son forwardRef<HTMLDivElement, IProps>((props, ref) > {}) 切记这…...

AI 将在今年获得“永久记忆”,2028美国会耗尽能源储备

AI的“永久记忆”时代即将来临 谷歌前CEO施密特揭示了AI技术的前景&#xff0c;他相信即将在2025年迎来一场伟大的变化。AI将实现“永久记忆”&#xff0c;改变我们与科技的互动过程。施密特将现有的AI上下文窗口比作人类的短期记忆&#xff0c;难以持久保存信息。他的设想是…...

【视频笔记】基于PyTorch从零构建多模态(视觉)大模型 by Umar Jamil【持续更新】

视频链接: 基于PyTorch从零构建多模态(视觉)大模型 by Umar Jamil 从头编写一个视觉语言模型:PloyGamma,是谷歌的一个模型 1:原始图像 2:视觉编码器(本文是viT),通过对比学习进行训练。这个对比学习最开始是CLIP,后来被谷歌改成了SigLIP 3:线性投影层 4:如何将图…...

解决 C++ 中头文件相互引用和解耦问题

在 C 中&#xff0c;当多个 .h 文件相互引用时&#xff0c;可能会导致 循环依赖 或 头文件冗余 问题&#xff0c;进而引发编译时间延迟、代码复杂度增加等问题。为了有效地解耦和组织代码&#xff0c;可以采用以下几种策略和思想&#xff1a; 1. 前向声明&#xff08;Forward …...

河马剧场(短剧)APP的邀请码怎么填写

上篇给大家说到河马剧场免费看短剧还能领5.2元3天vip会员&#xff0c;本文就说一下河马剧场河马短剧APP的邀请码怎么填写。 河马短剧APP填写邀请码分三步&#xff1a; 1、安装登陆河马短剧APP 2、点击底部导航栏中间的“福利” 3、往下划会看到“填写邀请码领3天vip” 4、…...

01:C语言的本质

C语言的本质 1、ARM架构与汇编2、局部变量初始化与空间分配2.1、局部变量的初始化2.1、局部变量数组初始化 3、全局变量/静态变量初始化化与空间分配4、堆空间 1、ARM架构与汇编 ARM简要架构如下&#xff1a;CPU&#xff0c;ARM(能读能写)&#xff0c;Flash&#xff08;能读&a…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...