Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/414.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用不同的二进制数查找给定集合的子集_Javascript_Java_C#_Algorithm_Big O - Fatal编程技术网

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,