Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Apprendre Complexité Temporelle des Opérations de Base sur les Listes | Liste et Tableau
Aperçu des Algorithmes et des Structures de Données
course content

Contenu du cours

Aperçu des Algorithmes et des Structures de Données

Aperçu des Algorithmes et des Structures de Données

1. Introduction à ADS
2. Liste et Tableau
3. Structures de Données Avancées
4. Graphes

book
Complexité Temporelle des Opérations de Base sur les Listes

Le tableau suivant montre la complexité temporelle des opérations de base pour les listes chaînées.

Opération de Recherche

La recherche dans une liste chaînée implique de parcourir la liste depuis le début jusqu'à ce que l'élément souhaité soit trouvé. Cette opération a une complexité temporelle de O(n) dans les pires et les cas moyens. Contrairement aux tableaux, les listes chaînées ne prennent pas en charge l'accès direct aux éléments en fonction de leur index, ce qui entraîne une complexité temporelle linéaire pour la recherche.

def search_linked_list(head, target):
  
    current = head
    while current:
        if current.val == target:
            return True
        current = current.next
    return False

Opération d'Insertion

Insérer un élément dans une liste chaînée peut être fait efficacement en mettant à jour seulement quelques pointeurs. Plus précisément, nous devons mettre à jour le pointeur de l'élément après lequel nous insérons le nouvel élément, en veillant à ce qu'il pointe vers le nouvel élément, et le pointeur du nouvel élément doit pointer vers l'élément suivant dans la liste. Cette opération a une complexité temporelle de O(1).

def insert_node(head, val, position):
   
    if position == 0:
        new_node = ListNode(val)
        new_node.next = head
        return new_node
    
    current = head
    for _ in range(position - 1):
        if current is None:
            raise ValueError("Position out of range")
        current = current.next
    
    new_node = ListNode(val)
    new_node.next = current.next
    current.next = new_node
    
    return head

Opération de Suppression

Tout comme dans l'opération d'insertion, nous devons mettre à jour les pointeurs des nœuds adjacents pour contourner le nœud supprimé. En conséquence, nous avons une complexité temporelle de O(1) pour l'opération de suppression.

def delete_node(head, target):
    
    # If the list is empty, return None
    if not head:
        return None
    
    # If the target is at the head, move the head to the next node
    if head.val == target:
        return head.next
    
    # Search for the target value while keeping track of the previous node
    prev = head
    current = head.next
    while current:
        if current.val == target:
            prev.next = current.next
            return head
        prev = current
        current = current.next
    
    return head

Note

Lors de l'insertion ou de la suppression d'un élément dans une liste chaînée, le processus implique d'ajuster les pointeurs en conséquence. En revanche, lors du travail avec des tableaux, pour réaliser la même opération, un segment du tableau doit être réécrit.

question mark

Laquelle des affirmations suivantes concernant les listes chaînées est vraie ?

Select the correct answer

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 2. Chapitre 5

Demandez à l'IA

expand

Demandez à l'IA

ChatGPT

Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion

course content

Contenu du cours

Aperçu des Algorithmes et des Structures de Données

Aperçu des Algorithmes et des Structures de Données

1. Introduction à ADS
2. Liste et Tableau
3. Structures de Données Avancées
4. Graphes

book
Complexité Temporelle des Opérations de Base sur les Listes

Le tableau suivant montre la complexité temporelle des opérations de base pour les listes chaînées.

Opération de Recherche

La recherche dans une liste chaînée implique de parcourir la liste depuis le début jusqu'à ce que l'élément souhaité soit trouvé. Cette opération a une complexité temporelle de O(n) dans les pires et les cas moyens. Contrairement aux tableaux, les listes chaînées ne prennent pas en charge l'accès direct aux éléments en fonction de leur index, ce qui entraîne une complexité temporelle linéaire pour la recherche.

def search_linked_list(head, target):
  
    current = head
    while current:
        if current.val == target:
            return True
        current = current.next
    return False

Opération d'Insertion

Insérer un élément dans une liste chaînée peut être fait efficacement en mettant à jour seulement quelques pointeurs. Plus précisément, nous devons mettre à jour le pointeur de l'élément après lequel nous insérons le nouvel élément, en veillant à ce qu'il pointe vers le nouvel élément, et le pointeur du nouvel élément doit pointer vers l'élément suivant dans la liste. Cette opération a une complexité temporelle de O(1).

def insert_node(head, val, position):
   
    if position == 0:
        new_node = ListNode(val)
        new_node.next = head
        return new_node
    
    current = head
    for _ in range(position - 1):
        if current is None:
            raise ValueError("Position out of range")
        current = current.next
    
    new_node = ListNode(val)
    new_node.next = current.next
    current.next = new_node
    
    return head

Opération de Suppression

Tout comme dans l'opération d'insertion, nous devons mettre à jour les pointeurs des nœuds adjacents pour contourner le nœud supprimé. En conséquence, nous avons une complexité temporelle de O(1) pour l'opération de suppression.

def delete_node(head, target):
    
    # If the list is empty, return None
    if not head:
        return None
    
    # If the target is at the head, move the head to the next node
    if head.val == target:
        return head.next
    
    # Search for the target value while keeping track of the previous node
    prev = head
    current = head.next
    while current:
        if current.val == target:
            prev.next = current.next
            return head
        prev = current
        current = current.next
    
    return head

Note

Lors de l'insertion ou de la suppression d'un élément dans une liste chaînée, le processus implique d'ajuster les pointeurs en conséquence. En revanche, lors du travail avec des tableaux, pour réaliser la même opération, un segment du tableau doit être réécrit.

question mark

Laquelle des affirmations suivantes concernant les listes chaînées est vraie ?

Select the correct answer

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 2. Chapitre 5
some-alt