外观
如何理解TopK、区间与 DAG 的算法联系?
标准回答
流式处理 N 个分数并保留最大的 K 个,可维护大小不超过 K 的最小堆,复杂度 O(N log K),额外空间 O(K);K≥N 时可直接排序全部元素。排名有并列时应定义稳定 ID 次序,浮点分数还要处理 NaN 与无穷值。
Trace 区间求交使用 max(start) 与 min(end),采用半开区间避免边界重复;多个重叠区间求覆盖时先排序再合并。DAG 可用入度与队列做拓扑处理,复杂度 O(V+E),剩余未处理节点表示存在环或输入不合法;若环跨权限边界,不应泄露其他项目节点。
下面给出纯 Java 的教学 TopK 实现,保留整数重复值并返回降序结果,k≤0 返回空列表。它用于理解堆,不是 EachOf 的真实排序代码,也不能替代包含权限、来源和预算的完整召回逻辑。
追问与回答
为什么比较器不要写成 a-b
整数相减可能溢出,违反比较器顺序。使用 Integer.compare、Long.compare 或合适的标准比较器。
为什么拓扑排序不能保证任务可执行
它只验证依赖顺序,实际还要检查权限、来源有效、时间条件、容量和租约;图算法不替代业务状态。
易混淆点
- 拿堆的内部迭代顺序当作已经排好的 TopK。
内容来源
- Android 与 AI 工程 Wiki · 原条目
q202