2025年7月面试过程
408 多线程 python八股大模型八股 Transformer,attention,qkv,embedding ⭐⭐⭐⭐⭐ only decoder/encoder cuda软件 llama结构,好的模型剪枝优化方法,qkv矩阵,如何减少模型训练时间 并行bn 手撕 手撕计算交并比IOU 手撕self-attention ⭐⭐⭐⭐⭐ leetcode 股票最大利润 把二叉树(不完全二叉树)按先序遍历顺序展开,储存为treenode(仅right=node,left=none)复杂度为O(n) 找到数组中第k个最大的数 将数组里面的奇数位置的数放在左边,偶数位置的数放在右边,原地操作 完全平方数 海康威视...
大模型各种算子手撕(实现)
注意力机制的代码实现-1234567891011121314151617181920212223242526272829import torchimport torch.nn as nnimport torch.nn.functional as Ffrom math import sqrtclass SelfAttention(nn.Module): def __init__(self, input_dim, dim_k, dim_v): super(SelfAttention, self).__init__() self.q = nn.Linear(input_dim, dim_k) self.k = nn.Linear(input_dim, dim_k) self.v = nn.Linear(input_dim, dim_v) self.norm = sqrt(dim_k) def forward(self, x): Q =...
机器学习各种算法手撕(实现)
1. 手撕 k-means 算法1234567891011121314151617181920212223242526272829303132333435import numpy as npimport matplotlib.pyplot as pltdef kmeans(data, K, max_iterations=100): # 随机初始化K个簇中心点 centers = data[np.random.choice(data.shape[0], K, replace=False)] # 迭代更新中心点 for _ in range(max_iterations): # 计算每个样本到各个中心点的距离 distances = np.linalg.norm(data[:, None] - centers, axis=2) # 等价于distances = np.linalg.norm(X[:, np.newaxis, :] - centers, axis=2) # 分配每个数据点到最近的簇 labels =...
深度学习各种算法手撕(实现)
目标检测-Iou (交并比)1234567891011121314151617181920212223242526272829import numpy as np def ComputeIOU(boxA, boxB): ## 计算相交框的坐标 x1 = np.max([boxA[0], boxB[0]]) x2 = np.min([boxA[2], boxB[2]]) y1 = np.max([boxA[1], boxB[1]]) y2 = np.min([boxA[3], boxB[3]]) width = np.max([0, x2 - x1 + 1]) height = np.max([0, y2 - y1 + 1]) inter_area = width * height # 计算两个框的面积 area_A = (boxA[2] - boxA[0] + 1) * (boxA[3] - boxA[1] + 1) area_B = (boxB[2] - boxB[0] + 1) *...
操作系统八股文
第 1 章 操作系统概述第 2 章 进程管理线程与进程的区别⭐⭐⭐ 定义 进程是操作系统资源分配的基本单位,是一个独立运行的程序实例。每个进程有独立的内存空间、全局变量和系统资源。 线程是进程中的一个执行单元,是CPU调度的基本单位。多个线程共享同一个进程的内存和资源。 调度。线程是独立调度的基本单位,进程是拥有资源的基本单位。在同一进程中,线程的切换不会引起进程切换。在不同进程中进行线程切换,如从一个进程内的线程切换到另一个进程中的线程时,会引起进程切换。 拥有资源。进程都是拥有资源的基本单位,而线程不拥有系统资源,但线程可以访问其所属进程的系统资源。 并发性。在引入线程的操作系统中,不仅进程之间可以并发执行,而且多个线程之间也可以并发执行。 系统开销。进程创建、撤销和切换,所付出的开销远大于线程。 地址空间。进程的地址空间之间互相独立,同一进程的各线程间共享进程的地址空间。 通信方面。进程间需要用PV操作、共享存储、消息传递和管道通信等方式进行通信,而线程间可以直接读/写进程数据段(如全局变量)来进行通信。 进程、线程和协程的区别⭐ 1....
C++ STL八股文
Vectorvector的底层实现⭐C++ 标准库中的 std::vector 是一个动态数组,底层通过连续内存块实现,支持快速随机访问和动态扩容。其核心实现细节如下: 1. 底层数据结构vector 内部维护三个指针(或等效的成员变量)来管理内存: _start:指向数组的第一个元素(begin())。 _finish:指向最后一个元素的下一个位置(end())。 _end_of_storage:指向内存块的末尾(表示当前分配的容量上限)。 12345678template <class T>class vector {private: T* _start; // 指向第一个元素 T* _finish; // 指向最后一个元素的下一个位置 T* _end_of_storage; // 指向内存块的末尾 // ...}; 2. 内存分配与扩容初始化 默认构造时,vector 为空,三个指针均为 nullptr。 添加元素时,若当前容量不足,触发动态扩容。 扩容机制 当...
C++面试八股文--参考C++ Primer目录
第 1 章 C++ 基础主要内容:基本类型、字符串、向量和数组、表达式、语句、函数(缺省函数、函数重载、内联函数)、引用。 结构体的对齐规则结构体的对齐规则。 一、结构体对齐规则首先要看有没有用#pragma pack宏声明,这个宏可以改变对齐规则。在没有#pragma pack这个宏的声明下,遵循下面三个原则:1、第一个成员的首地址为0。2、每个成员的首地址是自身大小的整数倍。3、结构体的总大小,为最大成员的整数倍。二、当用 #pragma pack(n)指定时,以 n和最大成员...
C++ STL常用函数——leetcode刷题
STL常用容器容器分类 顺序(序列式)容器: vector:采用线性连续空间,类似于数组; deque:双向开口的连续线性空间,随机存取,双端队列; list:双向循环链表; slist:单向链表; array:固定数组,vector的底层即为 array数组。 关联式容器: set(集合)和 map(映射):都是以红黑树作为底层结构。set不可重复,mutliset可重复;map不可重复,mutlimap可重复; hash_set(unordered_set)和 hash_map(unordered_map):是基于哈希表实现的,查询时间复杂度为O(1)。 容器适配器: stack:以 deque为底部结构并封闭其头端开口形成的; queue:单端队列,由 deque实现; pirority_queue:优先队列,类似于堆,基于 vector容器实现的。 1. string 查找和替换 123int find(const string& str, int pos = 0) const;...
一文了解程序编译cmake命令
CMake快速学习 只有一个源文件的程序编译 首先在当前目录下创建两个文件,源文件hello.cpp和cmake文件CMakeLists.txt; 123456# cmake最低版本要求2.8cmake_minimum_required (VERSION 2.8)# 本项目的工程名project (learn_cmake)# 要生成的可执行文件名为hello,后面的参数是需要的依赖add_executable(hello hello.cpp) 接着在当前目录下执行cmake .; 接着会发现目录下多生成了一些文件,例如Makefile等; 然后使用GNU make来编译程序,即输入make命令; 此时会发现已生成可执行程序,输入./hello就可以正常执行, 同一目录下多个源文件此时在当前目录新增两个源文件,只需要在CMakeLists.txt中添加所依赖的.cpp文件如add_executable(hello hello.cpp...
一文学习Linux系统下GDB调试
GDB调试命令如何进入gdb模式形成可执行程序 在linux下使用gcc/g++、makefile或CMake形成可执行程序时,需要加上-g选项,即程序发布的debug模式;如果不加该选项就默认是release模式; 如果要进入gdb开始调试,那直接gdb + 可执行程序名即可。 GDB操作指令行号显示(list) l 行号/函数名表示显示包含该行或该函数的10行代码。 l 表示列出该源文件中的随机10行内容; l 0或l 1 表示从从第一行开始往下显示10行的内容; l m 表示显示包含第m行的10行代码; l 函数名 表示显示函数名的前后10行代码; l m,n 表示显示从第m行到第n行的代码。 断点设置(break) b 行号 表示在该行打断点; b 源文件:行号 表示在该源文件中的这行加上一个断点; b 源文件:函数名 表示在该函数的第一行打上断点。 查看断点信息 info 表示查看所有的调试信息; info b 表示查看所有断点的信息; 断点的字段信息: Num —— 编号 Type —— 类型 Disp —— 状态 Enb ——...










