You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效拆分集合为两个子集合?优化数字Set奇偶拆分方案

集合拆分的最优方案:单次遍历实现奇偶分离

嘿,这个问题问到点子上了!两次调用filter确实会让你遍历整个集合两次,当集合元素数量很大时,这会浪费不少时间。其实最优的解决方案非常直观——只遍历集合一次,同时把元素分到对应的目标集合里,这样时间复杂度直接从O(2n)降到O(n),效率提升明显。

核心思路

初始化两个空集合,然后遍历原集合的每一个元素,根据判断条件(比如奇偶性)将元素添加到对应的集合中。遍历完成后,你就得到了两个拆分好的子集,整个过程只需要一次完整遍历。

具体实现示例

JavaScript版本

const numberSet = new Set([1, 2, 3, 4, 5, 6, 7, 8]);
const oddSet = new Set();
const evenSet = new Set();

// 单次遍历完成分流
for (const num of numberSet) {
  num % 2 === 1 ? oddSet.add(num) : evenSet.add(num);
}

console.log('奇数集:', oddSet); // Set(4) {1, 3, 5, 7}
console.log('偶数集:', evenSet); // Set(4) {2, 4, 6, 8}

Python版本

number_set = {1, 2, 3, 4, 5, 6, 7, 8}
odd_set = set()
even_set = set()

# 单次遍历完成分流
for num in number_set:
    if num % 2 == 1:
        odd_set.add(num)
    else:
        even_set.add(num)

print("奇数集:", odd_set)  # {1, 3, 5, 7}
print("偶数集:", even_set) # {2, 4, 6, 8}

注意事项

有些语言里的语法糖(比如Python的集合推导式)看起来简洁,但本质还是两次遍历,比如下面这种写法:

odd_set = {num for num in number_set if num % 2 == 1}
even_set = {num for num in number_set if num % 2 == 0}

这种写法虽然代码短,但会遍历原集合两次,当集合元素很多时,效率不如单次遍历的方案。

总结

对于任何需要将集合拆分为两个子集的场景,单次遍历+条件分流都是最优的方案。它在时间效率上做到了极致(O(n)),空间复杂度则是O(n)(毕竟要存储所有元素到两个新集合,这是无法避免的),完美平衡了时间和空间成本。

内容的提问来源于stack exchange,提问作者user1386966

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:12:07