edubun
Bahasa Indonesia

Array

Membaca nilai kesejuta dalam array butuh satu langkah, tetapi menaruh nilai baru di depan array yang sama memindahkan sejuta nilai.

Apa itu struktur data

Program yang menyimpan daftar nama, antrean pekerjaan cetak, atau tabel harga harus menyimpan data itu di suatu tempat, dan harus bisa menjawab pertanyaan tentangnya: apa butir ketiga, apakah nama ini ada di daftar, pekerjaan mana yang berikutnya? Struktur data adalah cara menyimpan data bersama metode-metode yang menjawab pertanyaan itu. Mata kuliah 6.006 MIT memisahkan dua gagasan di sini. Antarmuka (interface) menyatakan operasi apa saja yang bisa kamu minta, seperti "ambil butir di posisi i" atau "tambahkan butir di ujung". Struktur data adalah cara operasi itu benar-benar dijalankan di memori. Satu antarmuka bisa punya beberapa struktur data di belakangnya, dan kecepatannya bisa sangat berbeda.

Kursus ini menghitung langkah, seperti kursus algoritma, supaya dua struktur bisa dibandingkan tanpa stopwatch. Di unit ini, satu langkah adalah membaca atau menulis satu sel memori. Laboratorium di bawah menghitungnya untukmu.

Satu blok sel, berdampingan

Array menyimpan nilai-nilainya dalam satu blok memori yang tidak terputus, setiap nilai dalam sel berukuran sama, diberi nomor mulai dari 0. Tata letak inilah yang membuat array cepat dibaca. Kalau blok dimulai di alamat s dan setiap sel memakan c byte, maka a[i] berada di alamat s + i × c. Komputer menghitungnya dengan satu perkalian dan satu penjumlahan lalu langsung melompat ke sana, entah i bernilai 3 atau 3 000 000. Catatan MIT mencantumkan "get at(i)" dan "set at(i, x)" untuk array sebagai Θ(1), artinya biayanya tidak bertambah seiring panjang array.

Tata letak yang sama membuat perubahan di tengah menjadi lambat. Misalkan array berisi 7, 3, 9, 4, 6 dan kamu ingin menaruh 1 di depan. Tidak ada celah di depan 7, jadi setiap nilai harus lebih dulu bergeser satu sel ke kanan, dimulai dari yang terakhir supaya tidak ada yang tertimpa. Itu 5 pemindahan dan 1 penulisan: 6 langkah. Menghapus nilai terdepan adalah kebalikannya: baca nilainya, lalu geser 4 nilai lainnya satu sel ke kiri. Menyisipkan di posisi i dalam array berisi n nilai memakan n − i pemindahan ditambah satu penulisan, jadi bagian depan adalah tempat terburuk dan ujung adalah tempat terbaik.

Memuat

Seret untuk memutar. Gulir atau cubit untuk memperbesar.

Array berisi lima nilai dalam blok berisi lima sel. Geser penggeser untuk memilih i, lalu baca, sisipkan, atau hapus. Push ke blok yang penuh menyalin semuanya ke blok yang dua kali lebih besar.

Saat bloknya penuh

Blok memori punya ukuran tetap, jadi apa yang terjadi kalau kamu menambahkan nilai padahal setiap sel sudah terisi? Array harus meminta blok baru yang lebih besar dan menyalin setiap nilai ke sana sebelum bisa menulis nilai baru. Di laboratorium, push ke blok penuh berisi 5 memakan 5 penyalinan dan 1 penulisan. Kalau array hanya bertambah satu sel setiap kali, setiap push akan menyalin semuanya, dan n kali push akan memakan sekitar n²/2 penyalinan.

Perbaikan yang dijelaskan catatan MIT adalah memperbesar banyak sekaligus, misalnya dengan menggandakan. Mulai dari kapasitas 1, penyalinan terjadi saat array berisi 1, 2, 4, 8, dan 16 nilai, jadi 17 kali push memakan total 1 + 2 + 4 + 8 + 16 = 31 penyalinan, kurang dari 2 per push. Satu push tertentu tetap bisa lambat, tetapi serangkaian panjang push rata-rata memakan biaya konstan per push. Ini disebut waktu Θ(1) teramortisasi (amortized). Array JavaScript berperilaku seperti ini dari luar: MDN menyebut array dapat diubah ukurannya, dan push serta pop bekerja di ujung, yaitu ujung yang murah.

Operasi pada n nilaiLangkah di laboratoriumTumbuh seperti
Baca atau tulis a[i]1Θ(1)
Sisipkan di depann pemindahan + 1 penulisanΘ(n)
Hapus yang terdepan1 pembacaan + (n − 1) pemindahanΘ(n)
Push di ujung (masih ada ruang)1Θ(1)
Push di ujung (blok penuh)n penyalinan + 1 penulisanΘ(n) sekali, Θ(1) teramortisasi
const a = [7, 3, 9, 4, 6];
console.log(a[3]);      // 4, satu langkah
a.push(8);              // murah: ujung
a.unshift(1);           // setiap nilai bergeser satu sel ke kanan
console.log(a.join(" ")); // 1 7 3 9 4 6 8
Latar belakangArray lebih tua daripada kebanyakan bahasa pemrograman. Mesin-mesin awal menyimpan tabel sebagai word bernomor di memori, dan pemrogram menghitung alamat entri i dengan tangan, persis seperti rumus di atas. Fortran, yang dirilis IBM pada 1957, menjadikan array bagian dari bahasanya sehingga orang bisa menulis A(I) dan membiarkan compiler mengerjakan aritmetika alamatnya. Fortran menghitung mulai dari 1. C dan JavaScript menghitung mulai dari 0, yang cocok dengan rumusnya: a[0] berada tepat di alamat awal.
AntarmukaDaftar operasi yang boleh kamu minta, seperti get at(i) atau insert last(x).
Struktur dataCara operasi itu dijalankan di memori.
ArrayNilai-nilai dalam satu blok sel yang sama besar; a[i] berada di awal + i × ukuran sel.
Array dinamisArray yang bertambah besar dengan menyalin ke blok yang lebih besar, biasanya dua kali ukurannya.
Biaya teramortisasiBiaya rata-rata per operasi dalam rangkaian panjang, walaupun beberapa operasi tertentu lambat.
  1. Menurut hitungan langkah di unit ini, berapa langkah yang dibutuhkan untuk membaca a[700000] dari array berisi 1 000 000 nilai?
    • 1
    • 20
    • 700,000
    • 1,000,000
  2. Sebuah array berisi 7, 3, 9, 4, 6 dan masih punya ruang. Berapa langkah untuk menyisipkan nilai di depan (pemindahan ditambah penulisan)?
  3. Array yang sama berisi 5 nilai: berapa langkah untuk menghapus nilai terdepan (1 pembacaan ditambah pemindahan)?
  4. Menyisipkan di posisi 2 pada array berisi 5 nilai (posisi 0 sampai 4) yang masih punya ruang: berapa langkah?
  5. Array yang menggandakan diri berisi 5 nilai dan kapasitasnya 5. Kamu melakukan push satu nilai lagi. Berapa langkah push itu?
  6. Setelah push itu, berapa kapasitasnya?
  7. Mulai dari kapasitas 1 dengan penggandaan, berapa total penyalinan dari 17 kali push?
  8. Mengapa push pada array yang menggandakan diri disebut Θ(1) teramortisasi?
    • Setiap push memakan tepat satu langkah
    • Penyalinan jarang terjadi, jadi total untuk n kali push tetap di bawah suatu konstanta dikali n
    • Komputer menyalin di latar belakang secara gratis
    • JavaScript tidak pernah menyalin array
  9. Dalam istilah MIT 6.006, "insert last(x) dan delete last()" adalah
    • sebuah struktur data
    • sebuah antarmuka
    • sebuah alamat memori
    • sebuah metode pengurutan
  10. Sebuah array punya panjang n dan menghitung mulai dari 0. Berapa indeks nilai terakhirnya?
    • n
    • n − 1
    • n + 1
    • 1
Poin penting
  • Antarmuka mendaftar operasi; struktur data adalah cara menjalankannya.
  • Array menyimpan nilai dalam satu blok, jadi a[i] hanya satu langkah.
  • Menyisipkan atau menghapus di dekat depan memindahkan sekitar n nilai.
  • Array yang menggandakan diri membuat push Θ(1) teramortisasi: 17 kali push dari kapasitas 1 menyalin 31 nilai.
Sumber kursus ini (11)
  • MIT OpenCourseWare 6.006 Introduction to Algorithms, Spring 2020 (Demaine, Ku, Solomon)
  • lecture notes 2 Data Structures (interface vs data structure, Sequence and Set interfaces, stack = insert_last/delete_last, queue = insert_last/delete_first, array, linked list, dynamic array, amortized Θ(1) append)
  • 4 Hashing (chaining, pigeonhole collisions, chain length n/m)
  • 6 Binary Trees Part 1 (height, traversal order, O(h) operations) and 7 Binary Trees Part 2: AVL (Adelson-Velsky and Landis, 1962) at ocw.mit.edu/courses/6-006-introduction-to-algorithms-spring-2020/pages/lecture-notes
  • MDN Web Docs, Array.prototype.shift (shifts all values left by 1)
  • Array.prototype.unshift, Map (insertion order, Map vs Object, spec requires sublinear average access) and Set (developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects)
  • ECMAScript 2025 Language Specification (tc39.es/ecma262)
  • 24.1 Map Objects and 24.2 Set Objects ("must be implemented using either hash tables or other mechanisms that, on average, provide access times that are sublinear on the number of elements")
  • Array.prototype.shift steps (Repeat, while k < len: move element k to k - 1)
  • D. E. Knuth, The Art of Computer Programming vol. 3 (2nd ed. 1998) section 6.4 History (H. P. Luhn, IBM internal memorandum January 1953, hashing with chaining; digit pairs added mod 10, 31415926 -> 4548) via gwern.net copy, and IEEE Spectrum, "Hans Peter Luhn and the Birth of the Hashing Algorithm" (2018)
  • "A brief history of the stack", SIGCIS (sigcis.org/files/A brief history.pdf: Bauer and Samelson applied for the patent in 1957, US 3,047,228 granted July 31, 1962; IPL list processing by Newell, Simon and Shaw at RAND 1956) and Wikipedia, Information Processing Language (Newell, Shaw, Simon, RAND and Carnegie Institute of Technology, about 1956).

Diperiksa: 2026-10-18