SWE · Onsite Coding

Coinbase 随机 NFT:属性笛卡尔积、去重与带权采样

Onsite 从多组 attribute 生成组合,追问去重与如尖耳朵 60%、宽耳朵 40% 的权重;分清枚举和随机生成。

题目重点:Onsite 从多组 attribute 生成组合,追问去重与如尖耳朵 60%、宽耳朵 40% 的权重;分清枚举和随机生成。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 训练版有 C 个属性类别,每类选恰好一个 value;类别有稳定顺序,值按规范化 ID 判同一属性。
  • 枚举全部唯一组合与随机生成一个 NFT 是两种操作;加权版训练为各类别独立抽一个值,各类权重非负且和为 1。若要无重复批量加权抽样,不能直接反复独立抽而忽略已抽组合。
  • NFT 的最终 ID 可由类别顺序下的属性 ID 元组确定;不同展示名若语义相同如何规范化需业务给定。

解题路线

  1. 枚举:DFS 深度为类别索引,每层遍历该类别候选值;走到 C 时输出属性 ID 元组,等价笛卡尔积。若任一类别空,组合数为 0;0 个类别是否输出一个空组合由接口契约。
  2. 去重:先对每类别按 ID 去重,再在最终输出前用规范化元组 set 去重;如果跨类别属性顺序有意义,不能无条件排序整个元组。
  3. 带权生成:每类别构建累计概率前缀,抽 u∈[0,1) 并二分定位属性;各类独立时组合概率是各选中值概率乘积。训练例耳朵 0.6/0.4、颜色红 0.5/蓝 0.5,尖耳红概率 0.3。
  4. 若要抽 K 个独特 NFT 且权重偏好,先确认目标是按组合概率做不放回抽样,还是每次独立抽后拒绝重复;后者接近耗尽时拒绝次数很高且输出分布需分析。
  5. 对权重和不为 1、全 0、浮点边界、重复属性、单类别、海量组合不可一次物化等情况给出处理策略。

手动走一遍

训练类别耳朵={尖,宽}、颜色={红,蓝},枚举四个元组;若耳朵列表重复给两次‘尖’,先按 ID 去重仍只有四个。独立权重耳朵 0.6/0.4、颜色 0.5/0.5 时四个组合概率为 0.3、0.3、0.2、0.2,总和 1。

规模与取舍

类别大小 n_i、组合数 P=∏n_i:枚举输出 O(CP) 时间、DFS 栈 O(C),若全部保存结果 O(CP);每类权重前缀 O(Σn_i) 预处理,单次加权抽 O(Σlog n_i)。去重最终集合空间与独特组合数成正比。

易错点与追问

容易失分的边界

  • 把所有 attribute 扁平组合,导致一个 NFT 有两个耳朵但没颜色。
  • 去重只看展示名未规范化 ID,或整个元组排序后丢类别位置。
  • 用权重 60/40 把两种耳朵固定分配到每十个 NFT,却声称独立随机分布。
  • 把有放回加权生成与无重复批量抽样混为一谈。
  • 没有独立性证据却把组合概率一律当各类权重乘积。

继续深挖

  • K 接近总组合数时怎样高效无重复加权抽?
  • 属性之间有禁配规则如何做 DFS 剪枝?
  • 如何验证随机发生器的经验分布?
  • 百万类别组合时如何懒生成而不物化?
✓已复制微信号!