У меня есть два набора строк (A
и B
), и я хочу знать все пары строк a in A
и b in B
, где A
- подстрока B
.
Первым этапом кодирования было следующее:
for a in A:
for b in B:
if a in b:
print (a,b)
Однако, я хотел знать, есть ли более эффективный способ сделать это с помощью регулярных выражений (например, вместо проверки if a in b:
, проверьте, соответствует ли regexp '.*' + a + '.*':
"b". Я думал, что, возможно, например, это позволит мне кэшировать функцию Knuth-Morris-Pratt для всех A
. Кроме того, используя понимание списка для внутреннего for b in B:
, скорее всего, даст довольно большой ускорение (и понимание вложенного списка может быть еще лучше).
Мне не очень интересно совершить гигантский скачок в асимптотической среде выполнения алгоритма (например, используя дерево суффикса или что-то еще сложное и умное). Меня больше интересует константа (мне просто нужно сделать это для нескольких пар наборов A
и B
, и я не хочу, чтобы она запускалась всю неделю).
Знаете ли вы какие-либо трюки или имеете какие-либо общие советы, чтобы сделать это быстрее? Большое спасибо за любую информацию, которую вы можете поделиться!
Edit:
Используя советы @ninjagecko и @Sven Marnach, я построил быструю таблицу префиксов 10-мер:
import collections
prefix_table = collections.defaultdict(set)
for k, b in enumerate(B):
for i in xrange(len(prot_seq)-10):
j = i+10+1
prefix_table[b[i:j]].add(k)
for a in A:
if len(a) >= 10:
for k in prefix_table[a[:10]]:
# check if a is in b
# (missing_edges is necessary, but not sufficient)
if a in B[k]:
print (a,b)
else:
for k in xrange(len(prots_and_seqs)):
# a is too small to use the table; check if
# a is in any b
if a in B[k]:
print (a, b)