- 博客(140)
- 问答 (1)
- 收藏
- 关注
原创 条件变量,锁,共享数据的关系
条件变量、共享数据和锁之间的三方耦合关系源于多线程环境下对资源访问的同步需求。以下是关键点分析:条件变量中通常会对共享数据进行判断和处理,如果不加锁就会出现数据竞争的问题,所以并不是条件变量要跟锁一起使用,而是上锁为了保护共享数据,共享数据恰好在条件变量中,因此才会造成,条件变量,共享数据,锁的三方耦合。
2025-03-21 22:02:18
386
原创 c++多线程条件变量
只有在锁的保护下,条件变量才能正确地工作,并保证线程之间的数据可见性。如果消费者线程在检查队列是否为空的时候不使用锁保护,生产者线程可能会在消费者线程检查的中间过程插入数据,导致检查结果不准确。条件变量用于线程之间的通信和同步,当线程等待某个条件时,必须确保该条件的状态是被保护起来的。如果没有锁保护,在线程等待条件时,其他线程可能会修改条件相关的数据,导致数据不一致和竞争条件。通过互斥锁,可以确保这三步操作是原子的,即在多线程环境下,其他线程不能在步骤 2 和 3 之间修改条件相关的数据。
2025-03-16 12:36:57
326
原创 GCC头文件搜索顺序详解
在C/C++编程中,合理管理头文件的引入路径对于项目的组织至关重要。GCC编译器提供了灵活的机制来指定头文件的搜索路径,这主要通过#include "…"和#include <…>两种形式实现。本文将详细介绍这两种形式的区别以及如何使用-I参数优化头文件的搜索过程。
2025-02-20 00:19:29
1084
原创 推荐算法实践:movielens数据集
MovieLens 数据集是由明尼苏达大学的GroupLens研究小组维护的一个广泛使用的电影评分数据集,主要用于推荐系统的研究。该数据集包含用户对电影的评分、标签以及其他相关信息,是电影推荐系统开发与研究的常用数据源。
2025-02-11 22:24:36
1392
1
原创 c++面试:符号修饰
在C++中,名称修饰(Name Mangling)是一种将函数或变量的名称转换为唯一标识符的过程。它主要用于解决C++中的一些复杂特性,例如重载、类的作用域、模板等。
2025-02-08 22:44:55
929
1
原创 c++面试:类定义为什么可以放到头文件中
在C++中,定义和声明是两个不同的概念,它们各自有着明确的用途和含义。理解这两者的区别对于编写正确且高效的C++代码至关重要。声明是指向编译器告知某个变量、函数或类的存在及其类型,但并不分配实际的存储空间。声明的主要目的是让编译器知道如何解析程序中的符号引用。例如:// 声明一个名为a的整型变量,但不分配内存// 声明一个名为add的函数,但不提供实现// 前置声明,仅声明了MyClass的存在声明允许你在代码的一个部分提到某个实体,并在另一个部分提供其实现或定义。
2025-01-27 23:25:38
1249
2
原创 git基础操作
可以看到有4个区域,remote就是远程仓库,workspace则是本地可以编辑的代码分支, repository就是本地的仓库,存储者远程代码分支,也存储者本地代码分支。
2024-11-08 22:39:48
1647
原创 递归基础训练-路径总和
二叉树在递归的时候会遍历每一个节点,走完所有的路径,我们可以把之前遍历的节点信息放到path中传递下去,一直到叶子节点就拿到了所有的路径# 如果为None就直接返回,比如一个节点左孩子是None,右孩子非空return# 搜索路径就是根节点到叶子节点,直接打印路径# 可以return也可以不return,因为根节点的左右子树都是None# 继续往下执行就是左子树dfs(None),右子树dfs(None)# return。
2024-09-17 23:45:22
805
原创 这是啥设计模式-观察者模式
召回算法有很多个模型,这些模型使用的都是同一份特征数据进行训练,当训练数据有更新的时候就调用每一个算法的train方法进行训练,生成最新的模型。基本思路就是把这些模型都放到一个数组中,当数据集有更新的时候,就遍历所有的模型执行训练老实讲,我觉的这种方案已经可以了,但是有一个小问题,就是数据更新之后应该通知每个模型。
2024-08-20 22:10:38
511
原创 这是啥设计模式-单例模式
召回算法中有一个叫做I2I的召回方式,给定一个Item,返回跟这个Item相似的topK个Item,这种相似关系一般在离线就计算好了,以KV的方式存储下来我们使用的时候也加载成kv的格式就可以了。
2024-08-18 22:13:14
359
原创 序列化与反序列化的本质
utf-8需要3个字节表示一个中文,但其实只需要2个字节就可以了,utf-8对中文而言也是有点浪费了,所以提出了gbk编码,只需要2个字节来表示中文。这里需要注意的是,utf-8是一种unicode的编码方式,打个比方,每个人的手机号都是11位的,但是如果你办了亲情网,只需要3位就可以标识自己的老公,老婆,父母了。我们请求网页的时候都会告知这个网页的编码方式,一般都是utf-8的,这样兼容性很好,任意字符都可以显示,也有gbk编码的。存储数据的过程就是序列化,解析数据的过程就是反序列化。
2024-07-26 22:57:34
977
原创 python工作目录与文件目录
我们util目录中有一个view.py的文件,里面包含了一些工具类和方法# view.pyself.x = xself.y = y我们想要在train.py中调用该怎么办呢?我们以D:\test为工作目录,执行train.py文件,嘿嘿这是因为python在导入包的时候import xxx是以文件路径为基准的,即以train.py为基准,发现train.py的目录中并没有util子目录,因此导入失败。聪明的你做了一个简单的修改发现报了另一个错误。
2024-06-30 21:37:01
2222
原创 为什么需要负样本
人类学习的过程中好像只需要指出正样本就可以了,例如交宝宝学习认识猫咪,你告诉他这是猫咪就可以,不需要再告诉他其他的样本,好像自然而然就可以学会。其实人类在学习的时候一直都会有负样本的,例如识别猫咪的时候,桌子,椅子可能就是负样本,等到后面认识小狗的时候,猫咪,桌子椅子可能就是负样本了。假如我们只有正样本,模型在最开始训练的时候都是错误的,随着模型的迭代,准确率逐渐从0到1,最终将所有的样本都判别成正样本,也就是都在线的上方。加入负样本后,模型就可以知道不同类别之间的边界了,不会一股脑的把样本都识别成正的。
2024-06-13 22:28:35
393
原创 百万并发web服务器-简单的服务器
我们再本地实现了一个商品查询的服务,输入query,返回与之相关的商品。现在的问题是,如何搭建一个服务器,将这个服务提供给客户使用。一种最简单的方式就是使用socket实现一个服务器。Socket编程步骤使用c++来实现一个服务器接着实现一个客户端对于第一次使用socket编程来说,有太多不知道的东西了,一点一点梳理整个流程,对于服务端来说。
2024-04-28 23:34:15
782
原创 esp32+micropython蓝牙讲解
数字 M的四位表示 UUID 版本,当前规范有5个版本,M可选值为1, 2, 3, 4, 5。这5个版本使用不同算法,利用不同的信息来产生UUID,各版本有各自优势,适用于不同情景。UUID是一个 128 位无符号整数,通常使用十六进制字符串来表示,以连字号分隔的五组来显示,形式为 8-4-4-4-12,总共有 36个字符(即三十二个英数字母和四个连字号)。数字 N的一至四个最高有效位表示 UUID 变体( variant ),有固定的两位10xx因此只可能取值8, 9, a, b。
2023-10-06 20:56:08
9150
6
原创 ddp训练流程-pytorch教程
如果不同任务即使使用了同一个机器,即ip相同,也可以通过port来进行区分,可以看到192.168.1.2这台机器上跑了两个任务(这台机器有两个gpu,或者资源不够,用户就是想要指定两个进程来训练不同的任务),我们可以通过port来区分这两个任务,我们也可以使用一个不同的ip来区分,bert是192.168.1.2:5003,gpt是192.168.1.6:5003,端口一样,但是ip不一样,当然也可以直接ip+port都不相同。训练的过程中由于梯度共享的原因,所以每一次迭代梯度也是相同的。
2023-09-10 22:31:53
1163
1
原创 机器学习面试:tfidf&BM25的理解与应用
TFIDF的应用分析某个元素在整体中的重要性,元素可以是类目,单词等TFIDF的理解给你一篇文章,该如何确定文章中哪些词是关键的呢?一个直接的想法是对整篇文章进行分词,统计每个词出现的次数按照次数进行排序,出现次数越多的词重要性越高import jiebafrom collections import Counterdoc=""""""words = jieba.cut(doc)tf = Counter(words)tf = tf.most_common()print(tf
2023-05-13 18:47:44
750
原创 跟着杰哥学强化学习:q-learning的一些思考
下一个状态next_s的down是1,right是-1,up和left都是0,所以更新s的时候q(s,a=‘right’) = q(s,a=‘right’) + (reward + max q(next_s, a) - q(s,a=‘right’))=0+(0+1)=1,我们发现根据下一个状态,当前的状态的某个动作也都有值了。四周的价值反馈都是0,根本不知道该往哪个方向移动是有价值的,(up,down,left,right)的值都是0,按照greedy的方式就会一直选择up,然后越界复位,循环往复。
2023-04-29 19:29:58
626
原创 跟着杰哥学强化学习:多臂老虎机问题
现在有3台外观一模一样的老虎机,每个老虎机的赔率是不同的,摇动一次需要1块钱,现在给你100块钱,如何获取最大的收益。如果我们知道了每个老虎的赔率,那么只要选择收益最高的那个老虎机就可以了,但现在问题是并不知道每个老虎机的收益。为了简单,我们假设老虎机的收益服从正态分布我们没有办法找到老虎机,但是可以用python来进行模拟。
2023-04-29 19:22:52
1015
原创 pygame入门教程-图像篇
可以看到返回的是一个surface。我们在创建一个窗口的时候返回的也是surface对象,所有想要显示的图像都需要加载到主窗口也就是screen上。pygame提供了一个blit函数可以将一个画布贴到另一个画布上source就是另一个surface,dest则是绘制在screen的坐标位置(x,y),area则是想要绘制图片的区域大小。
2023-04-02 21:49:48
3284
原创 pygame入门教程-绘制篇
由于是手动点击的,因此很难正好落在交叉点,可以判断点击位置距离哪个交叉点最近。我们先把所有的交叉的位置找出来。加入鼠标点击事件,点击左键就落子,即绘制一个圆。五子棋很简单,先绘制网格线,然后绘制圆就行了。
2023-04-01 22:19:09
402
原创 pygame入门教程-基础篇
我们先启动一个窗口我们通过设置了一个窗口,并且返回了一个screen的变量,这个变量的类型是,也就是一个画布。我们基于这个画布来作画,例如加载一个图片到这个画布上,或者绘制一个圆。
2023-04-01 21:37:38
1471
原创 Embedding-based Retrieval in Facebook Search
搜索引擎帮助用户在海量的信息中进行检索,google和bing开发了各种技术来提高搜索质量。由于语义和意图非常难以表征,因此当前的搜索大多依赖于term匹配方法,也就是关键字匹配。语义匹配:解决于查询文本不完全匹配但是可以满足用户搜索意图所需要的结果深度学习在语音,机器视觉和自然语言理解中取得了重大的进展。embedding即表征被证明是一种有效的方法。本质上来说embedding是一种将ids的稀疏向量表征为密集向量的方法,也被称为语义嵌入。
2023-03-04 22:15:25
1124
原创 BERT论文翻译
语言预训练模型已经被证明对很多NLP任务是有效的,包括自然语言推理和释义等句子级别的任务,以及命名实体识别和问答等token级别的任务。将预训的语言表示应用与下游任务的现有策略有两种:基于特征和微调。基于特征的方法:例如ELMo,使用特定的任务结构,预训练表示作为附加的特征。基于微调的方法:例如GPT,引入了最小的任务特定参数,并通过简单的微调了所有预训练参数来训练下游任务。这两种方法在预训练期间有相同的目标函数,都使用单向语言模型去学习通用语言表示。
2022-10-09 19:45:02
817
原创 机器学习面试:从马尔可夫链到MH采样
有一种动物,每天只会吃喝睡,在这三种状态之间来回切换。有一个好事者,立了个摄像头,监控这个动物的每一分钟状态变化做了大量的统计,得到了状态之间的转移概率,并且给出了一个状态转移的概率矩阵。有了这个概率转移矩阵,我们就可以知道下一时刻的状态分布了。假设现在的状态是吃,由于当前的状态是确定的,所以概率为1,初始状态的概率分布就为[1,0,0],那么下一时刻的概率分布是什么呢?这个很好计算,根据贝叶斯定律可得其实更准确的是P(St)=∑P(St∣St−1)
2022-10-04 20:34:27
767
原创 python迭代器和可迭代对象
迭代器:实现__iter__和__next__两个魔法函数,可以使用for循环和next可迭代对象:只能实现__iter__函数,并且这个函数返回的是一个迭代器,可以使用for,由于没有实现__next__函数,所以不能使用next自定义可迭代数据:实现函数,有一个入参index,意味着我们可以通过索引访问,所以也就意味着需要保存较多的数据在内存中个人的一些见解老实讲,我觉得迭代器还是比较鸡肋的,为了计算下一个状态,需要保存上下文,然后通过处理得到新的状态。
2022-09-24 21:30:55
2728
原创 递归:为运算表达式设计优先级
虽然有的子运算表达式比较长,也只不过多谢一个运算符号而已,况且还没有括号,那是非常的简单。但是我看了别人的代码之后,突然发现,一个运算表达式返回的是一个数组,那么子运算表达式的结果应该也是一个数组才对,而不应该是一个单一的数字。首先不说怎么做,如果是递归的话,子问题的返回是什么,肯定也是一个数组,因为子问题与原问题是结构是一致的。,即中间是一个运算符,左侧和右侧分别是一个运算表达式或者数字。原问题是给定一个运算表达式,返回一个数组,这个数组中是所有可能的运算结果。这个问题也是这样的,举个例子。...
2022-08-18 14:16:00
258
原创 递归:链表求和/反转字符串
每一对儿的节点处理都是一样的,并且不断的向后遍历,因此看到这个问题的时候可以用循环也可以用递归。有一点不同的是,子问题的入参需要预先处理,即。还有一点非常有意思,一般情况下,一个链表遍历到None的时候,就直接返回了,例如。拼接起来即可,但是这里却是不断的补充0元素,这样就可以把两个链表虚拟成一样长了。通常面对递归,我都会先思考子问题,然后根据子问题去求解原问题,这道题有两点不同。要短,因此肯定是先遍历完。,通常情况下只需要把。...
2022-08-16 10:38:04
674
原创 递归:判断一个数是否是2的幂
这种递归与我想的正好相反,我思考的是先假设子问题有解,然后根据子问题去求解原问题,也就是在。然后我就看了别人写的递归方法,更加的简单巧妙。如果sr返回的是true,那么res应该返回什么呢,举个例子分析,假如n=17,那么有。,说明子问题都不是2的幂次方,那么原问题肯定不是2的幂次方了,直接返回False即可。,我们知道了子问题的解,该如何去求原问题的解呢?既然子问题是2的幂次方了,即。n不断的缩小并且不断的重复操作,这不就是妥妥的递归吗。是n的幂次方,如果n也是2的幂次方,那么有。,否者不是2的幂次方。.
2022-08-16 08:57:33
1380
原创 递归:x的n次幂
这个跟汉诺塔的问题非常的相像, 我不知道如何把n个圆盘从A移到C,但是如果我把n-1一个圆盘能移动到B,那么就可以完成。就可以了,这样问题最后就会缩减到n=1也就是停止条件上,然后递归再进行返回,我们操作这个返回结果即可。我也不知道,反正就是根据这个递归公式不断递归就可以求解出来了。这个递归也非常有意思,同样是有点难以理解,我们求。转化成递归函数的形式就是。其实可以递归成两种情况。......
2022-08-16 08:57:12
3744
原创 递归:两两交换链表节点
首先假设子问题已经解决了,由于是两两交换节点,因此我们需要预留出两个节点出来才行,之前使用递归对链表求解的时候都是只需要操作head节点即可,但是这里要求两个节点交换,因此需要head和head.next两个节点,因此子问题的输入就是head.next.next了。...
2022-08-15 21:04:11
215
1
空空如也
tensorflow 数据读取,哪位帮我解释一下
2018-05-09
TA创建的收藏夹 TA关注的收藏夹
TA关注的人