Needleman-Wunsch-algoritmus

Üdvözlöm, Ön a Needleman-Wunsch-algoritmus szó jelentését keresi. A DICTIOUS-ban nem csak a Needleman-Wunsch-algoritmus szó összes szótári jelentését megtalálod, hanem megismerheted az etimológiáját, a jellemzőit és azt is, hogyan kell a Needleman-Wunsch-algoritmus szót egyes és többes számban mondani. Minden, amit a Needleman-Wunsch-algoritmus szóról tudni kell, itt található. A Needleman-Wunsch-algoritmus szó meghatározása segít abban, hogy pontosabban és helyesebben fogalmazz, amikor beszélsz vagy írsz. ANeedleman-Wunsch-algoritmus és más szavak definíciójának ismerete gazdagítja a szókincsedet, és több és jobb nyelvi forráshoz juttat.

Kiejtés

  • IPA:

Főnév

Needleman-Wunsch-algoritmus

  1. (matematika)

Needleman-Wunsch-algoritmus

A **Needleman-Wunsch-algoritmus** egy dinamikus programozási módszer, amelyet két szekvencia (például DNS, fehérjék vagy általános karakterláncok) globális illesztésére fejlesztettek ki. A cél az, hogy a két szekvencia közötti optimális igazítást találjuk meg, figyelembe véve illesztési pontokat, szakadékokat (gap-eket) és helyettesítési költségeket.

Fő jellemzők

  1. Bemenet:
  - Két szekvencia:  és .
  - Hasonlósági vagy helyettesítési mátrix ().
  - Szakadék (gap) költség ().
  1. Kimenet:
  - Az optimális globális illesztés  és , ahol az illesztés pontszáma maximális.
  1. Kulcslépések:
  - Dinamikus programozási táblázat létrehozása az optimális pontszám kiszámítására.
  - Az optimális út visszafejtése az illesztés rekonstrukciójához.
  1. Időbonyolultság:
  - , ahol  és  a két szekvencia hossza.

Algoritmus lépései

1. Pontszámtábla inicializálása

  • Hozz létre egy méretű táblát, ahol és a szekvenciák hossza.
  • Töltsd ki az első sort és oszlopot a szakadékköltségek halmozásával:

2. Pontszámítás

  • Minden cella a következő szabály alapján töltődik ki:

3. Illesztés visszafejtése

  • Kezdj az -nél, és haladj visszafelé a táblán:
 - Ha , akkor  és  illeszkedik.
 - Ha , akkor  gap-et kap.
 - Ha , akkor  gap-et kap.

Python Implementáció

import numpy as np

def needleman_wunsch(seq1, seq2, match=1, mismatch=-1, gap=-2):
    """
    Needleman-Wunsch algoritmus implementációja.
    """
    m, n = len(seq1), len(seq2)
    score = np.zeros((m+1, n+1), dtype=int)

    for i in range(1, m+1):
        score = i * gap
    for j in range(1, n+1):
        score = j * gap

    for i in range(1, m+1):
        for j in range(1, n+1):
            match_mismatch = score + (match if seq1 == seq2 else mismatch)
            insert = score + gap
            delete = score + gap
            score = max(match_mismatch, insert, delete)

    aligned_seq1, aligned_seq2 = "", ""
    i, j = m, n
    while i > 0 and j > 0:
        current_score = score
        if current_score == score + (match if seq1 == seq2 else mismatch):
            aligned_seq1 = seq1 + aligned_seq1
            aligned_seq2 = seq2 + aligned_seq2
            i -= 1
            j -= 1
        elif current_score == score + gap:
            aligned_seq1 = seq1 + aligned_seq1
            aligned_seq2 = "-" + aligned_seq2
            i -= 1
        else:
            aligned_seq1 = "-" + aligned_seq1
            aligned_seq2 = seq2 + aligned_seq2
            j -= 1

    while i > 0:
        aligned_seq1 = seq1 + aligned_seq1
        aligned_seq2 = "-" + aligned_seq2
        i -= 1
    while j > 0:
        aligned_seq1 = "-" + aligned_seq1
        aligned_seq2 = seq2 + aligned_seq2
        j -= 1

    return score, aligned_seq1, aligned_seq2

seq1 = "GATTACA"
seq2 = "GCATGCU"
score, aligned_seq1, aligned_seq2 = needleman_wunsch(seq1, seq2)
print(f"Pontszám: {score}")
print(f"Illesztett szekvenciák:\n{aligned_seq1}\n{aligned_seq2}")

C++ Implementáció

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

int needlemanWunsch(const string& seq1, const string& seq2, int match, int mismatch, int gap, string& alignedSeq1, string& alignedSeq2) {
    int m = seq1.size(), n = seq2.size();
    vector<vector<int>> score(m + 1, vector<int>(n + 1, 0));

    for (int i = 1; i <= m; i++) score = i * gap;
    for (int j = 1; j <= n; j++) score = j * gap;

    for (int i = 1; i <= m; i++) {
        for (int j = 1; j <= n; j++) {
            int matchMismatch = score + (seq1 == seq2 ? match : mismatch);
            int insert = score + gap;
            int delete_ = score + gap;
            score = max({matchMismatch, insert, delete_});
        }
    }

    int i = m, j = n;
    alignedSeq1 = "";
    alignedSeq2 = "";
    while (i > 0 && j > 0) {
        if (score == score + (seq1 == seq2 ? match : mismatch)) {
            alignedSeq1 = seq1 + alignedSeq1;
            alignedSeq2 = seq2 + alignedSeq2;
            i--; j--;
        } else if (score == score + gap) {
            alignedSeq1 = seq1 + alignedSeq1;
            alignedSeq2 = "-" + alignedSeq2;
            i--;
        } else {
            alignedSeq1 = "-" + alignedSeq1;
            alignedSeq2 = seq2 + alignedSeq2;
            j--;
        }
    }

    while (i > 0) {
        alignedSeq1 = seq1 + alignedSeq1;
        alignedSeq2 = "-" + alignedSeq2;
        i--;
    }
    while (j > 0) {
        alignedSeq1 = "-" + alignedSeq1;
        alignedSeq2 = seq2 + alignedSeq2;
        j--;
    }

    return score;
}

int main() {
    string seq1 = "GATTACA";
    string seq2 = "GCATGCU";
    string alignedSeq1, alignedSeq2;

    int score = needlemanWunsch(seq1, seq2, 1, -1, -2, alignedSeq1, alignedSeq2);

    cout << "Pontszám: " << score << endl;
    cout << "Illesztett szekvenciák:\n" << alignedSeq1 << "\n" << alignedSeq2 << endl;

    return 0;
}

Alkalmazások

  1. Bioinformatika: DNS, RNS és fehérjeszekvenciák illesztése.
  2. Szövegfeldolgozás: Szerkesztési távolság számítása.
  3. Verziókezelő rendszerek: Különbségek azonosítása fájlok között.

Fordítások