【NLP学习记录】Embedding和EmbeddingBag

news2024/11/24 19:14:37

Embedding与EmbeddingBag详解

●🍨 本文为🔗365天深度学习训练营 中的学习记录博客
●🍖 原作者:K同学啊 | 接辅导、项目定制
●🚀 文章来源:K同学的学习圈子

1、Embedding详解

Embedding是Pytorch中最基本的词嵌入操作,TensorFlow中也有相同的函数,功能是一样的。Embedding是将每个离散的词汇映射到一个低维的连续向量空间中,并且保持了词汇直接的语义关系。在Pytorch中,Embedding的输入是一个整数张量,每个整数都代表着一个词汇的索引,输出是一个浮点型的张量,每个浮点数都代表着对应词汇的词嵌入向量。

嵌入层使用随机权重初始化,并将学习数据集中的所有词嵌入。它是一个灵活的层,可以以各种方式使用,如:

  • 作为深度学习模型的一部分,其中嵌入与模型本身一起被学习。
  • 用于加载训练好的词嵌入模型
    嵌入层被定义为网络的第一个隐藏层。
    函数原型:
torch.nn.Embedding(num_embeddings, embedding_dim, padding_idx=None, max_norm=None, norm_type=2.0, scale_grad_by_freq=False, sparse=False, _weight=None, _freeze=False, device=None, dtype=None)

常用参数:

num_embeddings: #词汇表大小,最大整数index + 1
embedding_dim:  #词向量的维度

简单示例,用Embedding将两个句子转换为词嵌入向量

import torch
import torch.nn as nn

vocab_size = 12 #词汇表大小
embedding_dim  = 4 #嵌入向量的维度

#创建一个embedding层
embedding = nn.Embedding(vocab_size, embedding_dim)

#假设我们有一个包含两个单词索引的输入序列
input_sequence1 = torch.tensor([1,5,8], dtype = torch.long)
input_sequence2 = torch.tensor([2,4], dtype = torch.long)

#使用Embedding层将输入序列转换为词嵌入
embedded_sequence1 = embedding(input_sequence1)
embedded_sequence2 = embedding(input_sequence2)

print(embedded_sequence1)
print(embedded_sequence2)

输出:
在这里插入图片描述
上例中,我们定义了简单的词嵌入模型

  1. 将大小为12 的词汇表中的每个词映射到了一个4维的向量空间中。
  2. 输入了两个句子,分别是[1, 5, 8]和[2, 4],每个数字代表着词汇表中的一个词汇的索引。
  3. 将这两个句子通过Embedding转换为词嵌入向量,并输出结果。
  4. 结果中,每个句子中的每个词汇都被映射成了4维的向量。

2. EmbeddingBag详解

EmbeddingBag是在Embedding基础上进一步优化的工具。主要优化点在于:它可以直接处理不定长的句子,并可计算句子中所有词汇的词嵌入向量的均值或总和。前者可以简化使用,后者则可即时评估向量生成效果。
在Pytorch中,EmbeddingBag的输入是一个整数张量和一个偏移量张量,每个整数都代表着一个词汇的索引,偏移量则表示句子中每个词汇的位置,输出是一个浮点型的张量。每个浮点数都代表这对应句子的词嵌入向量的均值或总和。

示例:用EmbeddingBag将两个句子转换为词嵌入向量并计算它们的均值。

import torch
import torch.nn as nn

vocab_size = 12 #词汇表大小
embedding_dim = 4 #嵌入向量维度

#创建一个EmbeddingBag层
embedding_bag = nn.EmbeddingBag(vocab_size, embedding_dim, mode = 'mean')

#假设我们有两个不同长度的输入序列
input_sequence1 = torch.tensor([1, 5, 8], dtype = torch.long)
input_sequence2 = torch.tensor([2, 4], dtype = torch.long)

#将两个输入序列拼接在一起,并创建一个偏移张量
input_sequences = torch.cat([input_sequence1, input_sequence2])
offsets = torch.tensor([0,len(input_sequence1)], dtype = torch.long)

#使用EmbeddingBag层计算序列汇总(这里使用平均值)
embedded_bag = embedding_bag(input_sequences, offsets)

print(embedded_bag)

输出:
在这里插入图片描述
在该示例中,我们的模型构建步骤如下:

  1. 定义一个大小为12的词汇表,并将每个词汇映射到一个4维的向量空间中。
  2. 输入两个句子,分别为[1, 5, 8]和[2, 4],每个数字代表词汇表中的一个词汇的索引。
  3. 通过EmbeddingBag将每个句子中的每个词汇转换为词嵌入向量,并计算它们的均值。
  4. 结果表明,每个句子的词嵌入向量的均值都是一个4维的向量。

EmbeddingBag层中的mode参数用于指定如何对每个序列中的嵌入向量进行汇总。常用模式主要有3种:sum、mean、max。模式选择主要取决于具体的任务和数据集。

  • 文本分类任务中,通常使用mean模式,因为它可以捕捉到每个序列的平均嵌入,反映出序列的整体含义。
  • 序列标注任务中,通常使用sum模式,因为它可以捕捉到每个序列的所有信息,不会丢失任何关键信息。

3. 任务补充

任务要求:
加载
one-hot篇附件中的.txt文件,并使用EmbeddingBag和Embedding完成词嵌入

代码:

# ------文本处理,将句子转换为整数序列 ------
import torch
import jieba

# 确认打开的文本文件路径和文件名
file_name = "D:\Personal Data\Learning Data\DL Learning Data\Embedding.txt"

# 从文件中读取文本行,并替代预定义的Sentences
with open(file_name, "r", encoding = "utf-8") as file:
    Context     = file.read()
    Sentences   = Context.split()
    print("==== 文本分句: ====\n", Sentences)     # 打印核对结果

# 使用jieba.cut()函数逐句进行分词,结果输出为一个列表
tokenized_texts = [list(jieba.lcut(sentence)) for sentence in Sentences]
print("==== 分词结果: ====\n", tokenized_texts)   # 打印核对结果

# 构建词汇表
word_index = {}
index_word = {}
for i, word in enumerate(set([word for text in tokenized_texts for word in text])):
    word_index[word] = i
    index_word[i]    = word

print("==== 词汇表: ====\n", word_index)          # 打印核对结果

# 将文本转化为整数序列
sequences = [[word_index[word] for word in text] for text in tokenized_texts]
print("==== 文本序列: ====\n",sequences)          # 打印核对结果

# 获取词汇表大小, 并+1
vocab_size      = len(word_index) + 1

输出:

==== 文本分句: ====
 ['比较直观的编码方式是采用上面提到的字典序列。例如,对于一个有三个类别的问题,可以用1、2和3分别表示这三个类别。但是,这种编码方式存在一个问题,就是模型可能会错误地认为不同类别之间存在一些顺序或距离关系,而实际上这些关系可能是不存在的或者不具有实际意义的。', '为了避免这种问题,引入了one-hot编码(也称独热编码)。one-hot编码的基本思想是将每个类别映射到一个向量,其中只有一个元素的值为1,其余元素的值为0。这样,每个类别之间就是相互独立的,不存在顺序或距离关系。例如,对于三个类别的情况,可以使用如下的one-hot编码:']
Loading model cost 0.753 seconds.
Prefix dict has been built successfully.
==== 分词结果: ====
 [['比较', '直观', '的', '编码方式', '是', '采用', '上面', '提到', '的', '字典', '序列', '。', '例如', ',', '对于', '一个', '有', '三个', '类别', '的', '问题', ',', '可以', '用', '1', '、', '2', '和', '3', '分别', '表示', '这', '三个', '类别', '。', '但是', ',', '这种', '编码方式', '存在', '一个', '问题', ',', '就是', '模型', '可能', '会', '错误', '地', '认为', '不同', '类别', '之间', '存在', '一些', '顺序', '或', '距离', '关系', ',', '而', '实际上', '这些', '关系', '可能', '是', '不', '存在', '的', '或者', '不', '具有', '实际意义', '的', '。'], ['为了', '避免', '这种', '问题', ',', '引入', '了', 'one', '-', 'hot', '编码', '(', '也', '称', '独热', '编码', ')', '。', 'one', '-', 'hot', '编码', '的', '基本', '思想', '是', '将', '每个', '类别', '映射', '到', '一个', '向量', ',', '其中', '只有', '一个', '元素', '的', '值', '为', '1', ',', '其余', '元素', '的', '值', '为', '0', '。', '这样', ',', '每个', '类别', '之间', '就是', '相互', '独立', '的', ',', '不', '存在', '顺序', '或', '距离', '关系', '。', '例如', ',', '对于', '三个', '类别', '的', '情况', ',', '可以', '使用', '如下', '的', 'one', '-', 'hot', '编码', ':']]
==== 词汇表: ====
 {'具有': 0, '就是': 1, '元素': 2, '引入': 3, '如下': 4, '思想': 5, '但是': 6, '模型': 7, '0': 8, '、': 9, '对于': 10, '为了': 11, '独立': 12, '其余': 13, '(': 14, '提到': 15, '这样': 16, '三个': 17, '采用': 18, '其中': 19, '表示': 20, '使用': 21, '到': 22, '存在': 23, '和': 24, ',': 25, '一些': 26, '这种': 27, '有': 28, '向量': 29, '例如': 30, '字典': 31, '编码': 32, '或': 33, '会': 34, 'hot': 35, '映射': 36, '比较': 37, '3': 38, '可以': 39, '。': 40, '了': 41, '序列': 42, '将': 43, '情况': 44, '2': 45, '是': 46, '或者': 47, '上面': 48, '这': 49, '编码方式': 50, '用': 51, '避免': 52, '实际意义': 53, '直观': 54, ')': 55, '实际上': 56, '值': 57, '这些': 58, '-': 59, '分别': 60, '而': 61, '相互': 62, '之间': 63, '也': 64, '只有': 65, 'one': 66, '认为': 67, '1': 68, '距离': 69, '问题': 70, '一个': 71, '可能': 72, '独热': 73, '称': 74, '类别': 75, '的': 76, '顺序': 77, '基本': 78, '不同': 79, '关系': 80, ':': 81, '地': 82, '错误': 83, '每个': 84, '不': 85, '为': 86}
==== 文本序列: ====
 [[37, 54, 76, 50, 46, 18, 48, 15, 76, 31, 42, 40, 30, 25, 10, 71, 28, 17, 75, 76, 70, 25, 39, 51, 68, 9, 45, 24, 38, 60, 20, 49, 17, 75, 40, 6, 25, 27, 50, 23, 71, 70, 25, 1, 7, 72, 34, 83, 82, 67, 79, 75, 63, 23, 26, 77, 33, 69, 80, 25, 61, 56, 58, 80, 72, 46, 85, 23, 76, 47, 85, 0, 53, 76, 40], [11, 52, 27, 70, 25, 3, 41, 66, 59, 35, 32, 14, 64, 74, 73, 32, 55, 40, 66, 59, 35, 32, 76, 78, 5, 46, 43, 84, 75, 36, 22, 71, 29, 25, 19, 65, 71, 2, 76, 57, 86, 68, 25, 13, 2, 76, 57, 86, 8, 40, 16, 25, 84, 75, 63, 1, 62, 12, 76, 25, 85, 23, 77, 33, 69, 80, 40, 30, 25, 10, 17, 75, 76, 44, 25, 39, 21, 4, 76, 66, 59, 35, 32, 81]]

使用EmbeddingBag进行词嵌入:

# 创建一个EmbeddingBag层
embedding_dim   = 100               # 定义嵌入向量的维度
embedding_bag   = torch.nn.EmbeddingBag(vocab_size, embedding_dim, mode = "mean")

# 将多个输入序列拼接在一起,并创建一个偏移量张量
# 首先需要创建空张量和空列表
input   = torch.tensor([], dtype = torch.long)
offset  = []
# 逐句处理,进行张量拼接、向列表中添加偏移量数值
for sequence in sequences:
    offset.append(len(input))
    input   = torch.cat([input, torch.tensor(sequence, dtype= torch.long)])

# 将列表形式的偏移量转换为张量形式,用于embedding_bag()函数的输入
offset = torch.tensor(offset, dtype = torch.long)

# 检查序列张量拼接和索引生成结果
print("-"*80)    
print(offset)
print(input)
print("-"*80)

# 使用Embedding层将输入序列转换为词嵌入
embedded_bag = embedding_bag(input, offset)

# 打印输出结果
print("词嵌入结果: \n", embedded_bag)

输出:

tensor([ 0, 75])
tensor([37, 54, 76, 50, 46, 18, 48, 15, 76, 31, 42, 40, 30, 25, 10, 71, 28, 17,
        75, 76, 70, 25, 39, 51, 68,  9, 45, 24, 38, 60, 20, 49, 17, 75, 40,  6,
        25, 27, 50, 23, 71, 70, 25,  1,  7, 72, 34, 83, 82, 67, 79, 75, 63, 23,
        26, 77, 33, 69, 80, 25, 61, 56, 58, 80, 72, 46, 85, 23, 76, 47, 85,  0,
        53, 76, 40, 11, 52, 27, 70, 25,  3, 41, 66, 59, 35, 32, 14, 64, 74, 73,
        32, 55, 40, 66, 59, 35, 32, 76, 78,  5, 46, 43, 84, 75, 36, 22, 71, 29,
        25, 19, 65, 71,  2, 76, 57, 86, 68, 25, 13,  2, 76, 57, 86,  8, 40, 16,
        25, 84, 75, 63,  1, 62, 12, 76, 25, 85, 23, 77, 33, 69, 80, 40, 30, 25,
        10, 17, 75, 76, 44, 25, 39, 21,  4, 76, 66, 59, 35, 32, 81])
--------------------------------------------------------------------------------
词嵌入结果: 
 tensor([[ 5.5692e-02, -7.1316e-02, -6.6372e-02, -1.6054e-02, -1.5890e-02,
          9.3022e-03, -4.8811e-02, -4.7034e-02, -8.3843e-03, -1.9857e-02,
          1.1352e-02,  1.4714e-01,  1.2782e-01,  1.2540e-01,  2.2769e-01,
         -2.1690e-01,  1.2728e-02, -1.9718e-01,  4.8604e-02, -8.8129e-02,
          1.4818e-01, -3.2952e-01, -3.2805e-02, -1.6356e-01,  1.1112e-01,
         -1.0095e-01, -5.1578e-02, -1.1523e-01,  3.2936e-01, -3.6964e-01,
         -8.3445e-02, -6.9567e-02,  1.1665e-01,  1.6558e-01,  2.6067e-01,
         -1.4318e-01,  6.1249e-02, -3.4959e-02, -4.9525e-02,  5.4743e-02,
         -3.6878e-02,  6.7813e-02,  7.3439e-02, -6.0280e-03,  7.6804e-02,
          3.0789e-02,  1.6987e-01, -6.2407e-02,  8.7294e-02,  1.1892e-01,
         -1.7377e-01, -2.3485e-04,  4.0972e-02,  1.6278e-02,  1.0198e-01,
         -1.4946e-01, -2.4754e-01, -1.2399e-01,  4.3227e-02,  4.9916e-02,
         -2.0984e-01,  1.5504e-01, -1.7622e-01,  1.1868e-01,  1.7071e-01,
         -2.5039e-02,  1.0324e-01, -1.2662e-02,  2.5191e-01,  8.0460e-02,
          7.6614e-02, -2.7530e-01,  6.2472e-02,  1.6579e-01,  8.8133e-02,
          1.3551e-01, -2.7536e-01,  3.3397e-02, -1.5716e-01, -2.0973e-01,
         -1.2795e-01, -2.1313e-01, -2.1758e-02,  1.2416e-01,  1.7992e-01,
         -3.7501e-01, -4.4248e-02,  1.2105e-01, -3.8175e-02,  2.2732e-01,
         -6.5679e-02,  8.8733e-02, -1.3111e-01,  5.4078e-02,  4.8781e-03,
          2.1772e-01,  1.9874e-01,  2.0958e-03, -9.0118e-02, -2.5515e-01],
        [ 1.3323e-01,  3.4331e-02, -8.2839e-02,  1.2361e-01, -2.8169e-01,
         -4.4598e-02, -3.2946e-02, -1.4866e-01,  1.6180e-01, -2.7819e-01,
         -6.4126e-02, -4.7323e-02,  1.3915e-02,  1.6032e-01,  1.3364e-01,
         -7.4780e-02, -1.5139e-01, -3.3980e-01,  1.9030e-01,  1.9205e-02,
          2.0883e-01, -2.5076e-01, -5.6575e-02,  6.3742e-02,  1.1623e-01,
          4.9935e-03,  1.2527e-01, -4.2433e-01,  7.7243e-02, -1.4197e-01,
         -6.0625e-02, -1.9400e-01,  2.1380e-02,  9.1898e-02,  2.0745e-01,
         -3.2166e-01,  6.8514e-02, -1.3532e-02, -1.5256e-01,  5.6108e-02,
         -1.3043e-01,  4.6693e-02,  4.1241e-02,  2.1686e-01,  2.1685e-01,
          1.0330e-01,  1.9492e-01,  4.1955e-02,  1.1217e-01,  2.3970e-01,
         -8.2919e-02, -2.8210e-01,  1.9147e-01, -4.3560e-02, -3.4606e-01,
          6.1696e-02, -2.7092e-01, -2.3062e-01,  4.1380e-02,  1.0824e-01,
         -2.8622e-01,  3.2143e-03, -1.1270e-01,  4.5128e-02,  1.0355e-01,
          9.4424e-03, -1.0250e-02, -3.4805e-01,  2.8352e-01,  1.2028e-01,
         -4.0606e-02, -6.6366e-02,  8.5532e-02,  3.8679e-01,  2.7721e-01,
          2.1182e-01, -3.1888e-01, -5.2964e-02,  7.4347e-03, -4.4626e-02,
         -5.2423e-02, -2.4242e-01,  3.4623e-02, -1.0850e-01,  6.3444e-02,
         -1.3703e-01,  1.8642e-01,  1.6533e-01, -1.4030e-01,  1.9591e-01,
         -3.6116e-02,  2.3281e-01, -8.3522e-03,  1.1427e-01, -4.5963e-03,
          1.5077e-01, -2.7178e-02, -3.9486e-02, -1.0071e-01, -1.1353e-01]],
       grad_fn=<EmbeddingBagBackward0>)

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

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

相关文章

Spring实例化Bean的三种方式

参考资料&#xff1a; Core Technologies 核心技术 spring实例化bean的三种方式 构造器来实例化bean 静态工厂方法实例化bean 非静态工厂方法实例化bean_spring中有参构造器实例化-CSDN博客 1. 构造函数 1.1. 空参构造函数 下面这样表示调用空参构造函数&#xff0c;使用p…

Mysql数据库函数【Mysql】

Mysql数据库函数【Mysql】 前言版权Mysql数据库函数常用函数排序与分页排序分页 单行函数2.数值函数2.1基本函数2.2角度与弧度2.3三角函数2.4指数与对数函数2.5进制间的转换 3.字符串函数4.日期和时间函数4.1获取日期、时间4.2日期与时间戳的转换4.3获取月份、星期、星期数、天…

C语言数据流讲解

目录 4.1 流&#xff08;Stream&#xff09;&#xff1a;数据流动的隐喻 4.1.1 流&#xff1a;数据传输的通用接口 4.1.2 标准流&#xff1a;预定义的流通道 4.2 文件指针&#xff1a;流操作的桥梁 4.2.1 文件指针的本质与结构 4.2.2 使用文件指针操作流 图解 结语 在C…

AI研报:从Sora看多模态大模型发展

《从Sora看多模态大模型发展》的研报来自浙商证券&#xff0c;写于2024年2月。 这篇报告主要探讨了多模态大模型的发展趋势&#xff0c;特别是OpenAI发布的视频生成模型Sora&#xff0c;以及其对行业发展的影响。以下是报告的核心内容概述&#xff1a; Sora模型的发布&#x…

错误 C2872 “byte”: 不明确的符号,在rpcndr.h或者objidl.h

主要问题出在这里面 #include “objbase.h” qtcreator 5.12 可以直接运行 vsqt2022 msvs2017就要报错 错误 C2872 “byte”: 不明确的符号 E:\GGtie\out\build\x64-debug\GGtie C:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\um\objidl.h 13832 解决方法…

网络七层模型之物理层:理解网络通信的架构(一)

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

C++new与delete函数

CSDN成就一亿技术人 目录 C/C内存分布&#xff1a; 一.C内存管理方式 1.new/delete操作内置类型 2.new和delete操作自定义类型 二.operato new与operator delete函数 1.operator new与operator delete函数 三.new和delete的实现原理 1.内置类型 2.自定义类型 四…

openssl 升级1.1.1.1k 到 3.0.13

下载 https://www.openssl.org/source/ tar -zxvf openssl-3.0.13.tar.gzcd openssl-3.0.13/./config enable-fips --prefix/usr/local --openssldir/usr/local/opensslmake && make install 将原有openssl备份 mv /usr/bin/openssl /usr/bin/openssl.bak mv /usr/i…

基于springboot实现房产销售系统项目【项目源码+论文说明】

基于springboot实现房产销售系统演示 摘要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于房产销售系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了房产销售系统…

水工电缆线施工注意事项及检验要求

水工电缆线施工是一个涉及多个环节的复杂过程&#xff0c;对施工质量、严密度、工作效率的要求都较为严格。以下是一些关键的注意事项及检验要求&#xff1a; 注意事项&#xff1a; 电缆敷设时&#xff0c;应从盘的上端引出&#xff0c;避免在支架上及地面摩擦拖拉&#xff0c;…

虚拟 DOM 的优缺点有哪些

虚拟DOM&#xff08;Virtual DOM&#xff09;技术作为现代前端开发中的重要组成部分&#xff0c;已经成为了众多流行前端框架的核心特性。它的引入为前端开发带来了诸多优势&#xff0c;同时也需要我们认真思考其潜在的考量。下面简单的介绍一下虚拟DOM技术的优势与缺点&#x…

ASR-LLM-TTS 大模型对话实现案例;语音识别、大模型对话、声音生成

参考:https://blog.csdn.net/weixin_42357472/article/details/136305123(llm+tts) https://blog.csdn.net/weixin_42357472/article/details/136411769 (asr+vad) 这里LLM用的是chatglm;电脑声音播报用的playsound 代码: ##运行 python main.pymain.py from multipro…

npm ERR! cb() never called!(已解决)

从仓库拉下来的代码&#xff0c;用npm install时报错 试了很多种方法&#xff0c;结果发现有一种可能是你的node版本过低导致的&#xff0c;可以升级node版本试一下。 node版本升级后&#xff0c;把上一次npm install错误的node_modules删除&#xff0c;重新npm install。

线上问题排查实例分析|Redis使用不同编码引发的问题

前言 某个周末的晚上突然收到一波耗时上升报警&#xff0c;仔细一看报警消息&#xff0c;原来是出现了慢查请求导致集群耗时大幅上升&#xff0c;此时业务同学也收到上游服务受影响报警。在处理问题过程中&#xff0c;运维同学发现 Redis 集群中只有部分实例出现 cpu 利用率上…

【Rust】——提取函数消除重复代码和泛型

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

手机和键盘的数字键盘排序为什么是不同的?

不知道你有没有注意有一个问题。我们的手机输入法中的数字键盘&#xff0c;电脑上通用的数字键盘&#xff0c;计算器上的数字键盘等排序是不同的&#xff0c;从观察者角度看&#xff0c;0-9的数字排列有从上到下的排列&#xff0c;还有从下到上的排列。为什么会出现不同的排列方…

哈希冲突解决的几种方式

目录 哈希冲突 哈希冲突-避免方式1-哈希函数的设计 1. 直接定制法--(常用) 2. 除留余数法--(常用) 3. 平方取中法--(了解) 哈希冲突-避免方式2-负载因子调节 哈希冲突-解决方式1-闭散列 1.线性探测 2.二次探测 哈希冲突-解决方式2-开散列(哈希桶) 哈希冲突 在上文中…

编程语言那么多,为什么说C++无可替代?

C语言之所以没有被替代正是因为它自身的独特优势&#xff0c;尤其是在某些领域发挥着重要的作用。 先来说说C语言的优势: 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「C的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后…

el-form表单怎么一次验证两个el-form-item

项目场景&#xff1a; 在项目中有【设置密码】以及【确认密码】输入&#xff0c;希望在两者一致的时候&#xff0c;两个框的错误提示都消失。 问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; 重现步骤&#xff1a; 1、第一个密码框 输入密码123456lyy2、确…

HashMap集合 --java学习笔记

HashMap集合 HashMap(由键决定特点):无序、不重复、无索引 (用的最多) HashMap的底层原理 HashMap跟Hashset的底层原理是一一样的&#xff0c;都是基于哈希表实现的Hashset&#xff1a;Set系列集合&#xff1a;Hashset、LinkedHashset、TreeSet --java学习笔记-CSDN博客实际…