У меня есть N строк бит (каждый из размеров M) X1 [0..M], ..., XN [0..M]. Мне нужен псевдокод/алгоритм, чтобы найти наименьшую длину подпоследовательности (не обязательно непрерывную), которая уникальна в каждой заданной строке. Например,Самая короткая уникальная подпоследовательность, которая отличает набор строк
Если строки имеют номер 011011, 011000, 010010, то подпоследовательность [2,4] (11, 10, 01) различается в каждой строке. Или подпоследовательность [2, 4, 5] (111, 100, 010). Или подпоследовательность [4, 5] (11, 00, 10).
Но не подпоследовательность [0, 1, 5] (011, 010, 010) ---> Не уникально в каждой строке.
EDIT: 1 <= M <= 1000, 2 <= N <= 10
.
EDIT: В настоящее время мое решение таково: Минимальная длина подпоследовательности будет находиться в диапазоне между ceil(log2(N))
и N-1
. Таким образом, псевдокод будет:
for i = ceil(log2(N)) to N-1 :
check all subsequence of size i
if any subsequence distinguish all N strings, return i
Первый шаг может быть сделано путем генерации всех комбинаций MCI. Второй шаг можно сделать, извлекая подпоследовательность для всех N строк и проверяя, все ли они различны. Но этот алгоритм в настоящее время является экспоненциальной сложностью. Я хотел знать, возможен ли лучший алгоритм.
EDIT: Нет, это не домашнее задание. Это было задано в интервью.
Каково приложение для этого? Звучит как домашнее задание. – MrSmith42