Javascript 使用不同的二进制数查找给定集合的子集
因此,挑战在于设计一种算法来打印给定集合Javascript 使用不同的二进制数查找给定集合的子集,javascript,java,c#,algorithm,big-o,Javascript,Java,C#,Algorithm,Big O,因此,挑战在于设计一种算法来打印给定集合n的子集 让我们将n设为相等: n = {a,b,c} 关于这一点,@Piva给出了一个答案,它利用“0到2^n的每个数字在其二进制表示中给出了唯一的子集”这一事实解决了这个问题 我已经编写了@Piva代码的Javascript版本,它运行良好。除了一句话外,我了解大部分内容: if(((i>>j) & 1) === 1) 我想我知道这行代码将I位右移,在I的二进制表示的开头加上j个零。我也理解位的含义&将I>>j与1进行比较,看
n
的子集
让我们将n设为相等:
n = {a,b,c}
关于这一点,@Piva给出了一个答案,它利用“0到2^n的每个数字在其二进制表示中给出了唯一的子集”这一事实解决了这个问题
我已经编写了@Piva代码的Javascript版本,它运行良好。除了一句话外,我了解大部分内容:
if(((i>>j) & 1) === 1)
我想我知道这行代码将I位右移,在I的二进制表示的开头加上j个零。我也理解位的含义&将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();
函数子生成器(集合){
this.set=set;
}
SubsetBuilder.prototype.getSubsets=函数(){
var self=这个;
如果(!self.set)
返回null;
//递归方式,做下一步
var getSubsetsAll=函数(原始集合){
如果(!originalSet){
返回;
}
}
var n=this.set.length;
对于(var i=0;i<(1>j));
console.log(“((i>>j)和1):”;
console.log(((i>>j)和1));
如果(((i>>j)&1)==1){//位j为on
subset.push(这个集合[j]);
}
console.log('-----------------');
}
console.log(子集);
console.log('-----------------');
}
}
变量集=['a','b','c'];
var obj=新的子造船厂(套);
obj.getSubsets();
如果((i>>j)&1)==1)
检查i的第j位是否已设置
为了理解这是如何工作的,考虑二进制101b中的5号。
>
只是一个移位(或等效地,除以2n),并且&1
屏蔽了除最低有效位以外的所有位
(101b >> 0) & 1 = (101b & 1) = 1
(101b >> 1) & 1 = ( 10b & 1) = 0
(101b >> 2) & 1 = ( 1b & 1) = 1
因此,一旦我们了解了位提取是如何工作的,我们就需要了解为什么位提取等同于子集包含:
下面是我们如何从二进制数0-7映射到{A,B,C}的子集
0: 0 0 0 => { }
1: 0 0 1 => { A}
2: 0 1 0 => { B }
3: 0 1 1 => { B A}
4: 1 0 0 => {C }
5: 1 0 1 => {C A}
6: 1 1 0 => {C B }
7: 1 1 1 => {C B A}
很明显,我们已经列出了所有的子集
希望您现在可以了解为什么对i的第j位的测试相当于将第j个对象包含到第i个子集中。if(((i>>j)&1)==1)
检查i的第j位是否已设置
为了理解这是如何工作的,考虑二进制101b中的5号。
>
只是一个移位(或等效地,除以2n),并且&1
屏蔽了除最低有效位以外的所有位
(101b >> 0) & 1 = (101b & 1) = 1
(101b >> 1) & 1 = ( 10b & 1) = 0
(101b >> 2) & 1 = ( 1b & 1) = 1
因此,一旦我们了解了位提取是如何工作的,我们就需要了解为什么位提取等同于子集包含:
下面是我们如何从二进制数0-7映射到{A,B,C}的子集
0: 0 0 0 => { }
1: 0 0 1 => { A}
2: 0 1 0 => { B }
3: 0 1 1 => { B A}
4: 1 0 0 => {C }
5: 1 0 1 => {C A}
6: 1 1 0 => {C B }
7: 1 1 1 => {C B A}
很明显,我们已经列出了所有的子集
希望您现在可以了解为什么对i的第j位的测试相当于将第j个对象包含到第i个子集中。if(((i>>j)&1)==1)
检查i的第j位是否已设置
为了理解这是如何工作的,考虑二进制101b中的5号。
>
只是一个移位(或等效地,除以2n),并且&1
屏蔽了除最低有效位以外的所有位
(101b >> 0) & 1 = (101b & 1) = 1
(101b >> 1) & 1 = ( 10b & 1) = 0
(101b >> 2) & 1 = ( 1b & 1) = 1
因此,一旦我们了解了位提取是如何工作的,我们就需要了解为什么位提取等同于子集包含:
下面是我们如何从二进制数0-7映射到{A,B,C}的子集
0: 0 0 0 => { }
1: 0 0 1 => { A}
2: 0 1 0 => { B }
3: 0 1 1 => { B A}
4: 1 0 0 => {C }
5: 1 0 1 => {C A}
6: 1 1 0 => {C B }
7: 1 1 1 => {C B A}
很明显,我们已经列出了所有的子集
希望您现在可以了解为什么对i的第j位的测试相当于将第j个对象包含到第i个子集中。if(((i>>j)&1)==1)
检查i的第j位是否已设置
为了理解这是如何工作的,考虑二进制101b中的5号。
>
只是一个移位(或等效地,除以2n),并且&1
屏蔽了除最低有效位以外的所有位
(101b >> 0) & 1 = (101b & 1) = 1
(101b >> 1) & 1 = ( 10b & 1) = 0
(101b >> 2) & 1 = ( 1b & 1) = 1
因此,一旦我们了解了位提取是如何工作的,我们就需要了解为什么位提取等同于子集包含:
下面是我们如何从二进制数0-7映射到{A,B,C}的子集
0: 0 0 0 => { }
1: 0 0 1 => { A}
2: 0 1 0 => { B }
3: 0 1 1 => { B A}
4: 1 0 0 => {C }
5: 1 0 1 => {C A}
6: 1 1 0 => {C B }
7: 1 1 1 => {C B A}
很明显,我们已经列出了所有的子集
希望您现在可以了解为什么对i的第j位的测试相当于将第j个对象包含到第i个子集中。我添加了一条注释,以回答您关于答案的问题。我觉得这不需要一个全新的问题。我已经添加了一条评论来回答你关于答案的问题。我觉得这不需要一个全新的问题。我已经添加了一条评论来回答你关于答案的问题。我觉得这不需要一个全新的问题。我已经添加了一条评论来回答你关于答案的问题。我不认为这是一个全新的问题。好吧,我已经到了那里,我担心我花了这么长时间才掌握这一点,尽管我已经写了将近20年的代码lol。所以我得到一个位掩码是一种“标记”集合n子集的方法。多亏了你的回答,我现在看到if(((I>>j)&1)==1)正在检查I的第j位是否为“开”,并且I是标记点的位掩码,具有二进制1,其中我们有一个唯一的子集。有几件事我想说得更清楚,尤其是操作员>>。我理解j1,我会把I>>j读成下面的“在I的二进制符号的开头加上j个零”?这更清楚地说明了描述中的每个运算符都在做什么。真棒的回答,你这个人^n哈哈。最后一个问题,如果你能这么客气,为什么我要使用迭代器2^n-1而不是2^n,我知道我可以“通过克隆S来构建S(n)”(n-1)并将n添加到克隆集,但我仍然无法理解为什么S(n-1)代表iNever mind,代表集合{a,