Я предполагаю, что у вас есть один X и один Y для сравнения. Объедините их, разделенные символом маркера, который не появляется ни в одном, чтобы сформировать, например. XoY. Теперь сформируйте http://en.wikipedia.org/wiki/Suffix_array в линейном времени.
То, что вы получаете, представляет собой массив указателей на позиции в конкатенированной строке, где указатели расположены так, что подстроки, на которые они указывают, отображаются в алфавитном порядке в массиве. Вы также получаете массив LCP, предоставляя длину самого длинного общего префикса, совместно используемого между суффиксом и суффиксом, непосредственно перед ним в массиве, который является суффиксом, который сортируется меньше, чем он. На самом деле это самый длинный общий префикс, разделяемый этой позицией, и ЛЮБАЯ подстрока меньше, чем это, потому что все с более длинным общим префиксом и меньше строки [i] будет сортировать между ним и текущей строкой [i-1].
Вы можете указать, из какой исходной строки указатель указывает на ее позицию, потому что X идет до Y. Вы можете вырезать массив на чередующиеся подразделы указателей X и Y. Длина общего префикса, разделяемого между pos [i] и pos [i-1], равна lcp [i]. Длина префикса, разделяемого между pos [i] и pos [i-2], равна min (lcp [i], lcp [i-1]). Поэтому, если вы начинаете с значения Y непосредственно перед диапазоном Xs, вы можете выработать количество символов префикса между этим Y и всеми Xs в свою очередь, отступив в раздел, выполнив минимальную операцию на каждом шаге. Аналогичным образом вы можете определить количество символов префикса, разделяемых между всеми этими Xs и Y, которое появляется далее в массиве суффиксов, за одну минуту на X. То же самое, конечно, для диапазонов Y. Теперь сделайте максимум для каждой записи, чтобы выработать самый длинный префикс, разделяемый между каждой позицией в X (или Y) и любой позиции в Y (или X).
Я думаю, что вы хотите, чтобы подстроки внутри X или Y имели небольшие префиксы, разделяемые между ним и любой другой подстрокой другого пола, потому что строки одного символа дольше, чем это, начиная с той же позиции, не отображаются в другом секс вообще.Я думаю, как только вы выполнили вычисления min() выше, вы можете извлечь N наименьших префиксных подстрок, используя кучу, чтобы отслеживать N наименьших записей. Я думаю, что все здесь занимает время, линейное в | X | + | Y | (если N не сравнимо с | X | или | Y |).
Wow! Холодный вопрос. –
Как вы определяете уникальность? Скажите, что последовательности: «ATCCCGACCGATCAGT» и «ATCCCGACGGACCAGT», каков ваш ожидаемый результат? – NullUserException
@NullUser Я или один из моих коллег вернутся к вам. – person