0
votes

Eléments filtrants efficacement dans une liste basée sur ses index

Je fais un exercice qui demande à éliminer les éléments à des positions impaires.

Je me demande s'il y a une meilleure alternative à ce que je pensais: xxx

le Première approche: xxx

et la seconde: xxx

suis-je correct si je pense que la deuxième approche est plus efficace? Comme il n'est pas nécessaire de produire une liste intermédiaire comme zipwithinex fait?


1 commentaires

Je suggérerais le contraire. Indexer une liste , i.e. a (_) est une opération linéaire inefficace pour les listes longues. À éviter.


3 Réponses :


0
votes

Vous pouvez éviter la formation de la collection intermédiaire à l'aide de avecfilter code>, vous pouvez également convertir la liste en mode Vecteur pour extraire l'élément à des indices particuliers en temps constant:

  val a: Vector[Int] = List(1,2,3,4,5,6).toVector
  val res: Seq[Int] = a.indices.withFilter(i => (i & 1) == 1).map(a(_))
  println(res)


3 commentaires

Conversion de la liste en un Vecteur n'est pas effectué en temps constant.


Mais l'accès à l'élément sera en temps constant


A.Indices est exécuté en temps constant (la définition est juste 0 jusqu'à la longueur ). Tandis que a.tovector.indices fonctionnera en temps linéaire, car il doit copier tous les éléments dans un nouveau vecteur . Il n'y a pas de point de convertir la liste vers un vecteur .



2
votes

Vous pouvez utiliser la méthode collecter sur la liste zippée, peut-être un peu plus précise xxx

https://scalafiddle.io/sf/ybureix/0

Je ne suis pas sûr de l'efficacité, bien que < / p>


0 commentaires

2
votes

Vous pouvez utiliser une vue pour éviter les listes intermédiaires: xxx

Ceci ne traversera que A une fois lorsque force est appelé. < / p>


0 commentaires