Swift: File séquentielle -3-

Accès associatif à un élément
Retour sur : Accès par position

L’algorithme consiste à parcourir la file depuis le début en testant la valeur de chaque élément rencontré jusqu’à ce que l’on ait obtenu égalité avec la valeur cherchée conformément au schéma de programme accès associatif

func AccesAssociatif(collection: File_Entier,valeur: Entier) -> Bool {
   Premier(collection)
   var trouvé = false
   while !Dernier(collection) && !trouvé {
      let element = Prendre(collection)
         trouvé = Egal(valeur, element: element)
      Avancer(collection)
   }
   return trouvé
}

Pour lire le premier élément, on positionne le curseur sur le premier élément
avec la primitive Premier. Si la file est vide la primitive Dernier devient vraie,
et l’on n’entre pas dans la boucle. Si la file n’est pas vide, on entre dans la boucle grâce au booléen trouvé initialisé à faux, le prédicat Egal est Faux. La condition de while devient vraie et la recherche commence. La primitive Egal est une fonction Swift développée dans le framework AlgoSwift

Un autre façon de coder le schéma de programme. On utilise ici la possibilité offerte par Swift de sortir de la fonction avec l’instruction return qui retourne vrai ou faux selon le cas. Le test d’égalité est reporté à l’intérieur de la boucle

func AccesAssociatif(collection: File_Entier,valeur: Entier) -> Bool {
   Premier(collection)
   while !Dernier(collection) {
      if Egal(valeur, element: Prendre(collection)) {
         return true 
      }
      Avancer(collection)
   }
   return false
}

 

Dans le cas ou la file est ordonnée on peut optimiser le programme de la façon suivante:

func AccesAssociatif(collection: File_Entier,valeur: Entier) -> Bool {
    Premier(collection)
    var trouvé = false
    var énumération = true
    while !Dernier(collection) && !trouvé && énumération {
        let element = Prendre(collection)
        trouvé = Egal(valeur, element: element)
        if Infer(valeur,element: element) {
            énumération = false
        }
        Avancer(collection)
    }
    return trouvé
}

A partir de l’exemple précédent on peut réécrire les deux programmes précédents en utilisant uniquement des instructions du langage Swift.

func AccesAssociatif(collection: [Int],valeur: Int) -> Bool {
   var index = 0
   while index <  collection.count  {
      if valeur == collection[index] {
         return true
      }
      index += 1
   }
   return false
}