Tatasusunan ialah struktur data asas dalam sains komputer dan digunakan secara meluas dalam pelbagai algoritma dan senario penyelesaian masalah. Panduan komprehensif ini akan membawa anda melalui perkara-perkara penting dalam manipulasi tatasusunan dalam JavaScript, meliputi topik dari peringkat asas hingga lanjutan. Kami akan meneroka traversal, sisipan, pemadaman, carian dan banyak lagi, bersama-sama dengan kerumitan masa dan contoh praktikalnya.
Susun atur ialah koleksi elemen yang disimpan di lokasi memori bersebelahan. Dalam JavaScript, tatasusunan adalah dinamik dan boleh menyimpan elemen jenis yang berbeza.
Operasi tatasusunan asas:
// 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
Kerumitan Masa:
Traversal bermaksud melawati setiap elemen tatasusunan sekali. Terdapat beberapa cara untuk melintasi tatasusunan dalam JavaScript.
let arr = [1, 2, 3, 4, 5]; for (let i = 0; i < arr.length; i++) { console.log(arr[i]); }
Kerumitan Masa: O(n), dengan n ialah bilangan elemen dalam tatasusunan.
let arr = [1, 2, 3, 4, 5]; arr.forEach(element => console.log(element));
Kerumitan Masa: O(n)
let arr = [1, 2, 3, 4, 5]; for (let element of arr) { console.log(element); }
Kerumitan Masa: O(n)
Pemasukan dalam tatasusunan boleh dilakukan pada permulaan, akhir atau pada kedudukan tertentu.
let arr = [1, 2, 3]; arr.push(4); console.log(arr); // Output: [1, 2, 3, 4]
Kerumitan Masa: O(1) (dilunaskan)
let arr = [1, 2, 3]; arr.unshift(0); console.log(arr); // Output: [0, 1, 2, 3]
Kerumitan Masa: O(n), kerana semua elemen sedia ada perlu dianjak
let arr = [1, 2, 4, 5]; arr.splice(2, 0, 3); console.log(arr); // Output: [1, 2, 3, 4, 5]
Kerumitan Masa: O(n), kerana elemen selepas titik sisipan perlu dianjak
Serupa dengan sisipan, pemadaman boleh dilakukan pada permulaan, akhir atau pada kedudukan tertentu.
let arr = [1, 2, 3, 4]; arr.pop(); console.log(arr); // Output: [1, 2, 3]
Kerumitan Masa: O(1)
let arr = [1, 2, 3, 4]; arr.shift(); console.log(arr); // Output: [2, 3, 4]
Kerumitan Masa: O(n), kerana semua elemen yang tinggal perlu dianjak
let arr = [1, 2, 3, 4, 5]; arr.splice(2, 1); console.log(arr); // Output: [1, 2, 4, 5]
Kerumitan Masa: O(n), kerana elemen selepas titik pemadaman perlu dialihkan
Mencari ialah operasi biasa yang dilakukan pada tatasusunan. Mari lihat beberapa teknik carian.
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
Kerumitan Masa: 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
Kerumitan Masa: O(log n)
Sekarang mari kita terokai beberapa teknik yang lebih maju untuk manipulasi tatasusunan.
Teknik dua mata sering digunakan untuk menyelesaikan masalah tatasusunan dengan cekap. Berikut ialah contoh menggunakan dua penunjuk untuk membalikkan tatasusunan di tempat:
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]
Kerumitan Masa: O(n)
Teknik tingkap gelongsor berguna untuk menyelesaikan masalah subarray. Berikut ialah contoh untuk mencari jumlah subarray maksimum saiz 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
Kerumitan Masa: O(n)
Algoritma Kadane digunakan untuk mencari jumlah subarray maksimum dalam tatasusunan. Ini adalah contoh pengaturcaraan dinamik:
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
Kerumitan Masa: O(n)
Algoritma ini digunakan untuk mengisih tatasusunan yang mengandungi hanya 0s, 1s dan 2s:
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]
Kerumitan Masa: O(n)
Berikut adalah 50 masalah amalan dari peringkat mudah hingga lanjutan. Sebahagian daripada ini adalah daripada LeetCode, manakala yang lain ialah senario manipulasi tatasusunan biasa:
Berikut ialah 20 masalah LeetCode untuk menguji kemahiran manipulasi tatasusunan anda:
Dengan menyelesaikan masalah ini dan memahami konsep asas, anda akan meningkatkan kemahiran manipulasi tatasusunan anda dengan ketara dalam JavaScript untuk Struktur Data dan Algoritma.
Ingat, kunci untuk menguasai teknik ini ialah amalan yang konsisten dan memahami kerumitan masa dan ruang bagi penyelesaian anda.
Selamat mengekod!
Atas ialah kandungan terperinci Menguasai Manipulasi Tatasusunan dalam DSA menggunakan JavaScript: Daripada Asas kepada Lanjutan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!