Array: Static, Dynamic
Latihan membuat instruksi pembelajaran tentang Array yang memiliki alokasi memory statis, serta implementasi pemrograman Rust yang memiliki tipe Vec sebagai gambaran dinamis dari Array.
Ringkasan Tujuan
Array adalah struktur data dasar yang digunakan untuk menyimpan sekumpulan elemen dengan tipe data yang sama. Elemen-elemen array disimpan berurutan dalam memori dan dapat diakses dengan cepat menggunakan indeks. Memahami array membantu Anda mengorganisasi data dengan efisien dan memproses data secara sistematis.
Tujuan Pembelajaran
Setelah mempelajari materi ini, Anda akan mampu:
Menjelaskan konsep dasar array, termasuk sifat ukuran tetap (statis).
Mengakses elemen array menggunakan indeks.
Melakukan operasi sederhana seperti jumlah, rata-rata, atau maksimum.
Memahami proses geser elemen saat menghapus data dari array statis.
Membandingkan array statis dengan array dinamis (
Vec
) di Rust.Memahami implikasi efisiensi dari operasi pada array.
Prasyarat
Pemahaman variabel dan tipe data dasar.
Struktur kontrol (
if-else
,for
).Operasi aritmetika sederhana.
Konsep fungsi sederhana (untuk modularisasi).
Visualisasi Memori
Contoh array let nilai = [80, 75, 90, 60, 85];
dapat divisualisasikan di memori:
Indeks: 0 1 2 3 4
Nilai: 80 75 90 60 85
Alamat: 1000 1004 1008 1012 1016
Indeks mulai dari 0.
Akses cepat karena alamat dapat dihitung langsung.
Contoh di atas mengasumsikan
i32
berukuran 4 byte.
Ukuran Tetap dan Pergeseran Elemen
Array merupakan struktur data yang harus dialokasikan dengan ukuran yang sudah ditentukan di awal. Misalnya, sebuah array dengan 10 elemen bertipe integer akan membutuhkan memori sebesar 10 × 4 byte
jika setiap bilangan bulat berukuran 4 byte. Jika suatu saat ukuran array perlu diubah, maka yang dilakukan bukanlah memperbesar array lama, melainkan membuat array baru dengan ukuran yang diinginkan, menyalin isi array lama ke array baru, lalu menghapus array lama.
Hal lain yang penting dipahami adalah bagaimana array bereaksi terhadap penambahan atau penghapusan elemen di tengah. Setiap kali sebuah elemen ditambah atau dihapus, elemen-elemen setelah posisi tersebut harus digeser satu per satu. Hal ini menimbulkan konsekuensi efisiensi: operasi akses elemen array sangat cepat karena berbasis indeks, tetapi operasi sisip atau hapus di tengah menjadi relatif lambat dibanding struktur data lain (misalnya linked list).
Contoh Implementasi dalam Rust
1. Array Statis dengan Pergeseran Manual
fn main() {
// Array statis dengan panjang 5
// Option<i32> memungkinkan menandai slot kosong (None) atau terisi (Some).
let mut data: [Option<i32>; 5] = [Some(10), Some(20), Some(30), Some(40), Some(50)];
// Ukuran logis array
let mut n = 5;
println!("Array awal:");
for i in 0..n {
print!("{:?} ", data[i]);
}
println!();
// Hapus elemen di indeks ke-2
let hapus_index = 2;
// Geser elemen setelahnya ke kiri
for i in hapus_index..(n - 1) {
data[i] = data[i + 1];
}
// Tandai slot terakhir kosong
data[n - 1] = None;
n -= 1;
println!("Array setelah menghapus elemen di indeks {}:", hapus_index);
for i in 0..n {
print!("{:?} ", data[i]);
}
println!();
}
Penjelasan tentang Option<i32>
Option<T>
adalah enum bawaan Rust untuk menyatakan nilai yang bisa ada atau tidak.Some(x)
→ ada nilaix
.None
→ tidak ada nilai.Pada array statis, kita tidak bisa menghapus elemen secara fisik. Solusinya adalah menandai slot terakhir dengan
None
agar dianggap kosong.
2. Array Dinamis dengan Vec<i32>
fn main() {
// Vector (array dinamis) dengan 5 elemen
let mut data = vec![10, 20, 30, 40, 50];
println!("Vector awal: {:?}", data);
// Hapus elemen di indeks ke-2
data.remove(2);
println!("Vector setelah menghapus elemen di indeks 2: {:?}", data);
}
Penjelasan
Vec
adalah array dinamis di Rust.Mendukung operasi siap pakai seperti
remove
,push
,insert
.Rust otomatis menggeser elemen saat
remove
dipanggil, sehingga programmer tidak perlu menanganinya manual.
Perbandingan Pemahaman
Array Statis
Ukuran tetap.
Harus menggeser elemen manual.
Menggunakan
Option
untuk menandai slot kosong.Cocok untuk pembelajaran algoritma dasar.
Array Dinamis (Vec)
Ukuran bisa berubah.
Operasi
remove
,push
,insert
sudah tersedia.Lebih praktis untuk penggunaan nyata.
Programmer tidak perlu repot menggeser elemen.
Refleksi
Mengapa array statis masih penting dipelajari meskipun
Vec
lebih praktis?Bagaimana
Option<T>
membantu Rust menangani kemungkinan nilai kosong tanpa error?Bagaimana perbedaan efisiensi antara operasi akses (cepat) dengan operasi sisip/hapus di tengah (lambat) pada array?
Dalam kasus nyata, kapan lebih baik menggunakan array statis, dan kapan menggunakan vector?
Referensi
Materi mengenai Array sebagai salah satu jenis struktur data dan Abstract Data Type (ADT) diadaptasi dari: Sekolah Teknik Elektro dan Informatika, Institut Teknologi Bandung. Jenis Struktur Data & ADT Umum.