Rumah >hujung hadapan web >tutorial js >Melaksanakan Tatasusunan Dinamik
Menganggap pemahaman tatatanda Big O. Contohnya adalah dalam JavaScript. Rujukan maklumat "Cracking the Coding Interview" oleh Gayle Laakmann McDowell
Dalam sesetengah bahasa seperti JavaScript atau Python, tatasusunan boleh diubah saiz secara automatik, bermakna ia akan berkembang semasa anda menambahkan item. Dalam bahasa lain seperti Java, tatasusunan ialah panjang tetap, bermakna saiz ditentukan apabila anda memulakan tatasusunan. Tatasusunan yang berkembang secara automatik ini dipanggil tatasusunan dinamik.
Di Java, ArrayList ialah struktur data seperti tatasusunan yang menawarkan saiz semula dinamik sambil tetap menyediakan O(1) akses. Apabila tatasusunan penuh, tatasusunan berganda saiznya. Setiap penggandaan mengambil O(n) masa, tetapi jarang berlaku sehingga masa sisipan terlunasnya masih O(1) .
Antara bahasa pengaturcaraan yang berbeza, nama struktur data ini serta faktor saiz semulanya (iaitu 2 dalam Java) berbeza-beza. Faktor saiz semula menentukan saiz tatasusunan yang lebih besar.
Apabila mengubah saiz, dengan mengandaikan faktor saiz semula ialah 2, kita boleh melihat bahawa kita meningkat kepada tatasusunan saiz N dengan menggandakan tatasusunan sebelumnya (iaitu separuh daripada N). Tambahan pula, kita juga perlu meniru N/2 elemen kepada tatasusunan baharu ini.
Jika kita menjumlahkan bilangan elemen yang kita salin daripada peningkatan kapasiti terakhir kepada peningkatan kapasiti pertama: 2n+4n+8n+16n+...+2+1 yang berjumlah hanya kurang daripada N. Oleh itu, memasukkan unsur N mengambil masa kira-kira O(n) bekerja secara total. Setiap sisipan adalah O(1) secara purata, walaupun beberapa sisipan mengambil O(n) masa dalam kes yang paling teruk.
Tatasusunan dinamik dalam JavaScript biasanya mempunyai beberapa kaedah teras, setiap satu dengan kerumitan masa yang berbeza:
get(i): Kaedah ini mendapatkan semula elemen pada indeks i.
set(i, n): Kaedah ini menetapkan elemen pada indeks i kepada n.
tolak(n): Kaedah ini menambahkan elemen n pada penghujung tatasusunan.
popback(): Kaedah ini mengalih keluar elemen terakhir tatasusunan.
saiz semula(): Kaedah ini menggandakan kapasiti tatasusunan dan menyalin semua elemen ke tatasusunan baharu.
getSize(): Kaedah ini mengembalikan bilangan elemen dalam tatasusunan.
getCapacity(): Kaedah ini mengembalikan kapasiti semasa tatasusunan.
class DynamicArray { // size is # of filled slots while capacity is total slots in array constructor(capacity) { this.capacity = capacity; this.arr = new Array(this.capacity); this.size = 0; } // O(1) get(i) { if (i < 0 || i >= this.size) return undefined; return this.arr[i]; } // O(1) set(i, n) { if (i < 0 || i >= this.size) return undefined; this.arr[i] = n; } // O(1) amortized pushback(n) { if (this.size === this.capacity) { this.resize(); } this.arr[this.size] = n; this.size++; } // O(1) popback() { if (this.size === 0) return undefined; this.size--; let temp = this.arr[this.size]; this.arr[this.size] = undefined; return temp; } // O(n) resize() { this.capacity *= 2; let newArr = new Array(this.capacity); for (let i = 0; i < this.size; i++) { newArr[i] = this.arr[i]; } this.arr = newArr; } // O(1) getSize() { return this.size; } // O(1) getCapacity() { return this.capacity; } }
Tatasusunan dinamik ialah struktur data yang berkuasa yang menggabungkan fleksibiliti storan boleh saiz semula dengan kecekapan akses masa tetap. Semoga ini membantu!
Atas ialah kandungan terperinci Melaksanakan Tatasusunan Dinamik. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!