【发布时间】:2016-01-25 01:18:45
【问题描述】:
因此,挑战在于设计一种算法来打印给定集合n 的子集。
让我们设置 n 相等:
n = {a,b,c}
在stack overflow article 上,@Piva 提供了一个答案,它利用“从 0 到 2^n 的每个数字在其二进制表示中给出一个唯一的子集”这一事实来解决这个问题
我已经编写了@Piva 代码的 Javascript 版本,它运行良好。除了一行,我大部分都理解:
if(((i>>j) & 1) === 1)
我想我理解这行代码将 i 位右移,将 j 个零添加到 i 的二进制表示的开头。我也理解位明智的 & 正在将 i >>j 与 1 进行比较,并查看输出 i >> 的第一位是否打开。
但我不明白此操作如何识别唯一的二进制表示以及为什么 if(((i>>j) & 1) === 1) 为真意味着我们拥有给定 n 的唯一子集。
这是我的 Javascript 版本:
function SubsetBuilder(set) {
this.set = set;
}
SubsetBuilder.prototype.getSubsets = function () {
var self = this;
if (!self.set)
return null;
//recursive way, do next
var getSubsetsAll = function (originalSet) {
if (!originalSet) {
return;
}
}
var n = this.set.length;
for(var i = 0; i < (1<<n); i++) {
var subset = [];
for (var j = 0; j < n; j++) {
console.log('i:' + i + ", binary: " + i.toString(2));
console.log('j:' + j + ", binary: " + j.toString(2));
console.log('(i >> j):');
console.log((i >> j));
console.log('((i>>j) & 1):');
console.log(((i >> j) & 1));
if(((i>>j) & 1) === 1){ // bit j is on
subset.push(this.set[j]);
}
console.log('-------------------');
}
console.log(subset);
console.log('-------------------');
}
}
var set = ['a', 'b', 'c'];
var obj = new SubsetBuilder(set);
obj.getSubsets();
【问题讨论】:
-
我已添加评论以回应您对答案的问题。我不认为这是一个全新的问题。
标签: javascript java c# algorithm big-o