如何确定R中由重复小向量生成的大向量的原长度与重复次数?
从重复生成的大向量中还原原小向量的长度和重复次数
核心思路
要找出原小向量的长度,本质是找最小的正整数k:把大向量前k个元素重复若干次后,能完全匹配整个大向量。找到这个k后,重复次数就是大向量总长度除以k的结果。
R语言实现代码
# 定义函数:输入大向量,返回原小向量长度和重复次数 find_small_v_info <- function(big_v) { total_len <- length(big_v) # 遍历可能的小向量长度,最多到总长度的一半(对应至少重复2次的情况) for (k in 1:floor(total_len/2)) { # 总长度必须能被k整除,否则无法形成整数次重复 if (total_len %% k != 0) next # 验证前k个元素重复后是否与原大向量完全一致 if (all(rep(big_v[1:k], total_len/k) == big_v)) { return(list(原小向量长度 = k, 重复次数 = total_len/k)) } } # 若未找到重复模式,说明大向量本身就是原小向量,仅重复1次 return(list(原小向量长度 = total_len, 重复次数 = 1)) } # 测试示例 small_v <- c("as","d2","GI","Worm") big_v <- rep(small_v, 3) find_small_v_info(big_v) # 输出结果:$原小向量长度 [1] 4; $重复次数 [1] 3
逻辑说明
- 先获取大向量总长度,缩小遍历范围;
- 跳过无法整除总长度的k值,因为重复次数必然是整数;
- 从最小的k开始验证,保证找到的是唯一的原小向量(原向量元素唯一,不存在更小的重复单元);
- 若遍历完所有可能都无匹配,则大向量本身就是原小向量,仅重复1次。
内容的提问来源于stack exchange,提问作者user2021713
相关产品推荐
相关产品推荐

