【发布时间】:2016-06-18 02:37:20
【问题描述】:
给定一个Set,生成所有长度为n的子集。
-
示例输入:
set = new Set(['a', 'b', 'c']), length = 2 -
样本输出:
Set {'a', 'b'}, Set {'a', 'c'}, Set {'b', 'c'}
如何有效地做到这一点,不将Set 转换为Array?
我已经有了一个很好的数组作为输入的解决方案:
function* subsets(array, length, start = 0) {
if (start >= array.length || length < 1) {
yield new Set();
} else {
while (start <= array.length - length) {
let first = array[start];
for (subset of subsets(array, length - 1, start + 1)) {
subset.add(first);
yield subset;
}
++start;
}
}
}
let array = ['a', 'b', 'c', 'd'];
for (subset of subsets(array, 2)) {
console.log(...subset);
}
但是,如果不将集合转换为数组,我就无法为集合提供有效的实现——我想避免这种情况,例如纯粹使用迭代器。
【问题讨论】:
-
谁投票结束这个问题,因为它太宽泛了:我找不到任何解决方案。如果至少有一个,我会很高兴。如果您认为它太宽泛,您介意至少提供一个答案吗?
-
如果您关心的是效率,使用数组版本不是更好吗?这是一个更有效的答案(对象与数组)stackoverflow.com/questions/8423493/…
-
看看这个:link
-
@IsmailRBOUH "实现了计算 JS 数组中元素组合的函数。" 嗯...
-
@Oriol 这正是我被卡住的部分:克隆或反转迭代器是不可能的。但是 - 通过利用 Set.values() 保持插入顺序这一事实,可能存在解决方案,从开头删除并插入到结尾可能允许通过简单地增加迭代器来“回溯”。我还没有探索过,如果它比数组转换慢得多,我也不会感到惊讶。我希望有另一种方法。但是您的评论强烈表明没有。谢谢!
标签: javascript set subset