Robet Dwi Setiawan-Array-List
Robet Dwi Setiawan-Array-List
Akses berbasis subscript adalah cara untuk mengakses elemen dalam suatu struktur data,
seperti daftar atau larik, menggunakan indeks atau subscript.
Stringifikasi adalah proses mengubah objek menjadi representasi string.
• __repr__(self) : Metode ini biasanya digunakan untuk tujuan debugging atau inspeksi.
Ketika objek dipasskan ke fungsi repr() atau jika diperlukan representasi string formal
objek dalam konteks ekspresi, metode ini akan dipanggil. Dalam kasus di atas,
representasi formal yang diberikan adalah '[]'.
• __str__(self) : Metode ini ketika objek dipasskan ke fungsi str() atau jika objek diubah
menjadi string dengan menggunakan fungsi print(), metode ini akan dipanggil. Dalam
kasus di atas, representasi string informal yang diberikan juga adalah '[]'.
Dengan mendefinisikan metode-metode ini, kita dapat memastikan bahwa objek kita dapat
dengan benar direpresentasikan dalam berbagai konteks.
Iterasi adalah proses mengulangi elemen-elemen dalam suatu objek atau kumpulan data satu
per satu.
• __iter__(self) : Metode ini digunakan untuk mendukung iterasi melalui objek atau
kumpulan data. Ketika objek diiterasi dengan menggunakan loop for, metode ini akan
dipanggil untuk mendapatkan iterator dari objek tersebut. Iterator digunakan untuk
mengatur proses iterasi, memungkinkan akses ke elemen-elemen objek secara
berurutan.
4) Getting started
Kelas List yang diberikan adalah implementasi sederhana dari struktur data daftar (list) dalam
Python. Berikut adalah penjelasan tentang setiap metode dalam kelas tersebut:
• append(self, value) : Metode ini digunakan untuk menambahkan elemen baru ke dalam
objek daftar. Nilai baru yang diberikan akan disimpan dalam atribut val dari objek List.
• __getitem__(self, idx) : Metode ini diimplementasikan untuk mendukung akses
elemen dengan menggunakan indeks. Saat objek List dipanggil dengan menggunakan
subscript seperti x = self[idx], metode ini akan dipanggil dan mengembalikan nilai dari
atribut val.
• __setitem__(self, idx, value) : Metode ini diimplementasikan untuk mendukung
penugasan nilai ke indeks tertentu dalam objek List. Ketika objek List diubah dengan
menggunakan subscript seperti self[idx] = x, metode ini akan dipanggil dan akan
menetapkan nilai yang diberikan ke dalam atribut val.
• __repr__(self) : Metode ini digunakan untuk memberikan representasi formal objek
saat objek tersebut diprint atau direpresentasikan sebagai string. Metode ini
mengembalikan string yang berisi nilai dari atribut val, dibungkus dalam tanda kurung
siku [ ].
I. Dalam kode yang diberikan, Anda membuat objek List baru dengan menggunakan kelas
yang telah didefinisikan sebelumnya. Kemudian, Anda menambahkan nilai 42 ke objek
tersebut menggunakan metode append().
II. Kemudian, Dalam kode tersebut, Anda mencoba untuk mengakses elemen pertama dari
objek l menggunakan subscript [0]. Ini akan memicu pemanggilan metode __getitem__
dari objek l. Jadi, hasilnya akan mengembalikan nilai 42, karena itu adalah nilai yang
terakhir kali ditambahkan ke dalam objek List.
III. Dalam kode tersebut, Anda mencoba untuk menetapkan nilai 331 ke indeks pertama
dari objek l menggunakan subscript [0]. Ini akan memicu pemanggilan metode
__setitem__ dari objek l. Namun, dalam implementasi List yang telah diberikan
sebelumnya, metode __setitem__ hanya menetapkan nilai yang diberikan ke dalam
atribut val. Oleh karena itu, ketika Anda melakukan l[0] = 331, nilai dari atribut val
akan diganti dengan nilai 331.
IV. Dalam kode tersebut, Anda mencoba untuk mengakses elemen dengan indeks 500 dari
objek l menggunakan subscript [500]. Dalam kasus ini, Anda mungkin akan
mendapatkan IndexError, karena objek l tidak memiliki elemen dengan indeks 500. Dan
hasilnya tetap nilai 331.
V. Karena objek l telah dimodifikasi sebelumnya dengan menetapkan nilai 331 ke indeks
pertama, representasi objek tersebut akan mencerminkan nilai tersebut, dibungkus
dalam tanda kurung siku [ ]. Jadi, jika Anda mencetak objek l setelah operasi l[0] = 331,
Anda akan mendapatkan output : 331.
5) NumPy arrays
Spesifikasi dtype=object menunjukkan bahwa kita ingin menggunakan array untuk menyimpan
referensi ke objek Python yang berubah-ubah. Fungsi kosong membuat array dengan ukuran
yang ditentukan, tetapi membiarkan semua elemen tidak diinisialisasi.
• Dalam kode tersebut, Anda mencoba untuk mengisi array arr dengan nilai-nilai hasil
dari operasi pangkat dua pada indeks-indeks tertentu dari 0 hingga 9, dan kemudian
menetapkan nilai 'hello' pada indeks 5 dan nilai 'world' pada indeks 9.
• NumPy mendefinisikan fungsi pada array untuk menambahkan, menyisipkan, dan
menghapus elemen, fungsi ini tidak akan menggunakan satupun darinya. Hal ini karena
masing-masing fungsi beroperasi dengan membuat array baru, menyalin elemen yang
dihasilkan, lalu menghapus array asli.
• Dalam implementasi yang telah diberikan, jika Anda mencetak objek arr, Anda akan
mendapatkan representasi dari objek tersebut, yang diberikan oleh metode __repr__.
Jika nilai-nilai telah ditetapkan dengan benar, Anda akan melihat hasil yang sesuai
dengan apa yang telah Anda lakukan sebelumnya. Dalam kasus ini, jika nilai 'hello'
ditetapkan pada indeks 5 dan nilai 'world' ditetapkan pada indeks 9, representasi objek
arr akan mencerminkan perubahan tersebut. Ini menunjukkan bahwa nilai-nilai pada
indeks 5 dan 9 telah berhasil diperbarui dengan 'hello' dan 'world' secara berturut-turut,
dan nilai-nilai lainnya tetap sama seperti sebelumnya.
6) The ArrayList data structure
import numpy as np mengimport modul numpy dan memberi alias "np". Kemudian, kelas
ArrayList didefinisikan. Ini adalah implementasi kelas yang menggunakan modul numpy untuk
membuat array dinamis yang dapat menyesuaikan kapasitasnya.
• __init__(self) : Metode ini merupakan konstruktor untuk kelas ArrayList. Saat objek
ArrayList dibuat, array data dibuat dengan ukuran awal 1 dan tipe data objek, dan size
diatur menjadi 0.
• append(self, value) : Metode ini digunakan untuk menambahkan nilai ke dalam array.
Jika array data sudah penuh, maka ukuran array akan diperbesar dengan membuat array
baru dengan kapasitas dua kali lipat dan menyalin elemen-elemen yang ada ke array
baru tersebut. Kemudian, nilai yang diberikan akan ditambahkan ke dalam array pada
indeks size dan size akan ditambah 1.
• __getitem__(self, idx) : Metode ini digunakan untuk mendapatkan nilai dari array
berdasarkan indeks yang diberikan. Jika indeks negatif diberikan, itu akan diubah
menjadi indeks relatif terhadap akhir array. Kemudian, jika indeks berada di luar
jangkauan array, akan muncul pengecualian IndexError. Jika indeks valid, nilai dari
array pada indeks tersebut akan dikembalikan.
• __setitem__(self, idx, value) : Metode ini digunakan untuk menetapkan nilai ke dalam
array pada indeks yang diberikan. Seperti __getitem__, ia juga menangani indeks
negatif dan mengecek apakah indeks valid. Jika valid, nilai array pada indeks tersebut
akan diganti dengan nilai yang diberikan.
• __delitem__(self, idx) adalah implementasi untuk menghapus elemen dari array pada
indeks yang diberikan. Metode ini mengimplementasikan operasi del self[idx] pada
objek ArrayList. Itu akan memungkinkan pengguna untuk menghapus elemen dari
array dengan cara yang serupa dengan penggunaan del pada list biasa dalam Python.
Dalam kode yang diberikan, Anda membuat objek ArrayList baru dan kemudian menambahkan
nilai-nilai dari 0 hingga 9 ke dalamnya menggunakan metode append(). Jadi, ketika Anda
mencetak objek l, Anda akan mendapatkan representasi dari objek tersebut yang menunjukkan
nilai-nilai yang telah ditambahkan ke dalamnya, seperti [0,1,2,3,4,5,6,7,8,9]. Ini menunjukkan
bahwa nilai-nilai tersebut telah berhasil ditambahkan ke dalam objek ArrayList.
Dalam kode yang diberikan, Anda mencoba untuk menetapkan nilai 'hello' ke indeks 0 dan
nilai 'world' ke indeks terakhir dari objek l. Setelah operasi ini, jika Anda mencetak objek l,
Anda akan mendapatkan representasi dari objek tersebut yang menunjukkan perubahan nilai-
nilai tersebut.
• Ini menunjukkan bahwa nilai 'hello' telah berhasil ditetapkan ke indeks 0 dan nilai
'world' telah berhasil ditetapkan ke indeks terakhir dari objek l. Nilai-nilai lainnya tetap
tidak berubah.
Dalam kode yang Anda berikan, Anda mencoba menetapkan nilai 'two' ke indeks 2 dan nilai
'seven' ke indeks -3 dari objek l. Setelah operasi ini, jika Anda mencetak objek l, Anda akan
mendapatkan representasi dari objek tersebut yang menunjukkan perubahan nilai-nilai tersebut.
• Ini menunjukkan bahwa nilai 'two' telah berhasil ditetapkan ke indeks 2 dan nilai 'seven'
telah berhasil ditetapkan ke indeks -3 dari objek l. Nilai-nilai lainnya tetap tidak
berubah.
Dalam kode yang diberikan, Anda mencoba untuk menghapus elemen pada indeks 5 dari objek
l menggunakan pernyataan del. Setelah operasi ini, jika Anda mencetak objek l, Anda akan
mendapatkan representasi dari objek tersebut yang menunjukkan elemen pada indeks 5 telah
dihapus.
• Ini menunjukkan bahwa elemen pada indeks 5 (nilai 'five') telah berhasil dihapus dari
objek l. Nilai-nilai lainnya tetap tidak berubah.
Dalam kode yang Anda berikan, Anda mencoba menghapus elemen pada indeks 0 dan indeks
terakhir dari objek l menggunakan pernyataan del. Setelah operasi ini, elemen pertama dan
terakhir dari objek l akan dihapus.
• Ini menunjukkan bahwa elemen pertama ('hello') dan terakhir ('world') telah berhasil
dihapus dari objek l. Nilai-nilai lainnya tetap tidak berubah.
Dalam kode yang Anda berikan, Anda mencoba untuk memperoleh panjang objek l dengan
menggunakan fungsi len(). Setelah operasi ini, Anda akan mendapatkan panjang atau jumlah
elemen dalam objek l.
• Ini menunjukkan bahwa objek l saat ini memiliki 7 elemen setelah elemen pertama dan
terakhir dihapus.
7) Runtime analysis
Dalam kode yang diberikan, import numpy as np mengimport modul numpy dan memberinya
alias "np". Kemudian, kelas ArrayList didefinisikan. Kelas ini memiliki atribut data yang
merupakan array numpy dengan ukuran awal 1 dan tipe data objek, serta atribut size yang
mengikuti jumlah elemen yang saat ini disimpan dalam array.
Metode append(self, value, doubling=True) digunakan untuk menambahkan nilai ke dalam
array. Jika array data sudah penuh, metode ini akan memperbesar ukuran array sesuai dengan
parameter doubling. Jika doubling diatur sebagai True (default), maka ukuran array akan
diubah menjadi dua kali lipat ukuran sebelumnya. Jika doubling diatur sebagai False, maka
ukuran array akan ditambahkan sebanyak 1000 elemen. Setelah operasi ini, nilai yang
diberikan akan ditambahkan ke dalam array pada indeks size, dan size akan ditambah 1.
Ini adalah metode append yang diperbarui dengan kemampuan untuk memperbesar array
dengan cara yang fleksibel tergantung pada argumen doubling. Ini memungkinkan kontrol
lebih besar atas bagaimana array diperbesar dan dapat digunakan dalam skenario di mana
peningkatan kapasitas yang konsisten diperlukan.
Kode yang Anda berikan menggunakan modul timeit untuk mengukur waktu eksekusi dari dua
skenario yang berbeda dalam kelas ArrayList, yaitu ketika doubling=True dan ketika
doubling=False. Plot hasilnya menggunakan modul matplotlib.pyplot. Dalam kode tersebut :
• ns adalah array numpy yang berisi jumlah iterasi yang berbeda.
• ts1 dan ts2 adalah daftar yang berisi waktu eksekusi untuk setiap ukuran iterasi, di mana
ts1 adalah waktu eksekusi ketika doubling=True dan ts2 adalah waktu eksekusi ketika
doubling=False.
• Kemudian, kedua daftar ini digunakan sebagai sumbu x dan y dalam plot, di mana
sumbu x adalah jumlah iterasi (ns) dan sumbu y adalah waktu eksekusi (ts1 dan ts2).
Plot tersebut menunjukkan perbandingan waktu eksekusi antara kedua skenario (dengan dan
tanpa penggandaan ukuran array) seiring dengan pertambahan jumlah iterasi. Dari plot
tersebut, Anda dapat melihat bagaimana waktu eksekusi berkembang seiring dengan
pertambahan ukuran masukan.