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

哈希表(典型算法思想)—— OJ例题算法解析思路

目录

一、1. 两数之和 - 力扣(LeetCode)

算法代码: 

1. 问题描述

2. 核心思路

3. 代码实现思路

(1)初始化哈希表

(2)遍历数组

(3)返回结果

4. 时间复杂度分析

5. 示例演示

输入:

执行过程:

输出:

6. 边界情况考虑

7. 代码总结

8. 代码优化(可选)

二、面试题 01.02. 判定是否互为字符重排 - 力扣(LeetCode)

算法代码: 

1. 问题描述

2. 核心思路

3. 代码实现思路

(1)长度检查

(2)初始化哈希表

(3)统计 s1 的字符频率

(4)检查 s2 的字符频率

(5)返回结果

4. 时间复杂度分析

5. 示例演示

输入:

执行过程:

输出:

6. 边界情况考虑

7. 代码总结

8. 代码优化(可选)

三、217. 存在重复元素 - 力扣(LeetCode)

算法代码: 

代码分析

1. 输入和输出

2. 哈希表的使用

3. 遍历数组

4. 检查重复

5. 返回结果

整体思路总结

时间与空间复杂度

举例说明

四、219. 存在重复元素 II - 力扣(LeetCode) 

算法代码: 

代码分析

1. 输入和输出

2. 哈希表的使用

3. 遍历数组

4. 检查重复和索引差

5. 更新哈希表

6. 返回结果

整体思路总结

时间与空间复杂度

举例说明

五、 49. 字母异位词分组 - 力扣(LeetCode)

算法代码: 

代码分析

1. 输入和输出

2. 哈希表的使用

3. 将字母异位词分组

4. 提取结果

5. 返回结果

整体思路总结

时间与空间复杂度

举例说明


一、1. 两数之和 - 力扣(LeetCode)

算法代码: 

class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int, int> hash; // <nums[i], i>for (int i = 0; i < nums.size(); i++) {int x = target - nums[i];if (hash.count(x))return {hash[x], i};hash[nums[i]] = i;}// 照顾编译器return {-1, -1};}
};

1. 问题描述

给定一个整数数组 nums 和一个目标值 target,要求在数组中找到两个数,使得它们的和等于 target,并返回这两个数的下标。


2. 核心思路

  • 暴力解法:双重循环遍历所有可能的数对,检查它们的和是否等于 target。时间复杂度为 O(n2)O(n2)。

  • 优化思路:利用哈希表存储已经遍历过的数及其下标,通过查找哈希表来快速判断是否存在满足条件的数对。


3. 代码实现思路

(1)初始化哈希表
unordered_map<int, int> hash; // <nums[i], i>
  • 哈希表的键是数组中的元素值(nums[i]),值是该元素的下标(i)。

  • 哈希表的作用是快速查找某个值是否已经存在于数组中。

(2)遍历数组
for (int i = 0; i < nums.size(); i++) {int x = target - nums[i];if (hash.count(x))return {hash[x], i};hash[nums[i]] = i;
}
  • 步骤 1:计算目标差值 x = target - nums[i]

    • 如果 x 存在于哈希表中,说明之前已经遍历过 x,且 x 的下标为 hash[x]

    • 此时,nums[i] 和 x 就是满足条件的两个数,直接返回它们的下标 {hash[x], i}

  • 步骤 2:如果 x 不存在于哈希表中,将当前元素 nums[i] 及其下标 i 存入哈希表,以便后续查找。

(3)返回结果
  • 如果找到满足条件的数对,直接返回它们的下标。

  • 如果遍历结束后仍未找到,返回 {-1, -1}(这是一个默认值,用于照顾编译器,实际题目保证有解)。


4. 时间复杂度分析

  • 时间复杂度:O(n)。

    • 遍历数组一次,每次查找哈希表的时间复杂度为 O(1)。

  • 空间复杂度:O(n)。

    • 哈希表最多存储 n 个元素。


5. 示例演示

输入:
nums = [2, 7, 11, 15], target = 9
执行过程:
  1. 初始化哈希表:hash = {}

  2. 遍历数组:

    • i = 0nums[0] = 2,计算 x = 9 - 2 = 7

      • 哈希表中没有 7,将 2 存入哈希表:hash = {2: 0}

    • i = 1nums[1] = 7,计算 x = 9 - 7 = 2

      • 哈希表中有 2,返回 {hash[2], 1} = {0, 1}

输出:
[0, 1]

6. 边界情况考虑

  • 重复元素:如果数组中有重复元素,哈希表会存储最后一个出现的下标,但不会影响结果,因为题目保证只有一个解。

  • 无解情况:题目保证有解,因此无需处理无解情况。如果题目不保证有解,可以在遍历结束后返回空数组或抛出异常。


7. 代码总结

  • 核心思想:利用哈希表的快速查找特性,将两数之和问题从 O(n2)O(n2) 优化到 O(n)O(n)。

  • 实现细节

    • 哈希表存储元素值及其下标。

    • 遍历时计算目标差值,并在哈希表中查找。

    • 找到解后立即返回,避免不必要的遍历。


8. 代码优化(可选)

  • 如果题目要求返回所有可能的解,可以将哈希表的值改为存储下标列表,并在找到解时记录所有满足条件的下标对。

  • 如果数组已排序,可以使用双指针法,进一步优化空间复杂度为 O(1)O(1)。

二、面试题 01.02. 判定是否互为字符重排 - 力扣(LeetCode)

算法代码: 

class Solution {
public:bool CheckPermutation(string s1, string s2) {if (s1.size() != s2.size())return false;int hash[26] = {0};// 先统计第⼀个字符串的信息for (auto ch : s1)hash[ch - 'a']++;// 扫描第⼆个字符串,看看是否能重排for (auto ch : s2) {hash[ch - 'a']--;if (hash[ch - 'a'] < 0)return false;}return true;}
};

1. 问题描述

给定两个字符串 s1 和 s2,判断它们是否可以通过字符重排得到彼此。例如:

  • s1 = "abc"s2 = "cba",返回 true

  • s1 = "abc"s2 = "def",返回 false


2. 核心思路

  • 变位词的定义:两个字符串的字符种类和数量完全相同,但顺序可以不同。

  • 统计字符频率:通过哈希表(数组)统计每个字符的出现次数,然后比较两个字符串的字符频率是否一致。


3. 代码实现思路

(1)长度检查
if (s1.size() != s2.size())return false;
  • 如果两个字符串的长度不同,直接返回 false,因为长度不同的字符串不可能是变位词。

(2)初始化哈希表
int hash[26] = {0};
  • 使用一个长度为 26 的数组 hash 来统计字符频率。

  • 数组的索引表示字符('a' 到 'z'),值表示该字符的出现次数。

(3)统计 s1 的字符频率
for (auto ch : s1)hash[ch - 'a']++;
  • 遍历 s1 的每个字符,将其映射到数组索引(ch - 'a'),并增加对应位置的计数。

(4)检查 s2 的字符频率
for (auto ch : s2) {hash[ch - 'a']--;if (hash[ch - 'a'] < 0)return false;
}
  • 遍历 s2 的每个字符,将其映射到数组索引,并减少对应位置的计数。

  • 如果某个字符的计数变为负数,说明 s2 中该字符的出现次数多于 s1,直接返回 false

(5)返回结果
return true;
  • 如果遍历结束后没有发现计数为负数的情况,说明两个字符串的字符频率完全一致,返回 true


4. 时间复杂度分析

  • 时间复杂度:O(n),其中 nn 是字符串的长度。

    • 遍历 s1 和 s2 各一次,每次操作的时间复杂度为 O(1)O(1)。

  • 空间复杂度:O(1)。

    • 使用固定大小的数组(长度为 26),与输入规模无关。


5. 示例演示

输入:
s1 = "anagram", s2 = "nagaram"
执行过程:
  1. 长度检查:s1 和 s2 的长度均为 7,继续执行。

  2. 统计 s1 的字符频率:

    • hash = {a: 3, n: 1, g: 1, r: 1, m: 1}

  3. 检查 s2 的字符频率:

    • 遍历 s2,每次减少对应字符的计数。

    • 遍历结束后,hash 中所有字符的计数均为 0。

  4. 返回 true

输出:
true

6. 边界情况考虑

  • 空字符串:如果 s1 和 s2 都为空字符串,返回 true

  • 大小写敏感:代码假设字符串只包含小写字母。如果包含大写字母或其他字符,需要扩展哈希表的大小或使用 unordered_map

  • 非字母字符:如果字符串包含非字母字符(如数字、标点符号),需要调整哈希表的实现方式。


7. 代码总结

  • 核心思想:通过哈希表统计字符频率,判断两个字符串的字符频率是否一致。

  • 实现细节

    • 使用数组模拟哈希表,适用于字符范围固定的场景。

    • 遍历时动态减少字符计数,避免额外的遍历操作。


8. 代码优化(可选)

  • 如果字符串可能包含大写字母或其他字符,可以使用 unordered_map 代替数组:

    unordered_map<char, int> hash;
    for (auto ch : s1)hash[ch]++;
    for (auto ch : s2) {hash[ch]--;if (hash[ch] < 0)return false;
    }
    return true;
  • 如果字符串长度较大,可以提前返回 false,避免不必要的遍历。

三、217. 存在重复元素 - 力扣(LeetCode)

算法代码: 

class Solution {
public:bool containsDuplicate(vector<int>& nums) {unordered_set<int> hash;for (auto x : nums)if (hash.count(x))return true;elsehash.insert(x);return false;}
};

代码分析

1. 输入和输出
  • 输入: 一个整数数组 nums

  • 输出: 布尔值 true 或 false,分别表示数组中是否存在重复元素。

2. 哈希表的使用
unordered_set<int> hash;
  • 创建一个 unordered_set<int> 类型的哈希表 hash,用于存储已经遍历过的元素。哈希表的查找和插入操作平均时间复杂度为 O(1),使得这个方法高效。

3. 遍历数组
for (auto x : nums)
  • 使用范围 for 循环遍历数组 nums 中的每个元素 x

4. 检查重复
if (hash.count(x))return true; // 如果已存在,则返回 true
elsehash.insert(x); // 否则,将当前元素插入哈希表
  • 在每次遍历时,使用 hash.count(x) 检查当前元素 x 是否已存在于哈希表中:

    • 如果存在,说明有重复元素,直接返回 true

    • 如果不存在,将当前元素 x 插入哈希表中,以便在后续的遍历中进行检查。

5. 返回结果
return false;
  • 如果循环结束后仍未发现重复元素,则返回 false

整体思路总结

  1. 初始化: 创建一个空的哈希表,用于存储已经检查过的元素。

  2. 遍历元素: 逐一检查数组中的元素。

  3. 检查存在性: 对每个元素,使用哈希表判断它是否已经出现过。

  4. 处理结果:

    • 如果出现过,返回 true

    • 如果遍历结束后未发现重复,返回 false

时间与空间复杂度

  • 时间复杂度: O(n),其中 n 是数组 nums 的长度。遍历数组的每个元素,每次查找和插入操作的平均时间复杂度为 O(1)。

  • 空间复杂度: O(n),在最坏的情况下,哈希表可能会存储数组中的所有元素。

举例说明

假设输入数组为 nums = [1, 2, 3, 1]

  1. 初始化哈希表 hash 为 {}

  2. 遍历第一个元素 1hash.count(1) 返回 0,插入 1,现在 hash = {1}

  3. 遍历第二个元素 2hash.count(2) 返回 0,插入 2,现在 hash = {1, 2}

  4. 遍历第三个元素 3hash.count(3) 返回 0,插入 3,现在 hash = {1, 2, 3}

  5. 遍历第四个元素 1hash.count(1) 返回 1,发现重复,返回 true

如果输入为 nums = [1, 2, 3],遍历结束后没有发现重复,返回 false

四、219. 存在重复元素 II - 力扣(LeetCode) 

算法代码: 

class Solution {
public:bool containsNearbyDuplicate(vector<int>& nums, int k) {unordered_map<int, int> hash;for (int i = 0; i < nums.size(); i++) {if (hash.count(nums[i])) {if (i - hash[nums[i]] <= k)return true;}hash[nums[i]] = i;}return false;}
};

代码分析

1. 输入和输出
  • 输入: 一个整数数组 nums 和一个整数 ( k )。

  • 输出: 布尔值 true 或 false,分别表示是否存在满足条件的重复元素。

2. 哈希表的使用
unordered_map<int, int> hash;
  • 创建一个 unordered_map<int, int> 类型的哈希表 hash,用于存储每个元素及其最近出现的索引。键为数组中的元素,值为该元素最后一次出现的索引。

3. 遍历数组
for (int i = 0; i < nums.size(); i++) {
  • 使用一个 for 循环遍历数组 nums 中的每个元素。

4. 检查重复和索引差
if (hash.count(nums[i])) {if (i - hash[nums[i]] <= k)return true; // 找到满足条件的重复元素
}
  • 在每次遍历时,检查当前元素 nums[i] 是否已经存在于哈希表中:

    • 如果存在,检查当前索引 ( i ) 与该元素最近索引(即 hash[nums[i]])之间的差值是否小于或等于 ( k )。

    • 如果满足条件 ( i - hash[nums[i]] \leq k ),则返回 true,表示找到了满足条件的重复元素。

5. 更新哈希表
hash[nums[i]] = i;
  • 无论该元素是否存在于哈希表中,都将当前元素 nums[i] 的索引 ( i ) 更新到哈希表中。这确保了每次我们都能得到当前元素的最新索引。

6. 返回结果
return false;
  • 如果循环结束后仍未找到满足条件的重复元素,返回 false

整体思路总结

  1. 初始化: 创建一个哈希表 hash 来存储元素及其索引。

  2. 遍历元素: 逐一遍历数组中的每个元素。

  3. 检查存在性与条件:

    • 对于每个元素,检查其是否已经在哈希表中。

    • 如果在,计算该元素的当前索引与上次出现索引之间的差值是否小于或等于 ( k )。

    • 满足条件则返回 true

  4. 更新索引: 更新哈希表中该元素的最新索引。

  5. 返回结果: 如果遍历结束未发现符合条件的重复元素,则返回 false

时间与空间复杂度

  • 时间复杂度: O(n),其中 ( n ) 是数组 nums 的长度。对每个元素进行常数时间的查找和插入操作。

  • 空间复杂度: O(min(n, k)),在最坏情况下,哈希表可能会存储最多 ( k ) 个不同的元素(如果数组中重复的元素分布在 ( k ) 个索引范围内),或者存储 ( n ) 个元素(如果所有元素都是不同的)。

举例说明

假设我们有一个数组 nums 为 [1, 2, 3, 1],并且 ( k = 3 )。

  1. 初始哈希表hash 为 {}

  2. 遍历:

    • 索引 0: 元素 1hash 变为 {1: 0}

    • 索引 1: 元素 2hash 变为 {1: 0, 2: 1}

    • 索引 2: 元素 3hash 变为 {1: 0, 2: 1, 3: 2}

    • 索引 3: 元素 1hash 中已存在 1,计算索引差:3 - 0 = 3,满足条件 ( |i - j| \leq k ),返回 true

如果我们检查数组 nums = [1, 0, 1, 1],并且 ( k = 1 ):

  1. 初始化hash 为 {}

  2. 遍历:

    • 索引 01hash 变为 {1: 0}

    • 索引 10hash 变为 {1: 0, 0: 1}

    • 索引 21hash 中已存在 1,计算差值:2 - 0 = 2,不满足 ( |i - j| \leq 1 )。

    • 索引 31,再次找到 1,计算差值:3 - 0 = 3,仍然不满足条件,最终返回 false

五、 49. 字母异位词分组 - 力扣(LeetCode)

算法代码: 

class Solution {
public:vector<vector<string>> groupAnagrams(vector<string>& strs) {unordered_map<string, vector<string>> hash;// 1. 把所有的字⺟异位词分组for (auto& s : strs) {string tmp = s;sort(tmp.begin(), tmp.end());hash[tmp].push_back(s);}// 2. 结果提取出来vector<vector<string>> ret;for (auto& [x, y] : hash) {ret.push_back(y);}return ret;}
};

代码分析

1. 输入和输出
  • 输入: 一个字符串数组 strs,其中包含多个字符串。

  • 输出: 一个二维字符串数组 ret,其中每个子数组包含一组字母异位词。

2. 哈希表的使用
unordered_map<string, vector<string>> hash;
  • 创建一个哈希表 hash,键为排序后的字符串,值为一个字符串向量,存储与该排序字符串相对应的原字符串列表。

3. 将字母异位词分组
for (auto& s : strs) {string tmp = s;sort(tmp.begin(), tmp.end());hash[tmp].push_back(s);
}
  • 遍历输入的字符串数组 strs

    • 对于每个字符串 s,创建一个临时字符串 tmp 并对其进行排序。排序后的字符串作为键,所有与该键对应的异位词存储在哈希表中。

    • 使用 hash[tmp].push_back(s) 将原字符串 s 加入哈希表中对应的向量。

4. 提取结果
vector<vector<string>> ret;
for (auto& [x, y] : hash) {ret.push_back(y);
}
  • 创建一个二维向量 ret 用于存储最终的结果。

  • 遍历哈希表,提取每个键 x 及其对应的值 y(即异位词组),并将每个值添加到结果向量 ret 中。

5. 返回结果
return ret;
  • 返回包含所有字母异位词组的二维向量 ret

整体思路总结

  1. 初始化: 创建一个哈希表 hash 用于存储经过排序的字符串及其对应的原字符串,它将用于分组异位词。

  2. 遍历输入字符串: 对于每个字符串,将其字母排序,使用排序后的字符串作为键,将原字符串存储到对应的值(向量)中。

  3. 提取结果: 从哈希表中提取所有的异位词组并存储到结果向量中。

  4. 返回结果: 返回分组后的异位词。

时间与空间复杂度

  • 时间复杂度: O(N * K log K),其中 ( N ) 是字符串数组的长度,( K ) 是字符串的平均长度。对于每个字符串,排序的时间复杂度是 O(K log K),因此整体复杂度为 O(N * K log K)。

  • 空间复杂度: O(N * K),存储所有输入字符串的哈希表和结果向量占用的空间,最坏情况下需要存储所有字符串。

举例说明

假设输入字符串数组为 strs = ["eat", "tea", "tan", "ate", "nat", "bat"]

  1. 初始化哈希表hash 为 {}

  2. 遍历并分组:

    • 对于字符串 "eat",排序后为 "aet",哈希表更新为 { "aet": ["eat"] }

    • "tea" 排序后仍为 "aet",哈希表更新为 { "aet": ["eat", "tea"] }

    • "tan" 排序后为 "ant",哈希表更新为 { "aet": ["eat", "tea"], "ant": ["tan"] }

    • "ate" 排序后为 "aet",哈希表更新为 { "aet": ["eat", "tea", "ate"], "ant": ["tan"] }

    • "nat" 排序后为 "ant",哈希表更新为 { "aet": ["eat", "tea", "ate"], "ant": ["tan", "nat"] }

    • "bat" 排序后为 "abt",哈希表更新为 { "aet": ["eat", "tea", "ate"], "ant": ["tan", "nat"], "abt": ["bat"] }

  3. 提取结果: 从哈希表提取组,结果为:

    • ret 变为 [["eat", "tea", "ate"], ["tan", "nat"], ["bat"]]

  4. 返回结果:

    • 返回结果数组 ret

相关文章:

哈希表(典型算法思想)—— OJ例题算法解析思路

目录 一、1. 两数之和 - 力扣&#xff08;LeetCode&#xff09; 算法代码&#xff1a; 1. 问题描述 2. 核心思路 3. 代码实现思路 &#xff08;1&#xff09;初始化哈希表 &#xff08;2&#xff09;遍历数组 &#xff08;3&#xff09;返回结果 4. 时间复杂度分析 …...

Linux软件编程——标准IO(2025.2.14)

目录 一、操作系统 1.重点内容 2.学习方法 二、文件操作 1. 必要性 2. Linux文件类型 3. Linux文件操作方法 4.文件操作思想 5.标准IO 6.函数接口 &#xff08;1&#xff09;fopen打开文件 &#xff08;2&#xff09;fputc字符写入文件 &#xff08;3&#x…...

YOLOV8的学习记录(二) yolo8的几个内置模型简介

YOLOv8 是一个多功能的计算机视觉框架&#xff0c;支持多种任务&#xff0c;包括分类&#xff08;Classify&#xff09;、检测&#xff08;Detect&#xff09;、旋转目标检测&#xff08;OBB&#xff09;、姿态估计&#xff08;Pose&#xff09;、实例分割&#xff08;Segment&…...

初阶c语言(练习题,猜随机数,关机程序)

目录 第一题&#xff0c;使用函数编写一个随机数&#xff0c;然后自己猜&#xff0c;猜随机数 第二道题&#xff08;关机程序&#xff09; 实现代码&#xff08;关机程序&#xff09; 实现代码&#xff08;猜数字&#xff09; 前言&#xff1a; 学习c语言&#xff0c;学习…...

中上211硕对嵌入式AI感兴趣,如何有效规划学习路径?

今天给大家分享的是一位粉丝的提问&#xff0c;中上211硕对嵌入式AI感兴趣&#xff0c;如何有效规划学习路径&#xff1f; 接下来把粉丝的具体提问和我的回复分享给大家&#xff0c;希望也能给一些类似情况的小伙伴一些启发和帮助。 同学提问&#xff1a; 中上211&#xff0c;…...

如何在wps中使用AI

1、访问官网&#xff1a;https://ai.wps.cn 2、 下载WPS AI客户端 3、本地安装&#xff0c; 安装时需要关闭wps 安装完成后打开wps&#xff0c;菜单中新增OfficeAI 点击【设置】按钮&#xff0c;弹出如下窗口 选择【大模型设置】中 模型平台选择&#xff08;硅基流程&#xf…...

单例设计模式

简介 单例模式是设计模式中的创建型设计模式&#xff0c;用来保证一个类只能创建一个对象&#xff0c;通常包括饿汉式单例、懒汉式单例。 一、饿汉式单例 饿汉式单例是在类加载时就进行创建的&#xff0c;如&#xff1a; public class Apple {// 由于是单例&#xff0c;因…...

离线量化算法和工具 --学习记录1

离线量化算法和工具 一、离线量化的基础概念1.1、基本流程1.2、量化的优点和缺点1.3、如何生产一个硬件能跑的量化模型1.4、PTQ的概念以及和QAT的区别1.5、离线量化的标准流程1.6、校准数据的选择1.7、量化模式的选择1.8、校准方式的选择1.9、量化算法的选择1.10、写入量化参数…...

Redis 03章——10大数据类型概述

一、which10 &#xff08;1&#xff09;一图 &#xff08;2&#xff09;提前声明 这里说的数据类型是value的数据类型&#xff0c;key的类型都是字符串 官网&#xff1a;Understand Redis data types | Docs &#xff08;3&#xff09;分别是 1.3.1redis字符串&#xff0…...

芯麦GC6208:革新摄像机与医疗设备的智能音频解决方案

引言 在现代科技的推动下&#xff0c;音频设备和图像处理在各个领域的应用日益广泛。芯麦科技的GC6208是一款创新的音频处理芯片&#xff0c;具有高性能和多功能性&#xff0c;适用于摄像机、医疗设备等多种产品。本文将探讨GC6208在这些领域中的应用及其带来的优势。 1. 在摄…...

代码随想录算法营Day39 | 416. 分割等和子集

416. 分割等和子集 这题换句话说就是是否能找出一个子集&#xff0c;使这个子集的总和等于数组总和的一半&#xff0c;数组里每个元素只能选一次。我们确立一个dp数组&#xff0c;长度为数组总和的half1&#xff0c;内容为False。索引表示和&#xff0c;索引里的内容表示该数是…...

【前端】自己从头实现一个gpt聊天页面

预览 最小化功能点 主界面&#xff1a;侧边栏会话历史、聊天窗口发送和断开。侧边栏&#xff1a;展示会话列表&#xff0c;每个会话包含多条聊天记录&#xff0c; 通过localstorage本地储存和恢复&#xff0c;会话需要重命名和删除。聊天框&#xff1a;区分一下发送者和回答者…...

浅说树形dp

文章目录 前言树形dp的转移方式树形dp的使用的场景小结 初步感知——简单的树形dp例题1例题2 深入分析——树形dp的经典模型最大独立集最小点覆盖最小支配集树上直径 前言 因为树的形式非常适合递归&#xff0c;他所带来的访问顺序也是非常符合拓扑排序的&#xff0c;故而在处…...

Matlab 多项式曲线拟合(三维)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 对于高维空间曲线的拟合,参数化是一种非常好的方式,可以让我们很容易得到我们想要的目标曲线。 假设给定一组数据点 ( u i ​ , x i ​ ) 、 ( u i ​...

大语言模型推理中的显存优化 有哪些

大语言模型推理中的显存优化 有哪些 目录 大语言模型推理中的显存优化 有哪些显存优化背景Offloading/Checkpoint原理举例显存优化背景 在大语言模型推理时,显存是显著瓶颈。以开源的BLOOM 176B模型为例,在8张A100计算卡上,通常对话设置下仅能进行批量为10左右的推理。为缓…...

机器学习:k均值

所有代码和文档均在golitter/Decoding-ML-Top10: 使用 Python 优雅地实现机器学习十大经典算法。 (github.com)&#xff0c;欢迎查看。 在“无监督学习”中&#xff0c;训练样本的标记信息是未知的&#xff0c;目标是通过对无标记训练样本的学习来揭示数据的内在性质及规律&…...

【图像加密解密】空间混沌序列的图像加密解密算法复现(含相关性检验)【Matlab完整源码 2期】

1、说明 本文给出详细完整代码、完整的实验报告和PPT。 环境&#xff1a;MATLAB2019a 复现文献&#xff1a;[1]孙福艳,吕宗旺.Digital image encryption with chaotic map lattices[J].Chinese Physics B,2011,20(04):136-142. 2、部分报告内容 3 部分源码与运行步骤 3.1 部…...

Unity学习part3

此为b站视频【【Unity教程】零基础带你从小白到超神】 https://www.bilibili.com/video/BV1gQ4y1e7SS/?p55&share_sourcecopy_web&vd_source6e7a3cbb802eb986578ad26fae1eeaab的笔记 1、反向动力学 打开ik处理 public class PlayerMoveController : MonoBehaviour {…...

【2025最新版】软件测试面试题总结(150道题含答案解析)

接口测试面试题 1&#xff1a;你平常做接口测试的过程中发现过哪些 bug? 2&#xff1a;平常你是怎么测试接口的&#xff1f; 3&#xff1a;平常用什么工具测接口? 4: webService 接口是如何测试的? 5&#xff1a;没有接口文档&#xff0c;如何做接口测试&#xff1f; 6&…...

双轴伺服电机驱动控制器AGV、AMR专用双伺服电机驱动控制器解决方案

工业机器人数控机床XY机械手双轴机器人堆垛机专用双轴伺服电机驱动控制器48V 14ARMS带有STO功能&#xff0c;隔离高压CAN/RS485/USB通讯支持编码器和霍尔输入 双伺服电机驱动控制器TMCM2611功能介绍 集成2个伺服电机的控制和驱动于一体供电电压48V&#xff0c;驱动电流14A RM…...

知识图谱数据库 Neo4j in Docker笔记

下载 docker pull neo4j:community官方说明 https://neo4j.com/docs/operations-manual/2025.01/docker/introduction/ 启动 docker run \--restart always \--publish7474:7474 --publish7687:7687 \--env NEO4J_AUTHneo4j/your_password \--volumeD:\files\knowledgegrap…...

Kubernetes实战教程:基于Vue前端与Java后端的应用部署

在云原生时代&#xff0c;Kubernetes 已成为管理容器化应用的核心平台。本文不仅详细介绍了 Kubernetes 的背景、架构和核心特性&#xff0c;还将通过一个具体的案例——基于 Vue 前端和 Java 后端的应用部署&#xff0c;带你一步步了解如何在 Kubernetes 集群中构建和运行一个…...

完全数和质数算法详解

完全数是指一个正整数&#xff0c;它等于其所有真约数&#xff08;即除了自身以外的所有正因数&#xff09;之和。例如&#xff0c;6 是一个完全数&#xff0c;因为它的真约数是 1、2 和 3&#xff0c;且 1 2 3 6。 1 计算约数和 1.1 遍历 遍历其所有可能的约数并计算它们…...

PHP本地商家卡券管理系统

本地商家卡券管理系统 —— 引领智慧消费新时代 本地商家卡券管理系统&#xff0c;是基于ThinkPHPUni-appuView尖端技术匠心打造的一款微信小程序&#xff0c;它彻底颠覆了传统优惠方式&#xff0c;开创了多商家联合发行优惠卡、折扣券的全新模式&#xff0c;发卡类型灵活多变…...

使用动态规划解决 0/1 背包问题

1. 背景 背包问题是计算机科学和优化领域中的经典问题之一,它被广泛应用于资源分配、任务调度等问题。在最简单的形式下,0/1背包问题描述的是: 你有一个背包,能够容纳一定的重量,而你有若干个物品,每个物品都有一个重量和价值,问你应该如何选择物品,使得在不超过背包…...

探索Java中的集合类_特性与使用场景

1. 引言 1.1 Java集合框架概述 Java集合框架(Java Collections Framework, JCF)是Java中用于存储和操作一组对象的类和接口的统称。它提供了多种数据结构来满足不同的需求,如列表、集合、映射等。JCF的核心接口包括Collection、List、Set、Queue和Map,以及它们的各种实现…...

动态DNS神器nip.io使用指南:快速实现域名与IP的动态映射--告别配置本地hosts

动态DNS神器nip.io使用指南&#xff1a;快速实现域名与IP的动态映射--告别配置本地hosts 一、项目简介二、快速入门三、进阶配置四、典型应用场景 本文基于开源项目 v1.2.1版本撰写&#xff0c;适用于开发测试、CI/CD等场景 一、项目简介 nip.io 是由Exentrique Solutions开发…...

Obsidian及Zotero常用的插件

Obsidian插件 Minimal Theme Settings&#xff08;Life&#xff0c;zotero&#xff09;【必需】 界面样式设置所需插件 Style Settings&#xff08;Life&#xff0c;zotero&#xff09;【必需】界面样式设置所需插件 Recent Files&#xff08;Life&#xff0c;zotero&#xf…...

自学Java-面向对象高级(final、单例类、枚举类、抽象类、接口)

自学Java-面向对象高级&#xff08;final、单例类、枚举类、抽象类、接口&#xff09; 一、final关键字1、认识final关键字2、final修饰变量的注意3、常量 二、单例类&#xff08;设计模式&#xff09;1、设计模式的概念2、单例设计模式3、单例类有很多形式4、懒汉式单例类5、小…...

数据结构与算法之排序算法-归并排序

排序算法是数据结构与算法中最基本的算法之一&#xff0c;其作用就是将一些可以比较大小的数据进行有规律的排序&#xff0c;而想要实现这种排序就拥有很多种方法~ 那么我将通过几篇文章&#xff0c;将排序算法中各种算法细化的&#xff0c;详尽的为大家呈现出来&#xff1a; …...

Springboot整合ES

添加依赖 在 pom.xml 中添加以下依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency>配置 Elasticsearch 在 application.proper…...

文件夹上传到github分支最后github上面还是没有文件和文件夹

环境&#xff1a; github 问题描述&#xff1a; 文件夹上传到github分支最后github上面还是没有文件和文件夹, 和这样一样 解决方案&#xff1a; 从 git ls-tree -r HEAD 的输出中可以看到&#xff0c;metahuman-stream 文件夹显示为如下内容&#xff1a; 160000 commi…...

生成式聊天机器人 -- 基于Transformer实现的SeqToSeq模型 -- 上

生成式聊天机器人 -- 基于Transformer实现的SeqToSeq模型 -- 上 引言数据预处理下载并处理数据数据加载 Transformer模型嵌入层&位置编码层多头注意力机制EncoderLayerDecoderLayerPoint-wise Feed Forward NetworkTransformer 引言 在此之前&#xff0c;我们已经了解了如…...

【Java 面试 八股文】Spring Cloud 篇

Spring Cloud 篇 1. Spring Cloud 5大组件有哪些&#xff1f;2. 服务注册和发现是什么意思&#xff1f;Spring Cloud 如何实现服务注册发现&#xff1f;3. 我看你之前也用过nacos&#xff0c;你能说下nacos与eureka的区别&#xff1f;4. 你们项目负载均衡如何实现的&#xff1f…...

CAS单点登录(第7版)10.多因素身份验证

如有疑问&#xff0c;请看视频&#xff1a;CAS单点登录&#xff08;第7版&#xff09; 多因素身份验证 概述 多因素身份验证 &#xff08;MFA&#xff09; 多因素身份验证&#xff08;Multifactor Authentication MFA&#xff09;是一种安全机制&#xff0c;要求用户提供两种…...

【16】思科AireOS:创建使用 LWA 认证的 WLAN

1. 概述 LWA(Local Web Authentication)是一种基于 Web 认证的方式,允许无线客户端在连接 WLAN 后,使用 Web 认证页面进行身份验证。该方法适用于访客网络或需要身份认证的场景。 本指南详细介绍如何在 Cisco AireOS 无线控制器(WLC)上配置 LWA 认证的 WLAN,并确保认证…...

webassembly009 transformers.js 网页端侧推理 whisper-web

whisper-web https://github.com/xenova/whisper-web 页面结构 AudioManager: 该组件负责音频的录制和处理。它会使用 Web API 来访问麦克风&#xff0c;录制音频数据&#xff0c;并将其传递给 transcriber 进行转录。它通过 transcriber 管理转录状态&#xff0c;音频数据将…...

vscode使用常见问题处理合集

目录 一、使用vite创建的vue3项目&#xff0c;script和style首行代码不会缩进,且格式化属性字段等会换行问题 首行缩进情况如下&#xff1a; 属性、参数格式化换行情况如下&#xff1a; 解决方式&#xff1a; 一、使用vite创建的vue3项目&#xff0c;script和style首行代码不…...

EasyExcel提取excel文档

目录 一、前言二、提取excel文档2.1、所有sheet----获取得到headerList和总行数2.2、所有sheet----获取合并单元格信息2.3、读取某个sheet的每行数据一、前言 EasyExcel 是阿里巴巴开源的一个高性能 Excel 读写库,相比于 Apache POI 和 JXL,它有明显的优势,特别是在处理大数…...

DeepSeek v3 技术报告阅读笔记

注 本文参考 DeepSeek-v3 / v2 / v1 Technical Report 及相关参考模型论文本文不包括基础的知识点讲解&#xff0c;为笔记/大纲性质而非教程&#xff0c;建议阅读技术报告原文交流可发送至邮箱 henryhua0721foxmail.com 架构核心 核心&#xff1a; MLA 高效推理DeepSeekMOE 更…...

Python爬虫-猫眼电影的影院数据

前言 本文是该专栏的第46篇,后面会持续分享python爬虫干货知识,记得关注。 本文笔者以猫眼电影为例子,获取猫眼的影院相关数据。 废话不多说,具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。接下来,跟着笔者直接往下看正文详细内容。(附带完整代码) …...

每天五分钟深度学习框架pytorch:搭建谷歌的Inception网络模块

本文重点 前面我们学习了VGG,从现在开始我们将学习谷歌公司推出的GoogLeNet。当年ImageNet竞赛的第二名是VGG,而第一名就是GoogLeNet,它的模型设计拥有很多的技巧,这个model证明了一件事:用更多的卷积,更深的层次可以得到更好的结构 GoogLeNet的网络结构 如图所示就是Go…...

export default与export区别

1.定义&#xff1a; export default‌&#xff1a;用于导出模块中的默认成员。一个模块中只能有一个export default&#xff0c;通常用于导出模块的主要功能或对象。导入时可以使用任意名称&#xff0c;因为它没有具体的名称‌ ‌export‌&#xff1a;用于导出模块中的多个成…...

当Ollama遇上划词翻译:我的Windows本地AI服务搭建日记

&#x1f680; 实现Windows本地大模型翻译服务 - 基于OllamaFlask的划词翻译实践 &#x1f6e0;️ 步骤概要1️⃣ python 环境准备2️⃣ Ollama 安装3️⃣ 一个 Flask 服务4️⃣ Windows 服务化封装5️⃣ 测试本地接口6️⃣ 配置划词翻译自定义翻译源7️⃣ 效果展示8️⃣ debug…...

5G与物联网的协同发展:打造智能城市的未来

引言 随着科技的不断进步&#xff0c;智能城市的概念已经不再是科幻小说中的幻想&#xff0c;它正在逐步走进我们的生活。而这背后的两大驱动力无疑是 5G和 物联网&#xff08;IoT&#xff09;。5G网络以其高速率、低延迟、大容量的优势&#xff0c;与物联网的强大连接能力相结…...

并发编程---synchronized关键字,以及synchronized同步锁

文章目录 Synchronized 的使用synchronized 在普通方法上的使用&#xff08;对象锁&#xff09;synchronized 在静态方法上的使用&#xff08;类锁&#xff09;synchronized 在代码块上的使用 JVM 中锁的优化锁的类型自旋锁与自适应自旋锁自旋锁&#xff08;Spin Lock&#xff…...

Vue学习笔记5(Vue3)

Vue3学习笔记 一、create-vue搭建vue3项目 create-vue是vue官方新的脚手架工具&#xff0c;底层切换到了vite 步骤&#xff1a; 查看环境条件 node -v版本需要在16.0及以上创建一个vue应用 npm init vuelatest 这一指令会安装并执行create-vue 二、项目目录和关键文件 in…...

VoIP之音视频会议中的混音技术

在VoIP音视频会议中&#xff0c;需要将多路参会方音频流混合成一路音频流再发送给各参会方&#xff0c;以达到参会方可以听到每个与会人声音的目的&#xff0c;这种技术叫混音。 一、混音基础原理 在实际生活中&#xff0c;我们所处的生活和工作环境就是一个自然的混音场&…...

Baklib一站式云平台:全场景赋能企业知识资产激活

内容概要 在数字化浪潮推动下&#xff0c;企业知识资产的高效管理与价值释放成为核心议题。Baklib作为一站式云平台&#xff0c;以全场景赋能为核心定位&#xff0c;通过构建知识中台架构&#xff0c;为企业提供从资源整合到应用落地的闭环解决方案。该平台不仅支持文本、图像…...

基于nuScenes数据集和DeepSeek模型的端到端自动驾驶解决方案

结合DeepSeek模型进行知识蒸馏&#xff0c;以提高模型性能。这需要将nuScenes中的多模态数据&#xff08;如摄像头图像、雷达点云、车辆状态等&#xff09;整合到模型中&#xff0c;同时使用DeepSeek的生成能力进行蒸馏。 接下来&#xff0c;我需要考虑用户可能的背景。用户可能…...