7.2: Вирівнювання грубої сили
Один (поганий) підхід до вирівнювання послідовностей полягає у вирівнюванні двох послідовностей усіма можливими способами, оцінка вирівнювання за передбачуваною системою балів та визначення найвищого вирівнювання балів. Проблема цього підходу грубої сили полягає в тому, що кількість можливих вирівнювань зростає експоненціально з довжиною послідовності; а для послідовностей розумної довжини обчислення вже неможливо. Наприклад, кількість способів вирівнювання двох послідовностей по 50 символів кожна - досить невелика проблема вирівнювання - це приблизно1.5×1037, вже дивно велика кількість. Інформативно підрахувати кількість можливих вирівнювань між двома послідовностями, оскільки подібний алгоритм використовується для вирівнювання послідовностей.
Припустимо, ми хочемо вирівняти дві послідовності. Зазори в будь-якій послідовності допускаються, але зазор не може бути вирівняний з зазором. Для ілюстрації ми демонструємо три способи вирівнювання першого символу алфавіту верхнього регістру та алфавіту нижнього регістру:
і п'ять способів, за допомогою яких перші два символи алфавіту у верхньому регістрі можуть вирівнюватися з першим символом алфавіту нижнього регістру:
Відношення рекурсії для загальної кількості можливих вирівнювання послідовностіi символів з послідовністюj символів може бути виведено, враховуючи вирівнювання останнього символу. Є три можливості, які ми проілюструємо,i припускаючи, що символF «»,j а символ - «d»:
(1)i−1 символи першої послідовності вже вирівняні зj−1 символами другої послідовності, аi й символ першої послідовності точно вирівнюється зj символом другої послідовності:
(2)i−1 символи першої послідовності вирівнюються зj символами другої послідовності, аi й символ першої послідовності вирівнюється з проміжком у другій послідовності
(3)i символи першої послідовності вирівнюються зj−1 символами другої послідовності, а пробіл у першій послідовності вирівнюється зj символом другої послідовності iil
⋯d
ЯкщоC(i,j) кількість способів вирівняти послідовністьi символів з послідовністюj символів, то, з нашого підрахунку,
C(i,j)=C(i−1,j−1)+C(i−1,j)+C(i,j−1)
Цей рекурсійний зв'язок вимагає граничних умов. Оскільки існує лише один спосіб вирівняти послідовністьi>0 символів із нульовою послідовністю символів (тобтоi символів протиi прогалин), граничні умови єC(0,j)=C(i,0)=1 для всіхi,j>0 Ми також можемо додати додаткові гранична умоваC(0,0)=1, отримана з відомого результатуC(1,1)=3.
Використовуючи рекурсійне відношення (7.1), ми можемо побудувати наступну динамічну матрицю для підрахунку кількості способів вирівнювання двох п'ятисимвольних послідовностейa1a2a3a4a5 іb1b2b3b4b5:
−b1b2b3b4b5−111111a11357911a21513254161a3172563129231a41941129321681a5111612316811683
Розмір цієї динамічної матриці є6×6, і для зручності ми маркуємо рядки і стовпці, починаючи з нуля (тобто рядок 0, рядок1,…, рядок 5). Ця матриця була побудована шляхом спочатку запису−a1a2a3a4a5 зліва від матриці і−b1b2b3b4b5 над матрицею, потім заповнення одиниць через нульовий рядок і вниз по нульовому стовпчику, щоб задовольнити граничні умови, і, нарешті, застосовуючи рекурсивне відношення безпосередньо, йдучи поперек першого рядка зліва направо, другий рядок зліва направо і т.д. щоб продемонструвати заповнення матриці, ми маємо поперек першого рядка:1+1+1=3,1+1+3=5,1+1+5=7, etc, і через другий рядок:1+3+1=5,3+5+5=13,5+7+13=25, і т.д., Нарешті, останній введений елемент дає кількість способів вирівнювання дві п'ять послідовностей символів: 1683, вже надзвичайно велика кількість.
Можна аналітично розв'язати рекурсійне відношення (7.1) дляC(i,j) використання генеруючих функцій. Хоча метод вирішення цікавий - і насправді мені показав студент-підсумковий аналітичний результат безладний і ми його тут опускаємо. Загалом, обчисленняC(i,j) найкраще проводити чисельно шляхом побудови динамічної матриці.