Les tableaux sont des structures de données fondamentales en informatique et sont largement utilisés dans divers algorithmes et scénarios de résolution de problèmes. Ce guide complet vous présentera les bases de la manipulation de tableaux en JavaScript, couvrant des sujets allant des niveaux de base aux niveaux avancés. Nous explorerons le parcours, l'insertion, la suppression, la recherche et bien plus encore, ainsi que leurs complexités temporelles et des exemples pratiques.
Un tableau est une collection d'éléments stockés dans des emplacements mémoire contigus. En JavaScript, les tableaux sont dynamiques et peuvent contenir des éléments de différents types.
Opérations de base sur les tableaux :
// Creating an array let arr = [1, 2, 3, 4, 5]; // Accessing elements console.log(arr[0]); // Output: 1 // Modifying elements arr[2] = 10; console.log(arr); // Output: [1, 2, 10, 4, 5] // Getting array length console.log(arr.length); // Output: 5
Complexité temporelle :
La traversée signifie visiter chaque élément du tableau une fois. Il existe plusieurs façons de parcourir un tableau en JavaScript.
let arr = [1, 2, 3, 4, 5]; for (let i = 0; i < arr.length; i++) { console.log(arr[i]); }
Complexité temporelle : O(n), où n est le nombre d'éléments dans le tableau.
let arr = [1, 2, 3, 4, 5]; arr.forEach(element => console.log(element));
Complexité temporelle : O(n)
let arr = [1, 2, 3, 4, 5]; for (let element of arr) { console.log(element); }
Complexité temporelle : O(n)
L'insertion dans les tableaux peut être effectuée au début, à la fin ou à une position spécifique.
let arr = [1, 2, 3]; arr.push(4); console.log(arr); // Output: [1, 2, 3, 4]
Complexité temporelle : O(1) (amorti)
let arr = [1, 2, 3]; arr.unshift(0); console.log(arr); // Output: [0, 1, 2, 3]
Complexité temporelle : O(n), car tous les éléments existants doivent être décalés
let arr = [1, 2, 4, 5]; arr.splice(2, 0, 3); console.log(arr); // Output: [1, 2, 3, 4, 5]
Complexité temporelle : O(n), car les éléments après le point d'insertion doivent être décalés
Semblable à l'insertion, la suppression peut être effectuée au début, à la fin ou à une position spécifique.
let arr = [1, 2, 3, 4]; arr.pop(); console.log(arr); // Output: [1, 2, 3]
Complexité temporelle : O(1)
let arr = [1, 2, 3, 4]; arr.shift(); console.log(arr); // Output: [2, 3, 4]
Complexité temporelle : O(n), car tous les éléments restants doivent être décalés
let arr = [1, 2, 3, 4, 5]; arr.splice(2, 1); console.log(arr); // Output: [1, 2, 4, 5]
Complexité temporelle : O(n), car les éléments après le point de suppression doivent être décalés
La recherche est une opération courante effectuée sur les tableaux. Examinons quelques techniques de recherche.
function linearSearch(arr, target) { for (let i = 0; i < arr.length; i++) { if (arr[i] === target) return i; } return -1; } let arr = [1, 3, 5, 7, 9]; console.log(linearSearch(arr, 5)); // Output: 2 console.log(linearSearch(arr, 6)); // Output: -1
Complexité temporelle : O(n)
function binarySearch(arr, target) { let left = 0, right = arr.length - 1; while (left <= right) { let mid = Math.floor((left + right) / 2); if (arr[mid] === target) return mid; if (arr[mid] < target) left = mid + 1; else right = mid - 1; } return -1; } let arr = [1, 3, 5, 7, 9]; console.log(binarySearch(arr, 5)); // Output: 2 console.log(binarySearch(arr, 6)); // Output: -1
Complexité temporelle : O(log n)
Explorons maintenant quelques techniques plus avancées de manipulation de tableaux.
La technique à deux pointeurs est souvent utilisée pour résoudre efficacement les problèmes de tableau. Voici un exemple d'utilisation de deux pointeurs pour inverser un tableau sur place :
function reverseArray(arr) { let left = 0, right = arr.length - 1; while (left < right) { [arr[left], arr[right]] = [arr[right], arr[left]]; left++; right--; } } let arr = [1, 2, 3, 4, 5]; reverseArray(arr); console.log(arr); // Output: [5, 4, 3, 2, 1]
Complexité temporelle : O(n)
La technique de la fenêtre coulissante est utile pour résoudre les problèmes de sous-réseaux. Voici un exemple pour trouver le sous-tableau de somme maximale de taille k :
function maxSumSubarray(arr, k) { let maxSum = 0; let windowSum = 0; // Calculate sum of first window for (let i = 0; i < k; i++) { windowSum += arr[i]; } maxSum = windowSum; // Slide the window for (let i = k; i < arr.length; i++) { windowSum = windowSum - arr[i - k] + arr[i]; maxSum = Math.max(maxSum, windowSum); } return maxSum; } let arr = [1, 4, 2, 10, 23, 3, 1, 0, 20]; console.log(maxSumSubarray(arr, 4)); // Output: 39
Complexité temporelle : O(n)
L'algorithme de Kadane est utilisé pour trouver la somme maximale des sous-tableaux dans un tableau. C'est un exemple de programmation dynamique :
function kadane(arr) { let maxSoFar = arr[0]; let maxEndingHere = arr[0]; for (let i = 1; i < arr.length; i++) { maxEndingHere = Math.max(arr[i], maxEndingHere + arr[i]); maxSoFar = Math.max(maxSoFar, maxEndingHere); } return maxSoFar; } let arr = [-2, -3, 4, -1, -2, 1, 5, -3]; console.log(kadane(arr)); // Output: 7
Complexité temporelle : O(n)
Cet algorithme est utilisé pour trier un tableau contenant uniquement des 0, des 1 et des 2 :
function dutchNationalFlag(arr) { let low = 0, mid = 0, high = arr.length - 1; while (mid <= high) { if (arr[mid] === 0) { [arr[low], arr[mid]] = [arr[mid], arr[low]]; low++; mid++; } else if (arr[mid] === 1) { mid++; } else { [arr[mid], arr[high]] = [arr[high], arr[mid]]; high--; } } } let arr = [2, 0, 1, 2, 1, 0]; dutchNationalFlag(arr); console.log(arr); // Output: [0, 0, 1, 1, 2, 2]
Complexité temporelle : O(n)
Voici 50 problèmes pratiques allant du niveau facile au niveau avancé. Certains d'entre eux proviennent de LeetCode, tandis que d'autres sont des scénarios courants de manipulation de tableaux :
Voici 20 problèmes LeetCode pour tester vos compétences en manipulation de tableaux :
En résolvant ces problèmes et en comprenant les concepts sous-jacents, vous améliorerez considérablement vos compétences en manipulation de tableaux en JavaScript pour les structures de données et les algorithmes.
N'oubliez pas que la clé pour maîtriser ces techniques est une pratique cohérente et une compréhension des complexités temporelles et spatiales de vos solutions.
Bon codage !
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!