如何实现最早启动滑动窗口完成后的组ID分配?
按规则生成游程分组的实现方法
该分组逻辑不需要逐元素遍历判断覆盖状态,只需按未覆盖起始位置跳步推进即可,核心逻辑与给定的分配规则完全对齐。
可直接运行的R代码
首先定义示例使用的游程长度向量:
xx <- c(3L, 2L, 1L, 4L, 4L, 3L, 3L, 1L, 2L, 1L, 2L, 3L, 4L, 3L, 2L, 1L)
分组计算代码:
# 初始化结果存储向量、当前未覆盖的起始索引、组号计数器 res <- integer(length(xx)) pos <- 1L grp <- 0L vec_len <- length(xx) while(pos <= vec_len) { grp <- grp + 1L # 按当前位置的游程值,确定本次窗口的覆盖范围 window_end <- pos + xx[pos] - 1L # 给窗口范围内的所有位置分配当前组号 res[pos:window_end] <- grp # 直接跳转到下一个未覆盖的起始位置,无需逐位判断 pos <- window_end + 1L }
运行结果校验
运行上述代码后,输出的结果与预期值完全匹配:
res # [1] 1 1 1 2 2 2 2 3 4 4 5 5 6 6 6 6
逐段对应分配过程:
- 从索引1出发,窗口长度3,覆盖1-3位,分配组号1
- 跳至索引4,窗口长度4,覆盖4-7位,分配组号2
- 跳至索引8,窗口长度1,覆盖8位,分配组号3
- 跳至索引9,窗口长度2,覆盖9-10位,分配组号4
- 跳至索引11,窗口长度2,覆盖11-12位,分配组号5
- 跳至索引13,窗口长度4,覆盖13-16位,分配组号6
注:该实现不需要额外的标记位记录元素是否被覆盖,通过连续跳步就能保证所有位置被正确分配,计算效率不会随向量长度提升出现额外损耗。
内容的提问来源于stack exchange,提问作者AnilGoyal
相关产品推荐
相关产品推荐

