


Longueur de la sous-séquence croissante la plus longue (LIS) à l'aide d'arbres de segments de ligne
Un arbre de segments est une structure de données polyvalente conçue pour répondre aux requêtes de plage et effectuer des opérations de mise à jour de tableau dans une complexité temporelle logarithmique, où chaque nœud stocke des informations liées à une plage spécifique d'éléments du tableau.
Dans le contexte du problème de la sous-séquence croissante la plus longue (LIS), où il est nécessaire de déterminer la longueur de la sous-séquence la plus longue dans laquelle les éléments d'une séquence donnée sont triés par ordre croissant, les arbres de segments de droite peuvent être utilisés pour calculer efficacement la longueur de la sous-séquence croissante la plus longue dans un tableau.
Cette méthode réduit considérablement la complexité temporelle par rapport aux méthodes traditionnelles et a de nombreuses applications dans des domaines tels que la génomique, le traitement du langage naturel et la reconnaissance de formes. Cet article explore les principes fondamentaux des arbres de segments et démontre leur potentiel dans la résolution du problème de sous-séquence croissante la plus longue.
Grammaire
Fonction de construction d'arborescence de segments −
void build(vector<int> &tree, const vector<int> &arr, int start, int end, int index) </int>
Fonction de requête d'arborescence de segments −
int query(const vector<int> &tree, int start, int end, int l, int r, int index)
Fonction de mise à jour de l'arborescence des segments −
void update(vector<int> &tree, const vector<int> &arr, int start, int end, int pos, int value, int index)
Algorithme
L'algorithme pour trouver la longueur de la sous-séquence croissante (LIS) la plus longue à l'aide d'un arbre de segments est le suivant -
Initialisez le tableau représentant la séquence d'entrée.
Initialiser avec un arbre de segments de la même taille que la séquence d'entrée
Utilisez la fonction build pour créer une arborescence de segments de ligne
Traitez chaque élément de la séquence d'entrée.
Pour chaque élément, interrogez l'arborescence de segments pour trouver la longueur maximale du LIS se terminant à l'élément actuel.
Mettez à jour l'arborescence des segments à l'aide de la fonction de mise à jour.
Répétez les étapes 4 à 6 pour tous les éléments de la séquence de saisie.
La réponse finale est la valeur maximale stockée dans l'arborescence des segments.
Approche 1 : Utiliser une arborescence de segments simple
Dans cette approche, nous implémentons un simple arbre de segments sans aucune technique d'optimisation telle que la propagation paresseuse.
Exemple-1
Le programme ci-dessous montre comment trouver la longueur des sous-séquences croissantes (LIS) les plus longues à l'aide d'un simple arbre de segments en C++. Les fonctions de construction, de requête et de mise à jour sont utilisées pour construire l'arbre de segments et récupérer la longueur maximale du LIS se terminant par un. élément spécifique et mettez à jour l'arborescence de segments avec de nouvelles longueurs LIS, respectivement. La fonction lengthOfLIS parcourt chaque élément de la séquence d'entrée et calcule la longueur LIS à l'aide de l'arborescence de segments.
#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; }
Sortie
Length of Longest Increasing Subsequence: 3
Méthode utilisant un arbre à segments à propagation retardée
Dans cette approche, nous implémentons un arbre de segments avec propagation paresseuse pour optimiser davantage la complexité temporelle de l'algorithme.
Exemple 2
Le code ci-dessous montre comment trouver la longueur de la sous-séquence croissante (LIS) la plus longue en C++ à l'aide d'arbres de segments à propagation retardée. Ce code est similaire au code de la méthode 1, la principale différence entre les deux méthodes est l'implémentation interne de l'arborescence des segments. La technique de propagation paresseuse n'est pas explicitement présentée dans ce code car elle optimise la fonction de mise à jour pour des cas d'utilisation spécifiques qui n'existent pas dans le problème LIS. Cependant, la structure de base du code reste la même et les fonctions de génération, de requête et de mise à jour sont utilisées de la même manière que la méthode 1.
<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>
Sortie
Length of Longest Increasing Subsequence: 3
Conclusion
Dans cet article, nous illustrons la méthode de détermination de la plage de la sous-séquence croissante la plus longue (LIS) grâce à la technique de l'arbre de segment de ligne en C++. Nous illustrons deux approches : l'une qui réalise directement des arbres de segments, et l'autre qui exploite une méthode améliorée de propagation retardée. Les deux techniques sont efficaces pour résoudre les problèmes de LIS, et la propagation du retard dans la méthode d'optimisation réduit encore davantage la complexité temporelle.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Il n'y a pas de limite fixe à la longueur d'un tableau en PHP, elle peut être ajustée dynamiquement en fonction de la taille de la mémoire du système. En PHP, un tableau est une structure de données très flexible qui peut stocker n'importe quel nombre d'éléments, et chaque élément peut être une valeur de n'importe quel type, ou même un autre tableau. La limite de longueur des tableaux PHP dépend principalement de la taille de la mémoire du système et de la limite de mémoire de la configuration PHP. De manière générale, si la mémoire du système est suffisamment grande et que la limite de mémoire de PHP est suffisamment élevée, la longueur du tableau peut être très grande. Cependant, si votre système manque de mémoire ou

Y a-t-il une limite à la longueur du tableau PHP ? Besoin d'exemples de code spécifiques En PHP, la longueur du tableau n'est pas soumise à une limite fixe et la taille du tableau peut être ajustée dynamiquement en fonction de la limite réelle de la mémoire système. Les tableaux en PHP sont des tableaux dynamiques, ils peuvent donc s'agrandir ou se réduire dynamiquement selon les besoins. En PHP, un tableau est une structure de données mappée ordonnée, et les éléments du tableau sont accessibles à l'aide d'indices de tableau ou de valeurs de clés de tableau associatives. Examinons un exemple de code spécifique pour démontrer si la longueur du tableau PHP est limitée. Tout d'abord, nous pouvons passer le code suivant

Le but de cet article est d'implémenter un programme qui maximise la somme des longueurs d'une paire de chaînes n'ayant aucun caractère commun dans un tableau donné. Par définition, une chaîne est une collection de caractères. Énoncé du problème Implémentez un programme pour maximiser la somme des longueurs d'une paire de chaînes qui n'ont pas de caractères communs dans un tableau donné. Exemple 1Considérons le tableau d'entrée : a[]=["efgh","hat","fto","car","wxyz","fan"]Sortie obtenue :8 Description Il n'y a aucun caractère commun dans les chaînes "abcd" et "wxyz ". En conséquence, la longueur combinée des deux chaînes est de 4+4, ce qui est égal à 8, ce qui est la longueur la plus longue parmi toutes les paires possibles. Exemple 2Letu

Comment utiliser l'algorithme de sous-séquence croissante la plus longue en C++ nécessite des exemples de code spécifiques. La sous-séquence croissante la plus longue (LIS) est un problème d'algorithme classique, et ses idées de solution peuvent être appliquées à de nombreux domaines, tels que le traitement des données et la théorie des graphes. Dans cet article, je vais présenter comment utiliser l'algorithme de sous-séquence croissante la plus longue en C++ et fournir des exemples de code spécifiques. Tout d’abord, comprenons la définition de la sous-séquence croissante la plus longue. Étant donné une séquence a1,

Le rôle et la signification de la fonction len sont interprétés sous différents angles. La fonction len est l'une des fonctions couramment utilisées dans le langage de programmation Python. Il est principalement utilisé pour renvoyer la longueur ou le nombre d'éléments d'un objet conteneur (tel qu'une chaîne, une liste, un tuple, etc.). Cette fonction simple joue un rôle très important lors de l’écriture de programmes, et sa fonction et sa signification peuvent être interprétées sous de nombreux angles. Cet article expliquera la fonction len du point de vue des performances, de la lisibilité et du type de conteneur, et fournira des exemples de code spécifiques. 1. Perspective de performance Lors du traitement de données à grande échelle, les performances du programme

En Golang, valider la longueur du texte saisi est un besoin courant. Grâce à la validation, nous pouvons garantir que le texte saisi répond à des exigences spécifiques et correspond à la longueur attendue. Dans cet article, nous explorerons comment vérifier la longueur du texte saisi à l'aide de Golang. Tout d’abord, nous devons comprendre les fonctions de chaîne couramment utilisées dans Golang. Parmi elles, la fonction len() est utilisée pour calculer la longueur de la chaîne. Par exemple, le code suivant calcule la longueur de la chaîne « helloworld » : str:=

L'hypoténuse est le côté le plus long d'un triangle rectangle opposé à l'angle droit. La longueur de l'hypoténuse peut être déterminée à l'aide du théorème de Pythagore. Selon le théorème de Pythagore, la somme des carrés des longueurs de deux côtés est égale au carré de la longueur du troisième côté, c'est-à-dire a2+b2=c2 où a, b et c représentent les trois côtés de un triangle rectangle. Donc, Hypotenuse=Math.sqrt(Math.pow(base,2)+Math.pow(height,2)) Dans cet article, nous verrons comment trouver la longueur de l'hypoténuse à l'aide du langage de programmation Java. Laissez-moi vous montrer quelques exemples. La traduction chinoise de l'instance-1 est : Exemple-1 Supposons que la longueur et la hauteur de la base soient respectivement 3 et 4. Ensuite, en utilisant la formule du théorème de Pythagore, Longueur

Dans ce problème, nous devons trouver le nombre total de sous-chaînes de longueur K qui contiennent exactement K voyelles. Nous verrons deux manières différentes de résoudre le problème. Nous pouvons utiliser une méthode simple pour vérifier le nombre de voyelles dans chaque sous-chaîne de longueur K. De plus, nous pouvons utiliser une approche de fenêtre glissante pour résoudre ce problème. Énoncé du problème - On nous donne une chaîne str de longueur N, contenant des caractères alphabétiques minuscules et majuscules. Nous devons compter le nombre total de sous-chaînes de longueur K qui contiennent exactement X voyelles. Exemple d'entrée – str="TutorialsPoint",K=3,X=2 Sortie –6 Explication – Une sous-chaîne de longueur 3 et contenant exactement 2 voyelles est : 'uto', 'ori', 'ri
