Je pense que vous êtes confus. Vous dites O (n log (n)) qui est en fait pire que O (n). Voulez-vous dire O (log n)? Si oui, la réponse est non. Vous ne pouvez pas inverser une liste chaînée dans O (log n). O (n) est trivial (et la solution évidente). O (n log (n)) n'a pas beaucoup de sens.
Editer: Ok, donc vous voulez dire O (n log (n)). Alors la réponse est oui. Comment? Facile. Vous triez la liste:
- Comptez la longueur de la liste. Coût: O (n);
- Créer un tableau de même taille;
- Copiez les éléments de la liste liée dans le tableau dans aléatoire en mettant l'ordre d'origine dans l'élément. Par exemple: [A, B, C] -> [(B, 2), (C, 3), (A, 1)]. Coût: O (n);
- Trier le tableau à l'aide d'un tri efficace (par exemple tri rapide) dans l'ordre original inversé, par exemple [(C, 3), (B, 2), (A, 1)]. Coût: O (n log (n));
- Créez une liste liée à partir du tableau inversé. Coût: O (n).
Coût total: O (n log (n))
En dépit de toutes les étapes intermédiaires, le genre est l'opération la plus coûteuse. Les autres étapes O (n) sont constantes (ce qui signifie que le nombre de pas n'est pas un facteur de n), donc le coût total est O (n log (n)).
Edit 2: Au départ, je ne l'ai pas mis les éléments de liste dans un ordre aléatoire, mais réalisé que vous pourriez arguer qu'une sorte efficace sur une liste déjà triée était inférieure à O (n log (n)), même si vous l'inversaient. Maintenant, je ne suis pas complètement convaincu que c'est le cas mais la révision ci-dessus supprime cette critique potentielle.
Et oui, c'est une question pathologique (et une réponse). Bien sûr, vous pouvez le faire en O (n).
Est-ce que O (n), mais 'i'th node, fais' log (i) 'nops. –
En tant que nitpick pédant rapide: votre algorithme 'O (n)' ** est ** un algorithme 'O (n logN)', donc une réponse à votre question est l'algorithme O (n) non modifié. 'O (n log n)' est l'ensemble des algorithmes qui ne croissent pas plus vite que n log n et inclut ceux qui sont 'O (n)' et même 'O (1)'. Pour limiter à ceux dans les mêmes limites asymptotiques dans les deux directions, vous auriez besoin de dire 'Θ (n)'. (En pratique, la plupart des gens signifient vraiment 'Θ (n)' quand ils disent 'O (n)') – Brian