Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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
查找多个位集的公共父级java_Java_Algorithm_Bitset - Fatal编程技术网

查找多个位集的公共父级java

查找多个位集的公共父级java,java,algorithm,bitset,Java,Algorithm,Bitset,我无法在位集方法中找到这个简单问题的正确解决方案。问题是从最左边的位开始查找位集的公共父级。以下是一些例子: 011 010 001 Common Parent: 0 00 010 Common Parent: 0 00 11 10 Common Parent: None 1101 111 1100 Common Parent: 11 我的解决方案是对和位集进行排序,然后通过查找这些位集的XOR上的第一个集位来找到正确的长度。它在某些情况下有效,但在其他情况下失败。我有另一个想法,涉及

我无法在位集方法中找到这个简单问题的正确解决方案。问题是从最左边的位开始查找位集的公共父级。以下是一些例子:

011
010
001
Common Parent: 0

00 
010
Common Parent: 0

00
11
10
Common Parent: None

1101
111
1100
Common Parent: 11
我的解决方案是对和位集进行排序,然后通过查找这些位集的XOR上的第一个集位来找到正确的长度。它在某些情况下有效,但在其他情况下失败。我有另一个想法,涉及到位集上的循环,如果你有解决方案,我很乐意避免


[我知道它们可以表示为二叉树,但这涉及内存开销,我希望通过仅对位集和一些布尔运算(and、OR、NOR、NAND、XOR)进行操作来避免这一开销]

例如,您可以这样做:

    String[] input = {"011","010","001"};

    if(input.length==0) return ;
    int n=input[0].length();
    List<BitSet> bitsets = new ArrayList<>();
    for(String in:input){
        // n is the min length of the inputs
        n=Math.min(n,in.length());
        // If you start counting the indices from the left, you need to reverse the inputs
        String reverse = new StringBuilder(in).reverse().toString();
        // Create the actual bitsets
        BitSet b = BitSet.valueOf(new long[] { Long.parseLong(reverse, 2) });
        bitsets.add(b);
    }

    for(int i=0;i<n;i++){
        boolean equals=true;
        for(int j=1;j<bitsets.size();j++)
            equals &= bitsets.get(j-1).get(i)==bitsets.get(j).get(i);
        if(equals)
            System.out.print(bitsets.get(0).get(i)?"1":"0");
        // You can also print the indices if needed.
    }
String[]输入={“011”、“010”、“001”};
if(input.length==0)返回;
int n=输入[0]。长度();
列表位集=新的ArrayList();
for(字符串输入:输入){
//n是输入的最小长度
n=Math.min(n,in.length());
//如果从左侧开始计算索引,则需要反转输入
字符串反向=新的StringBuilder(in).reverse().toString();
//创建实际的位集
bitsetb=BitSet.valueOf(new long[]{long.parseLong(反向,2)});
位集。添加(b);
}

对于(int i=0;i您可以
所有位集并存储在两个变量中。从
MSB
LSB
同时迭代这两个变量。如果
或[i]
0
,则所有位集在第i个位置都有
0
。如果
和[i]
1
,所有位集在该位置都有
1
,否则它们是混合的。

我建议反转数字并从右侧查找父项,然后反转父项以查找真实的内容

我认为你遇到的最棘手的情况是

1101
111
1100
Common Parent: 11
倒车可以让你摆脱困境