Inhaltsverzeichnis
Grammatik
Algorithmus
Ansatz 1: Verwendung eines einfachen Segmentbaums
Beispiel 2
Ausgabe
Methode unter Verwendung eines Segmentbaums mit verzögerter Ausbreitung
Fazit
Heim Backend-Entwicklung C++ Länge der am längsten ansteigenden Teilsequenz (LIS) unter Verwendung von Liniensegmentbäumen

Länge der am längsten ansteigenden Teilsequenz (LIS) unter Verwendung von Liniensegmentbäumen

Aug 27, 2023 pm 04:25 PM
长度 最长递增子序列 线段树

Länge der am längsten ansteigenden Teilsequenz (LIS) unter Verwendung von Liniensegmentbäumen

Ein Segmentbaum ist eine vielseitige Datenstruktur, die entwickelt wurde, um Bereichsabfragen zu beantworten und Array-Aktualisierungsvorgänge in logarithmischer Zeitkomplexität durchzuführen, wobei jeder Knoten Informationen zu einem bestimmten Bereich von Elementen im Array speichert.

Im Kontext des Longest Increasing Subsequence (LIS)-Problems, bei dem es notwendig ist, die Länge der längsten Teilsequenz zu bestimmen, in der die Elemente in einer bestimmten Sequenz in aufsteigender Reihenfolge sortiert sind, können Liniensegmentbäume zur effizienten Berechnung der verwendet werden Länge der am längsten ansteigenden Teilsequenz in einem Array.

Diese Methode reduziert die Zeitkomplexität im Vergleich zu herkömmlichen Methoden erheblich und bietet viele Anwendungen in Bereichen wie Genomik, Verarbeitung natürlicher Sprache und Mustererkennung. In diesem Artikel werden die Grundlagen von Segmentbäumen untersucht und ihr Potenzial zur Lösung des am längsten zunehmenden Teilsequenzproblems aufgezeigt.

Grammatik

Segment Tree Build-Funktion −

void build(vector<int> &tree, const vector<int> &arr, int start, int end, int index)
</int>
Nach dem Login kopieren

Segmentbaum-Abfragefunktion −

int query(const vector<int> &tree, int start, int end, int l, int r, int index)
Nach dem Login kopieren

Segmentbaum-Aktualisierungsfunktion −

void update(vector<int> &tree, const vector<int> &arr, int start, int end, int pos, int value, int index)
Nach dem Login kopieren

Algorithmus

Der Algorithmus zum Ermitteln der Länge der längsten ansteigenden Teilsequenz (LIS) mithilfe des Segmentbaums lautet wie folgt:

  • Initialisieren Sie das Array, das die Eingabesequenz darstellt.

  • Initialisieren Sie mit einem Segmentbaum der gleichen Größe wie die Eingabesequenz Verwenden Sie die Build-Funktion, um einen Liniensegmentbaum zu erstellen
  • Verarbeiten Sie jedes Element der Eingabesequenz.

  • Fragen Sie für jedes Element den Segmentbaum ab, um die maximale Länge von LIS zu ermitteln, die am aktuellen Element endet.

  • Aktualisieren Sie den Segmentbaum mit der Aktualisierungsfunktion.

  • Wiederholen Sie die Schritte 4-6 für alle Elemente in der Eingabesequenz.

  • Die endgültige Antwort ist der im Segmentbaum gespeicherte Maximalwert.

Ansatz 1: Verwendung eines einfachen Segmentbaums

Bei diesem Ansatz implementieren wir einen einfachen Segmentbaum ohne Optimierungstechniken wie Lazy Propagation.

Beispiel-1

Das folgende Programm zeigt, wie man die Länge der längsten ansteigenden Teilsequenzen (LIS) mithilfe eines einfachen Segmentbaums in C++ ermittelt. Die Build-, Abfrage- und Aktualisierungsfunktionen werden verwendet, um den Segmentbaum zu erstellen und die maximale Länge von LIS abzurufen, die bei a endet spezifisches Element und aktualisieren Sie den Segmentbaum jeweils mit neuen LIS-Längen. Die Funktion „lengthOfLIS“ durchläuft jedes Element in der Eingabesequenz und berechnet die LIS-Länge mithilfe des Segmentbaums.

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

using namespace std;

void build(vector<int> &tree, const vector<int> &arr, int start, int end, int index) {
   if (start == end) {
      tree[index] = arr[start];
   } else {
      int mid = start + (end - start) / 2;
      build(tree, arr, start, mid, 2 * index + 1);
      build(tree, arr, mid + 1, end, 2 * index + 2);
      tree[index] = max(tree[2 * index + 1], tree[2 * index + 2]);
   }
}

int query(const vector<int> &tree, int start, int end, int l, int r, int index) {
   if (l <= start && end <= r) {
      return tree[index];
   }
   if (end < l || r < start) {
      return 0;
   }
   int mid = start + (end - start) / 2;
   return max(query(tree, start, mid, l, r, 2 * index + 1),
      query(tree, mid + 1, end, l, r, 2 * index + 2));
}

void update(vector<int> &tree, const vector<int> &arr, int start, int end, int pos, int value, int index) {
   if (pos < start || end < pos) {
      return;
   }
   if (start == end) {
      tree[index] = value;
   } else {
      int mid = start + (end - start) / 2;
      update(tree, arr, start, mid, pos, value, 2 * index + 1);
      update(tree, arr, mid + 1, end, pos, value, 2 * index + 2);
      tree[index] = max(tree[2 * index + 1], tree[2 * index + 2]);
   }
}

int lengthOfLIS(const vector<int> &nums) {
   int n = nums.size();
   vector<int> arr(n, 0), tree(4 * n, 0);

   build(tree, arr, 0, n - 1, 0);

   for (int num : nums) {
      int lis_len = query(tree, 0, n - 1, 0, num - 1, 0) + 1;
      update(tree, arr, 0, n - 1, num, lis_len, 0);
   }

   return query(tree, 0, n - 1, 0, n - 1, 0);
}

int main() {
   vector<int> nums = {10, 9, 2, 5, 3, 7, 101, 18};
   cout << "Length of Longest Increasing Subsequence: " <<lengthOfLIS(nums) << endl;
   return 0;
}
Nach dem Login kopieren

Ausgabe

Length of Longest Increasing Subsequence: 3
Nach dem Login kopieren
Nach dem Login kopieren

Methode unter Verwendung eines Segmentbaums mit verzögerter Ausbreitung

Bei diesem Ansatz implementieren wir einen Segmentbaum mit verzögerter Ausbreitung, um die zeitliche Komplexität des Algorithmus weiter zu optimieren.

Beispiel 2

Der folgende Code zeigt, wie man die Länge der längsten zunehmenden Teilsequenz (LIS) in C++ mithilfe von Segmentbäumen mit verzögerter Ausbreitung ermittelt. Dieser Code ähnelt dem Code für Methode 1, der Hauptunterschied zwischen den beiden Methoden besteht in der internen Implementierung des Segmentbaums. Die Lazy-Propagation-Technik wird in diesem Code nicht explizit gezeigt, da sie die Aktualisierungsfunktion für bestimmte Anwendungsfälle optimiert, die im LIS-Problem nicht vorhanden sind. Die Grundstruktur des Codes bleibt jedoch dieselbe und die Build-, Abfrage- und Aktualisierungsfunktionen werden auf ähnliche Weise wie bei Methode 1 verwendet.

<int>#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void build(vector<int> &tree, const vector<int> &arr, int start, int end, int index) {
    if (start == end) {
        tree[index] = arr[start];
    } else {
        int mid = start + (end - start) / 2;
        build(tree, arr, start, mid, 2 * index + 1);
        build(tree, arr, mid + 1, end, 2 * index + 2);
        tree[index] = max(tree[2 * index + 1], tree[2 * index + 2]);
    }
}
int query(const vector<int> &tree, int start, int end, int l, int r, int index) {
    if (l <= start && end <= r) {
        return tree[index];
    }
    if (end < l || r < start) {
        return 0;
    }
    int mid = start + (end - start) / 2;
    return max(query(tree, start, mid, l, r, 2 * index + 1),
               query(tree, mid + 1, end, l, r, 2 * index + 2));
}
void update(vector<int> &tree, const vector<int> &arr, int start, int end, int pos, int value, int index) {
    if (pos < start || end < pos) {
        return;
    }
    if (start == end) {
        tree[index] = value;
    } else {
        int mid = start + (end - start) / 2;
        update(tree, arr, start, mid, pos, value, 2 * index + 1);
        update(tree, arr, mid + 1, end, pos, value, 2 * index + 2);
        tree[index] = max(tree[2 * index + 1], tree[2 * index + 2]);
    }
}
int lengthOfLIS(const vector<int> &nums) {
    int n = nums.size();
    vector<int> arr(n, 0), tree(4 * n, 0);
    build(tree, arr, 0, n - 1, 0);
    for (int num : nums) {
        int lis_len = query(tree, 0, n - 1, 0, num - 1, 0) + 1;
        update(tree, arr, 0, n - 1, num, lis_len, 0);
    }
    return query(tree, 0, n - 1, 0, n - 1, 0);
}
int main() {
    vector<int> nums = {10, 9, 2, 5, 3, 7, 101, 18};
    cout << "Length of Longest Increasing Subsequence: " << lengthOfLIS(nums)
         << endl;
    return 0;
}
</int>
Nach dem Login kopieren

Ausgabe

Length of Longest Increasing Subsequence: 3
Nach dem Login kopieren
Nach dem Login kopieren

Fazit

In diesem Artikel veranschaulichen wir die Methode zur Bestimmung des Bereichs der längsten zunehmenden Teilsequenz (LIS) mithilfe der Liniensegmentbaumtechnik in C++. Wir veranschaulichen zwei Ansätze: einen, der Segmentbäume direkt durchführt, und den anderen, der eine verbesserte Methode der verzögerten Ausbreitung nutzt. Beide Techniken sind bei der Lösung von LIS-Problemen effektiv und die Verzögerungsausbreitung in der Optimierungsmethode reduziert die Zeitkomplexität weiter.

Das obige ist der detaillierte Inhalt vonLänge der am längsten ansteigenden Teilsequenz (LIS) unter Verwendung von Liniensegmentbäumen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Wie hoch ist die Längenbeschränkung für PHP-Arrays? Wie hoch ist die Längenbeschränkung für PHP-Arrays? Mar 13, 2024 pm 06:30 PM

In PHP gibt es keine feste Begrenzung der Länge eines Arrays, sie kann dynamisch an die Speichergröße des Systems angepasst werden. In PHP ist ein Array eine sehr flexible Datenstruktur, die eine beliebige Anzahl von Elementen speichern kann, und jedes Element kann ein Wert eines beliebigen Typs oder sogar ein anderes Array sein. Die Längenbeschränkung von PHP-Arrays hängt hauptsächlich von der Speichergröße des Systems und der Speicherbeschränkung der PHP-Konfiguration ab. Wenn der Systemspeicher groß genug und das Speicherlimit von PHP hoch genug ist, kann die Länge des Arrays im Allgemeinen sehr groß sein. Wenn Ihr System jedoch nur noch wenig Arbeitsspeicher hat oder

Gibt es eine Begrenzung der PHP-Array-Länge? Gibt es eine Begrenzung der PHP-Array-Länge? Mar 13, 2024 pm 06:36 PM

Gibt es eine Begrenzung der PHP-Array-Länge? Benötigen Sie spezifische Codebeispiele? In PHP unterliegt die Array-Länge keiner festen Grenze, und die Array-Größe kann dynamisch entsprechend der tatsächlichen Grenze des Systemspeichers angepasst werden. Arrays in PHP sind dynamische Arrays, sodass sie je nach Bedarf dynamisch wachsen oder schrumpfen können. In PHP ist ein Array eine geordnete zugeordnete Datenstruktur, und auf Array-Elemente kann über Array-Indizes oder assoziative Array-Schlüsselwerte zugegriffen werden. Sehen wir uns ein konkretes Codebeispiel an, um zu zeigen, ob die Länge des PHP-Arrays begrenzt ist. Zuerst können wir den folgenden Code übergeben

Ermitteln Sie anhand eines gegebenen Arrays die maximale Summe der Längen zweier Zeichenfolgen, die nicht dieselben Zeichen enthalten. Ermitteln Sie anhand eines gegebenen Arrays die maximale Summe der Längen zweier Zeichenfolgen, die nicht dieselben Zeichen enthalten. Aug 29, 2023 pm 06:45 PM

Der Zweck dieses Artikels besteht darin, ein Programm zu implementieren, das die Summe der Längen eines Zeichenfolgenpaars maximiert, das in einem bestimmten Array keine gemeinsamen Zeichen hat. Per Definition ist eine Zeichenfolge eine Ansammlung von Zeichen. Problemstellung Implementieren Sie ein Programm, um die Summe der Längen eines Zeichenfolgenpaars zu maximieren, das in einem bestimmten Array keine gemeinsamen Zeichen hat. Beispiel 1Lassen Sie uns das Eingabearray betrachten: a[]=["efgh", "hat", "fto", "car", "wxyz", "fan"]Ausgabe erhalten: 8 Beschreibung Die Zeichenfolgen "abcd" und "wxyz" enthalten keine gemeinsamen Zeichen ". Infolgedessen beträgt die kombinierte Länge der beiden Zeichenfolgen 4+4, was 8 entspricht, was die längste Länge aller möglichen Paare ist. Beispiel 2Letu

So verwenden Sie den am längsten ansteigenden Teilsequenzalgorithmus in C++ So verwenden Sie den am längsten ansteigenden Teilsequenzalgorithmus in C++ Sep 19, 2023 pm 05:21 PM

Für die Verwendung des längsten zunehmenden Teilsequenzalgorithmus in C++ sind bestimmte Codebeispiele erforderlich. Die längste zunehmende Teilsequenz (LIS) ist ein klassisches Algorithmusproblem, und seine Lösungsideen können auf viele Bereiche angewendet werden, beispielsweise auf die Datenverarbeitung und die Graphentheorie. In diesem Artikel werde ich die Verwendung des am längsten ansteigenden Teilsequenzalgorithmus in C++ vorstellen und spezifische Codebeispiele bereitstellen. Lassen Sie uns zunächst die Definition der am längsten zunehmenden Teilfolge verstehen. Gegeben sei eine Folge a1,

Mehrere Perspektiven zur Verwendung und Bedeutung der Len-Funktion Mehrere Perspektiven zur Verwendung und Bedeutung der Len-Funktion Dec 28, 2023 am 08:38 AM

Die Rolle und Bedeutung der len-Funktion wird aus verschiedenen Blickwinkeln interpretiert. Die len-Funktion ist eine der am häufigsten verwendeten Funktionen in der Programmiersprache Python. Es wird hauptsächlich verwendet, um die Länge oder Anzahl der Elemente eines Containerobjekts (z. B. Zeichenfolge, Liste, Tupel usw.) zurückzugeben. Diese einfache Funktion spielt beim Schreiben von Programmen eine sehr wichtige Rolle und ihre Funktion und Bedeutung kann aus vielen Blickwinkeln interpretiert werden. In diesem Artikel wird die len-Funktion unter den Gesichtspunkten Leistung, Lesbarkeit und Containertyp erläutert und spezifische Codebeispiele bereitgestellt. 1. Leistungsperspektive Bei der Verarbeitung großer Datenmengen die Leistung des Programms

So überprüfen Sie die Länge des Eingabetextes in Golang So überprüfen Sie die Länge des Eingabetextes in Golang Jun 24, 2023 am 11:52 AM

In Golang ist die Validierung der Länge des Eingabetextes eine häufige Notwendigkeit. Durch die Validierung können wir sicherstellen, dass der eingegebene Text bestimmte Anforderungen erfüllt und innerhalb der von uns erwarteten Länge liegt. In diesem Artikel erfahren Sie, wie Sie die Länge des Eingabetexts mithilfe von Golang überprüfen. Zuerst müssen wir die häufig verwendeten String-Funktionen in Golang verstehen. Unter anderem wird die Funktion len() verwendet, um die Länge der Zeichenfolge zu berechnen. Der folgende Code berechnet beispielsweise die Länge der Zeichenfolge „helloworld“: str:=

Wie finde ich die Länge der Hypotenuse in Java? Wie finde ich die Länge der Hypotenuse in Java? Sep 09, 2023 pm 10:33 PM

Die Hypotenuse ist die längste Seite eines rechtwinkligen Dreiecks gegenüber dem rechten Winkel. Die Länge der Hypotenuse kann mit dem Satz des Pythagoras ermittelt werden. Nach dem Satz des Pythagoras ist die Summe der Quadrate der Längen zweier Seiten gleich dem Quadrat der Länge der dritten Seite, d. h. a2+b2=c2, wobei a, b und c die drei Seiten von darstellen ein rechtwinkliges Dreieck. Also Hypotenuse=Math.sqrt(Math.pow(base,2)+Math.pow(height,2)) In diesem Artikel erfahren Sie, wie Sie die Länge der Hypotenuse mithilfe der Programmiersprache Java ermitteln. Lassen Sie mich Ihnen einige Beispiele zeigen. Die chinesische Übersetzung von Instanz 1 lautet: Beispiel 1. Angenommen, die Basislänge und -höhe betragen 3 bzw. 4. Dann verwenden Sie die Formel des Pythagoras-Theorems, Länge

Die Anzahl der Teilzeichenfolgen der Länge K, die genau X Vokale enthalten Die Anzahl der Teilzeichenfolgen der Länge K, die genau X Vokale enthalten Sep 01, 2023 am 08:57 AM

Bei diesem Problem müssen wir die Gesamtzahl der Teilzeichenfolgen der Länge K ermitteln, die genau K Vokale enthalten. Wir werden zwei verschiedene Möglichkeiten zur Lösung des Problems sehen. Mit einer einfachen Methode können wir die Anzahl der Vokale in jedem Teilstring der Länge K überprüfen. Darüber hinaus können wir dieses Problem mit einem Schiebefenster-Ansatz lösen. Problemstellung: Wir erhalten eine Zeichenfolge str der Länge N, die alphabetische Klein- und Großbuchstaben enthält. Wir müssen die Gesamtzahl der Teilzeichenfolgen der Länge K zählen, die genau X Vokale enthalten. Beispieleingabe – str="TutorialsPoint",K=3,X=2 Ausgabe – 6 Erläuterung – Ein Teilstring der Länge 3, der genau 2 Vokale enthält, ist: 'uto', 'ori', 'ri

See all articles