华为 · 模拟 · 算法编程题
华为 模拟 时限 1 秒 / 256 MB

题目描述

在嵌入式设备上运行神经网络推理时,由于硬件资源有限,通常需要将浮点参数压缩为低比特整数表示,以减少存储开销和加速计算。
本题要求你实现一种对称INT8量化方案,分别对激活矩阵 A 和参数矩阵 B 进行量化,然后在整数域完成矩阵乘法,最后还原为浮点结果并输出。
具体规则如下:
1. 原始矩阵
激活矩阵 A 的维度为 M*K,其中每一行代表一个样本向量。参数矩阵 B 的维度为 K*N,其中每一列代表一个输出通道。
2. 量化过程
(1) 对激活矩阵 A 按行量化(per-sample)
对第 i 行,先计算缩放因子: s_A^(i) = max_k ∈ [1,K] |A_i,k|127 再对每个元素量化: Q_A^(i,k) = clip(round(A_i,ks_A^(i)), -127, 127)
(2) 对参数矩阵 B 按列量化(per-channel)
对第 j 列,先计算缩放因子: s_B^(j) = max_k ∈ [1,K] |B_k,j|127 再对每个元素量化: Q_B^(k,j) = clip(round(B_k,js_B^(j)), -127, 127)
注意:
round 采用 Python round() 的逻辑,即银行家舍入(四舍六入五取偶)。
非 0.5 的情况遵循常规四舍五入;恰好 0.5 时舍入到最接近的偶数。
- clip(x, -127, 127) 将 x 限制在 [-127, 127] 范围内。
3. 量化矩阵乘法
先在整数域计算乘积(结果为INT32): Y_int32^(i,j) = Σ_k=1^K Q_A^(i,k) · Q_B^(k,j) 然后乘以对应的缩放因子还原为浮点数: Y_fp32^(i,j) = Y_int32^(i,j) · s_A^(i) · s_B^(j)

输入输出

输入描述
从标准输入读取,依次给出矩阵 A 和矩阵 B。
对于每个矩阵,第一行为两个整数表示行数和列数,随后若干行为矩阵元素(浮点数),同一行内元素以空格分隔。
输出描述
输出还原后的浮点结果矩阵,每个元素四舍五入保留两位小数(建议使用 Python 的 format(num, '.2f') 处理)。同一行内元素以单个空格分隔,行首行尾不要有多余空格。

样例共 2 组

样例 1 · 激活矩阵 A 为 1*3 矩阵 [2.0, -1.0, 3.0],参数矩阵 B 为 3*1 矩阵 [[1.0], [-2.0], [0.5]]。 对 A 按行量化:该行绝对值最大为 3.0,缩放因子 s_A = 3.0/127。量化后 Q_A = [round(84.67), round(-42.33), round(127.0)] = [85, -42, 127]。 对 B 按列量化:该列绝对值最大为 2.0,缩放因子 s_B = 2.0/127。量化后 Q_B = [round(63.5), round(-127.0), round(31.75)] = [64, -127, 32]。注意 round(63.5) = 64(银行家舍入,取偶数)。 整数域乘法:Y_int32 = 85*64 + (-42)*(-127) + 127*32 = 5440 + 5334 + 4064 = 14838。 还原:Y_fp32 = 14838 * (3.0/127) * (2.0/127) = 5.52(四舍五入到两位小数)。
输入
1 3
2.0 -1.0 3.0
3 1
1.0
-2.0
0.5
输出
5.52
样例 2 · A 有3个样本向量,B 有2个输出通道。对 A 逐行、对 B 逐列分别计算缩放因子和量化值,在整数域完成矩阵乘法后,乘以对应的行缩放因子和列缩放因子还原为浮点数。
输入
3 2
10.0 -5.0
0.0 8.0
-3.0 -3.0
2 2
4.0 -6.0
2.0 7.0
输出
29.84 -95.35
16.13 56.00
-18.05 -2.98

算法解析依据充分

考点:模拟

限制 1 秒 / 256MB | 标准输入输出

题目画像

  • 源站时限:1 秒(牛客口径,非本题专属门槛)

解题思路

推荐方向:模拟

本题切入点

严格按对称 INT8 量化定义实现:A 按行、B 按列分别求缩放因子(max|·|/127),用银行家舍入取整并 clip 到 ±127,再在整数域做矩阵乘后反量化输出。

不涉及复杂算法,把题目描述的流程原样翻译成代码逐步执行即可。

思路框架(模拟 通法 · 非本题专属)

  1. 用变量记录题目要求的「状态」(当前值、剩余数量、当前位置等)。
  2. 按题面给出的顺序,把每一步操作写成一段代码,逐条执行。
  3. 每一步执行后更新状态,并在题目要求的位置输出或累计答案。
  4. 注意循环的边界:执行多少次、何时终止、是否能终止。

实现要点:结构上通常是一个外层循环包住若干 if/else 分支;只要状态定义清楚,正确率很高。

复杂度:时间 O(操作次数) | 空间 O(状态数)

该范式的通法易错点

  • 终止条件写错导致死循环或漏做最后一次操作。
  • 状态更新顺序颠倒(先改了下标又用旧下标)。
  • 题目里「最多 / 恰好 / 至少」的语义差别没区分。

题目给出的提示

  • round 采用 Python round() 的逻辑,即银行家舍入(四舍六入五取偶)

样例解读

样例 1:输入 1 3 / 2.0 -1.0 3.0 / 3 1 / 1.0 / -2.0 / 0.5 → 输出 5.52

激活矩阵 A 为 1*3 矩阵 [2.0, -1.0, 3.0],参数矩阵 B 为 3*1 矩阵 [[1.0], [-2.0], [0.5]]。

对 A 按行量化:该行绝对值最大为 3.0,缩放因子 s_A = 3.0/127。量化后 Q_A = [round(84.67), round(-42.33), round(127.0)] = [85, -42, 127]。

对 B 按列量化:该列绝对值最大为 2.0,缩放因子 s_B = 2.0/127。量化后 Q_B = [round(63.5), round(-127.0), round(31.75)] = [64, -127, 32]。注意 round(63.5) = 64(银行家舍入,取偶数)。

整数域乘法:Y_int32 = 85*64 + (-42)*(-127) + 127*32 = 5440 + 5334 + 4064 = 14

样例 2:输入 3 2 / 10.0 -5.0 / 0.0 8.0 / -3.0 -3.0 / 2 2 / 4.0 -6.0 / 2.0 7.0 → 输出 29.84 -95.35 / 16.13 56.00 / -18.05 -2.98

A 有3个样本向量,B 有2个输出通道。对 A 逐行、对 B 逐列分别计算缩放因子和量化值,在整数域完成矩阵乘法后,乘以对应的行缩放因子和列缩放因子还原为浮点数。

解析由校招宝本地引擎整理(依据源站考点标签 / 人工判题标注 / 题面规模信号),非官方题解,仅供思路参考。

本题来源:2026年-华为-1月21号AI岗。

‹ 上一题 全部编程题 下一题 ›
编程算法题为只读内容:无需作答,直接看题与解析 · 本站不提供在线判题 · 解析由校招宝本地引擎整理,非官方题解