2016-08-07 9 views
2

Так я индексироваться членов Powerset алфавита следующим образом:Определение подмножества среди членов Powerset эффективно в Python

def bytecode_index(some_subset): 
    mask = 0 
    for index in bytearray(some_subset): 
     mask |= (1<<(index-97)) 
    return mask 

Это может быть немного нестандартным, и улучшений в отношении это очень приветствуется, но суть моего вопроса заключается в следующем:

Как я могу взять две такие маски и определить, является ли один из подмножеств другого эффективным и питоническим? Одним из таких способов определения того, является ли index1 подмножество index2, является сравнение их двоичных строк. если index1 имеет 1, где index2 имеет 0, набор, соответствующий index1, не является подмножеством множества, соответствующего index2.

Я написал то, что выглядит, как это для этого:

def compare_binary_strings(index1,index2): 

    return not any(x == "1" and y == "0" for x,y in zip(bin(index1), bin(index2))) 

Это кажется неэффективным, так как она включает в себя преобразование индексов в строки, а затем сравнивая их покомпонентны. Любая помощь очень ценится.

Есть ли более простая операция для быстрого сравнения двух индексов?

ответ

2

Ну я не знаю, о Pythonically, но в общем способ проверить, если один битовая является подмножеством другой:

(x & y) == x 

Ифф правда, x является подмножеством y.

Это просто bitmath эквивалент знакомой

A ⊆ B ⇔ A ∩ B = A