制作自己的通配符并识别模式以压缩列表

时间:2015-09-09 16:13:17

标签: algorithm wildcard

我遇到算法问题,我不知道怎么做以及如何调用它(它有没有具体名称?)

例如,如果我有这个序列:

000 CASE_01
001 CASE_02
010 CASE_03
011 CASE_02
100 CASE_02
101 CASE_01
110 CASE_01
111 CASE_01

我想用以下内容转换它:

000 CASE_01
0-1 CASE_02
010 CASE_03    
100 CASE_02
1-1 CASE_01
11- CASE_01

我称之为通配符,因为我认为这是最正确的方式...... 它们不一定有3位,你必须使用 n

如果我只有psudo代码,我可以把它写成任何语言(以我的方式使用Python)

2 个答案:

答案 0 :(得分:1)

下面的代码为输入中遇到的位数生成所有可能的通配符字符串(例如---0-10-,{{1} },00011-10 2位),还会创建数字被反转且通配符变为1的模式(所以通配符11具有模式0-1),并且掩码中数字变为1且通配符变为0(因此通配符110具有掩码0-1)。
然后输入中的二进制数与模式进行异或,并使用掩码进行AND-ed以检查它们是否适合某个通配符。如果通配符具有所需数量的匹配数字(2 ^ number_of_wildcards),则会将其添加到输出中,并从输入中删除匹配的数字。

运行代码片段以查看使用示例输入的算法,我添加了第四个具有更大二进制数的案例。



101




答案 1 :(得分:0)

首先,将输入转换为每个案例的数字列表

  

id = CASE_01,nums = [000,101,110,111]
  id = CASE_02,nums = [001,011,100]
  id = CASE_03,nums = [010]

然后,对于每个案例:

Iterate over number of possible wildcards down to 1   // e.g. 3, 2, 1
{
    Iterate over every position of the other digits   // e.g. 2: x--, -x-, --x
    {
        Iterate over every value of other digits      // e.g. x--: 0--, 1--
        {
            Iterate over every wildcard value         // e.g. 0--: 000, 001, 010, 011
            {
                If all combinations are present in this case
                {
                    Store result                      // "CASE_NN 0--"
                    Remove matching numbers from case // 000, 001, 010, 011
                }
            }
        }
    }
}

这看起来比它复杂,所以我将通过你的例子运行算法:

  

CASE_01:000,101,110,111
  3个通配符需要8个匹配=>

     

2张通配符需要4场比赛   职位:x - , - x - , - x
  模式:0 - ,1- - , - 0 - , - 1 - , - 0, - 1
  没有模式匹配所需的4个数字

     

1个通配符需要2个匹配
  位置:xx-,x-x,-xx
  模式:00-,01-,10-,11-,0-0,0-1,1-0,1-1,-00,-01,-10,-11
  模式11-有2个匹配:110,111
  存储11- CASE_01并删除110,111

     

0个通配符需要1个匹配
  职位:xxx
  模式:000,001,010,011,100,101,110,111
  模式000有1匹配:000
  存储000 CASE_01并删除000
  模式101有1个匹配:101
  存储101 CASE_01并删除101

     

CASE_02:001,011,100
  3个通配符需要8个匹配=>不可能   2个通配符需要4个匹配=>

     

1个通配符需要2个匹配
  位置:xx-,x-x,-xx
  模式:00-,01-,10-,11-,0-0,0-1,1-0,1-1,-00,-01,-10,-11
  模式0-1有2个匹配:001,011
  存储0-1 CASE_02并删除001,011

     

0个通配符需要1个匹配
  职位:xxx
  模式:000,001,010,011,100,101,110,111
  模式100有1个匹配:100
  存储100 CASE_02并删除100

     

CASE_03:010
  3个通配符需要8个匹配=>不可能   2个通配符需要4个匹配=>不可能   1个通配符需要2个匹配=>

     

0个通配符需要1个匹配
  职位:xxx
  模式:000,001,010,011,100,101,110,111
  pattern 010有1匹配:010
  存储010 CASE_03并删除010

     

<强> RESULT
  11- CASE_01
  000 CASE_01
  101 CASE_01
  0-1 CASE_02
  100 CASE_02
  010 CASE_03

相关问题