Я бы посоветовал преобразовать строки в двоичную 16-битную длину:
A = 101
T = 010
C = 110
G = 001
Это позволяет использовать до 5 символов на 16-битную единицу.Это должно быть очень быстро по сравнению с поиском и сравнением строк.
Используйте верхний бит, чтобы определить, является ли это 4-последовательная единица или 5-последовательная единица.
Теперь вы можете выполнить быструю сортировку и получитьвсе 4 последовательности и 5 единиц последовательности в свои собственные группы (если только вам не нужно найти 4 единицы последовательности, которые частично совпадают с 5 единицами последовательности).
Для сравнения вы можете снова отсортировать, и вы обнаружите, чтовсе последовательности, начинающиеся с G, будут предшествовать последовательностям, начинающимся с T, затем A, а затем C. Затем вы можете взять последовательность и сравнить ее только с теми частями отсортированного массива, которые возможны - что должно быть намного, намного короче.Проблемное пространство.
Кроме того, причина, по которой я выбрал эти трехразрядные кодировки для последовательностей, заключается в том, что вы можете просто перезаписать две строки вместе, чтобы увидеть, совпадают ли они.Если вы получите 15 1 в последовательности, то эти два идеально совпадают.Если нет, то они этого не делают.
Вам придется выяснить антипараллельный бит - у меня есть несколько мыслей по этому поводу, но это должно помочь вам начать, и если анитопараллельная частьстановится проблемой, задайте другой вопрос.