KELOMPOK 3
FAKULTAS TEKNIK
2022
Puji syukur senantiasa kita panjatkan ke hadirat Tuhan yang maha Esa, yang berkuasa
atas seluruh alam semesta, karena berkat rahmat, taufik serta hidayah-Nya jugalah maka Laporan
Critical Book Review (CBR) dan analisis studi kasus mata kuliah Struktur Data ini dapat
diselesaikan tepat pada waktunya.
Kami menyadari bahwa dalam penyusunan tugas CBR ini tidak terlepas dari kesalahan
dan sangat jauh dari sempurna. Oleh sebab itu, kami sangat mengharapkan kritik dan saran yang
sifatnya membangun demi sempurnanya laporan ini. Kami berharap semoga laporan ini dapat
digunakan sebagaimana mestinya dan bisa memberikan manfaat bagi kita semua. Semoga Tuhan
yang maha Esa mencurahkan rahmat dan karunia-Nya kepada kita semua.
Penyusun
Kelompok 3
KATA PENGANTAR
DAFTAR ISI
BAB I : PENDAHULUAN
A. BUKU 1
B. BUKU 2
BAB IV : PENUTUP
A. Kesimpulan
B. Daftar Pustaka
PENDAHULUAN
Critical Book Review (CBR) merupakan salah satu instrument yang dapat mendukung
keberhasilan dalam proses pembelajaran dibangku perkuliahan melalui Critical Book Review
(CBR) mahasiswa diajak untuk menguji pemikiran dari pengarang maupun penulis berdasarkan
sudut pandang yang akan di bangun oleh setiap mahasiswa berdasarkan pengetahuan &
Untuk menyelesaikan kewajiban tugas pada Mata Kuliah Struktur Data sekaligus untuk
untuk meningkatkan pengetahuan tentang SET dan MAPS .
Untuk meningkatkan wawasan dalam bidang Struktur Data
C. Manfaat CBR
❖ Bagi Penulis :
❖ Bagi Pembaca:
Menambah pengetahuan dan wawasan mengenai SET dan MAPS pada Struktur Data
Dapat mengaplikasikannya secara langsung.
BUKU 1
ISBN : 978-0-470-61829-5
Penerbit : Springer
ISBN : 978-3-319-13071-2
ISI BUKU
A. BUKU 1
1. Set
Set ADT adalah wadah yang biasa digunakan dalam ilmu komputer. Namun, tidak seperti
bagian ADT yang diperkenalkan di Bab 1, himpunan berisi nilai unik dan mewakili struktur
yang sama dengan matematika. Ini biasanya digunakan saat anda perlu menyimpan koleksi
nilai unik terlepas dari cara penyimpanannya, atau saat anda perlu melakukan operasi
himpunan matematika yang berbeda pada koleksi.
Definisi tipe data abstrak yang ditentukan disediakan di sini, diikuti dengan implementasi
menggunakan daftar. Bab berikutnya memberikan dan mengevaluasi implementasi alternatif
dari himpunan ADT.
Set adalah wadah yang menyimpan sekumpulan nilai unik pada domain tertentu, seperti, dan
nilai yang disimpan tidak dalam urutan tertentu.
Set (): Membuat set baru yang diinisialisasi dengan set kosong.
Panjang (): Mengembalikan jumlah elemen dalam himpunan. Ini juga dikenal sebagai
kardinalitas.
Akses melalui fungsi len(). Menunjukkan apakah nilai yang ditentukan adalah elemen
dari himpunan dan mengembalikan nilai Boolean yang sesuai.
Add (elemen): Ubah himpunan dengan menambahkan nilai yang ditetapkan ke
himpunan atau elemen jika elemen tersebut belum menjadi anggota. Jika elemen tidak
unik, tidak ada tindakan yang dilakukan dan operasi dilewati.
Contoh aplikasi
smith = Set()
smith.add( "CSCI-112" )
smith.add( "MATH-121" )
smith.add( "HIST-340" )
smith.add( "ECON-101" )
roberts.add( "POL-101" )
roberts.add( "ANTH-230" )
roberts.add( "CSCI-112" )
roberts.add( "ECON-101" )
Kemudian tentukan apakah kedua siswa tersebut mengambil mata kuliah yang sama persis.
Jika tidak, saya ingin tahu apakah mereka mengambil kursus yang sama. Untuk melakukan
ini, hitung persimpangan antara dua set.
If smith == robert:
sameCourses.isEmpty():
print ("Smith and Roberts" \ + "tidak mengambil mata kuliah yang sama.")
lainnya:
percetakan (kursus)
CSCI112 ECON101
Misalkan Smith ingin tahu kursus mana yang dia ambil dan yang tidak diambil Roberts. Ini
dapat dikonfirmasi oleh operasi changeset.
mencetak(kursus)
Contoh ini memperkuat salah satu manfaat menggunakan abstraksi daripada bagaimana
mengimplementasikan fitur tersebut dengan berfokus pada fitur yang disediakan ADT.
Dengan menyembunyikan detail implementasi, kita dapat menggunakan ADT independen
dari implementasinya. Sebenarnya, pilihan implementasi untuk Set ADT tidak akan
berpengaruh pada instruksi dalam contoh program kita.
Untuk mengimplementasikan Set ADT, Anda harus memilih struktur data berdasarkan
kriteria yang digunakan untuk kantong ADT pada Bab 1. Karena saya mencoba untuk
menduplikasinya, mengatur fungsionalitas struktural yang disediakan oleh Python. Ingatlah
bahwa kamus berisi pasangan kunci / nilai, ini membutuhkan dua bidang data untuk setiap
entri. Untuk menggunakan struktur array. Simpan elemen set dan sediakan, seperti dalam
kasus tas Fungsionalitas ADT penuh. Daftar memungkinkan nilai duplikat, jadi Namun,
sebagai bagian dari implementasi, Anda perlu memastikan tidak ada duplikat yang
ditambahkan ke set.
Anda dapat memilih struktur daftar untuk mengimplementasikan kumpulan ADT, seperti,
seperti yang ditunjukkan pada Gambar 1. Beberapa operasi himpunan sangat mirip dengan
Seperti yang disebutkan sebelumnya, struktur daftar tidak menambahkan nilai duplikat, jadi
Anda perlu memastikan bahwa tidak ada nilai duplikat yang ditambahkan ke kumpulan. Saat
menerapkan metode tambah yang ditunjukkan pada baris 16-18, Anda harus terlebih dahulu
menentukan apa yang disediakan. Apakah item tersebut sudah ada dalam daftar. Jika itemnya
unik, tambahkan saja nilainya di akhir daftar. Jika item diduplikasi, jangan lakukan apa pun.
Ini karena definisi untuk operasi tambah () menunjukkan bahwa tindakan tidak dilakukan
saat mencoba menambahkan nilai duplikat.
Untuk operasi yang memerlukan set kedua sebagai argumen, Anda dapat menggunakan
operasi ADT set itu sendiri untuk mengakses dan memanipulasi data di set kedua.
Pertimbangkan operasi "sama" dari, yang berlaku untuk baris 26-30 dari Gambar 1, untuk
menentukan apakah dua set berisi elemen yang sama persis. Pastikan kedua himpunan berisi
jumlah elemen yang sama. Kalau tidak, mereka tidak bisa sama. Membandingkan elemen
individu tidak efisien karena kita telah mengetahui bahwa kedua himpunan tidak mungkin
sama.
Mencari item data berdasarkan nilai kunci unik adalah aplikasi yang sangat umum dalam
ilmu komputer. Tipe data abstrak yang menyediakan tipe pencarian ini sering disebut
sebagai peta atau kamus karena mereka memetakan kunci ke nilai yang sesuai. Pikirkan
tentang masalah lulusan perguruan tinggi yang perlu mengelola dan memproses sejumlah
besar data terkait siswa. Untuk melacak informasi atau catatan, pencatat memberikan setiap
siswa nomor identifikasi siswa yang unik, seperti yang ditunjukkan pada Gambar 3. Jika
pendaftar perlu mengambil informasi siswa nanti, nomor identifikasi itu akan digunakan.
Pendekatan penguncian ini memberi Anda akses ke catatan siswa tertentu.
Peta adalah wadah untuk menyimpan kumpulan catatan, dan setiap catatan dikaitkan dengan
kunci unik. Komponen utama harus setara.
Kami sebelumnya telah menunjukkan bahwa banyak struktur data yang berbeda dapat
digunakan untuk mengimplementasikan peta. Kami tidak menggunakan struktur ini karena
kami mencoba untuk menduplikasi fungsi kamus yang disediakan oleh Python. Implementasi
bag dan set ADT menggunakan satu daftar untuk menyimpan barang individu. Namun, untuk
ADT Peta, Anda perlu menyimpan komponen kunci dan komponen nilai yang sesuai untuk
setiap entri di peta.
Untuk beberapa alasan, tidak mungkin untuk menambahkan pasangan komponen ke daftar
tanpa mempertahankan asosiasi . Satu untuk kunci dan satu untuk nilai yang sesuai. Untuk
mencapai ini, setiap kunci / nilai harus disimpan dalam elemen yang sesuai dari daftar
paralel, dan pemetaan ini harus dipertahankan.
3. Array Multi-Dimensi
Di Bab 2, kita bekerja dengan array satu dan dua dimensi, tetapi array bisa menjadi lebih
besar dari dua dimensi. Faktanya, array dapat berisi sejumlah dimensi yang mungkin
diperlukan untuk masalah tertentu. Gambar 4 mengilustrasikan tampilan abstrak dari a array
dua dan tiga dimensi. Seperti yang kita lihat sebelumnya, array dua dimensi adalah biasanya
dilihat sebagai tabel atau kisi yang terdiri dari baris dan kolom.
Array 3D dapat divisualisasikan sebagai kisi tabel di mana setiap tabel dibagi menjadi baris
dan kolom
Untuk mengakomodasi array multidimensi dengan dua atau lebih dimensi, kami
mendefinisikan ADT MultiArray yang, seperti tipe data abstrak array sebelumnya,
memisahkan operasi yang biasanya disediakan oleh array di sebagian besar bahasa
pemrograman yang menyediakan struktur array.
Array multidimensi terdiri dari kumpulan elemen yang diatur dalam beberapa dimensi. Setiap
elemen direferensikan dengan menetapkan tupel atau indeks untuk beberapa komponen (i1,
i2, ... in), satu untuk setiap dimensi himpunan. Semua indeks tupel dimulai dari nol.
MultiArray (d1, d2, .. dn): Membuat array elemen multidimensi n-dimensi, setiap
elemen awalnya diatur ke None. Nomor dimensi yang ditentukan oleh jumlah
argumen harus lebih besar dari 1.
Dims(): Mengembalikan jumlah dimensi dalam larik multidimensi.
Panjang (redup): Mengembalikan panjang dimensi larik yang ditentukan. Setiap
dimensi diberi nomor dimulai dengan 1. Di mana 1 mewakili dimensi pertama atau
tertinggi dari array.
clear (nilai): Menghapus array dengan mengatur setiap elemen ke nilai yang
ditentukan.
Pada Array Multi-Dimensi, bahasa pemrograman hanya perlu menyediakan sintaks yang sesuai
untuk menggunakan larik 1-D. Array multi-dimensi tidak ditangani di tingkat perangkat keras.
Sebaliknya, bahasa pemrograman biasanya menyediakan mekanismenya sendiri untuk membuat
dan mengelola array multi-dimensi.
Array satu dimensi terdiri dari sekelompok elemen berurutan yang disimpan di lokasi memori
yang berurutan. Indeks yang digunakan untuk mereferensikan elemen tertentu hanyalah offset
dari elemen pertama dalam array. Dalam kebanyakan bahasa pemrograman, array multi dimensi
sebenarnya dibuat dan disimpan dalam memori sebagai array satu dimensi. Dengan organisasi
ini, array multidimensi hanyalah tampilan abstrak dari struktur data fisik satu dimensi.
Penyimpanan Array
Array satu dimensi biasanya digunakan untuk menyimpan array dimensi yang lebih tinggi secara
fisik. Pertimbangkan array dua dimensi yang dibagi menjadi tabel baris dan kolom seperti yang
diilustrasikan pada Gambar 3.6. Elemen dapat disimpan dalam urutan baris-utama atau urutan
kolom-utama. Sebagian besar bahasa pemrograman tingkat tinggi menggunakan urutan baris-
utama, dengan FORTRAN menjadi salah satu dari sedikit bahasa yang menggunakan urutan
kolom-utama untuk menyimpan dan mengelola array 2-D.
Komputasi Indeks
Perhatikan larik 2-D yang diilustrasikan pada Gambar 3.8 dan amati lokasi penyimpanan fisik
dalam larik 1-D untuk elemen pertama dalam beberapa baris. Elemen (0; 0) dipetakan ke posisi 0
karena merupakan elemen pertama dalam larik 2-D abstrak dan fisik 1-D. Entri pertama dari
baris kedua (1; 0) dipetakan ke posisi n karena mengikuti n elemen pertama dari baris pertama.
Demikian juga, elemen (2; 0) dipetakan ke posisi 2n karena mengikuti elemen 2n pertama dalam
dua baris pertama. Kita dapat melanjutkan dengan cara yang sama melalui semua baris, tetapi
Anda akan segera melihat posisi elemen pertama dari baris ke-i adalah
Mengetahui posisi elemen pertama dari setiap baris, posisi elemen apa pun dalam larik 2D dapat
ditentukan. Diberikan sebuah elemen (i; j) dari larik 2-D, lokasi penyimpanan elemen itu dalam
larik 1-D dihitung sebagai
indeks2(i; j) = i∗n+ j
Indeks kolom, j, tidak hanya offset dalam baris yang diberikan tetapi juga jumlah elemen yang
harus dilewati pada baris ke-i untuk mencapai kolom ke-j. Untuk melihat formula ini beraksi,
perhatikan kembali larik 2-D dari Gambar 3.7 dan asumsikan kita ingin mengakses elemen (2;
3). Menemukan elemen target dalam larik 1-D memerlukan melewatkan 2 baris lengkap elemen
pertama:
indeks3 (i 1 , i 2, i 3) = i 1 ¿ (d ¿ ¿ 2¿ d 3 )+i 2 ¿ d 3 +i 3 ¿
Untuk setiap komponen (i) dalam subskrip, persamaan menghitung jumlah elemen yang harus
dilewati dalam dimensi yang sesuai. Misalnya, faktor (d ¿ ¿ 2 ¿ d 3)¿ menunjukkan jumlah elemen
dalam satu tabel kubus. Ketika dikalikan dengani 1 kita mendapatkan jumlah tabel lengkap yang
harus dilewati dan pada gilirannya jumlah elemen yang harus dilewati untuk sampai pada elemen
pertama tabel i 1.
Bagian persamaan yang tersisa (i 2 x d 3 +i3 ) setara dengan indeks2 (i 2 ,i 3) , yang menunjukkan
jumlah elemen yang akan dilewati dalam tabel i 1. Saat jumlah dimensi meningkat, produk
tambahan ditambahkan ke persamaan, satu untuk setiap dimensi baru. Misalnya, persamaan
untuk menghitung offset untuk array 4-D adalah
Anda mungkin melihat sebuah pola berkembang seiring dengan bertambahnya jumlah dimensi.
Pola ini mengarah ke persamaan umum untuk menghitung offset larik 1-D untuk elemen
i 1 , i 2 ,… , i n dalam larik n-dimensi:
Saat menggunakan fungsi, kita dapat melewatkan sejumlah variabel argumen untuk
setiap pemanggilan. Misalnya, semua berikut ini adalah panggilan fungsi yang valid:
func( 12 )
Number of arguments: 1
Sum of the arguments: 12
Number of arguments: 3
Sum of the arguments: 15
Number of arguments: 5
Sum of the arguments: 93
Tanda bintang di sebelah nama argumen (*args) memberi tahu Python untuk menerima
sejumlah argumen dan menggabungkannya menjadi tupel. Tuple kemudian diteruskan ke fungsi
dan ditugaskan ke argumen formal yang ditandai dengan tanda bintang. Perhatikan tanda bintang
hanya digunakan dalam daftar argumen untuk menunjukkan bahwa fungsi atau metode dapat
menerima sejumlah argumen. Itu bukan bagian dari nama argumen. Operasi len() dapat
diterapkan ke tupel untuk menentukan jumlah argumen aktual yang diteruskan ke fungsi.
Argumen individu, yang merupakan elemen dalam tupel, dapat diakses dengan menggunakan
notasi subskrip atau dengan mengulangi koleksi.
41
42 # Sets the contents of element (i_1, i_2, ..., i_n).
43 def __setitem__( self, ndxTuple, value ):
44 assert len(ndxTuple) == self.numDims(), "Invalid # of array subscripts."
45 index = self._computeIndex( ndxTuple )
46 assert index is not None, "Array subscript out of range."
47 self._elements[index] = value
48
49 # Computes the 1-D array offset for element (i_1, i_2, ... i_n)
50 # using the equation i_1 * f_1 + i_2 * f_2 + ... + i_n * f_n
51 def _computeIndex( self, idx ):
52 offset = 0
53 for j in range( len(idx) ):
54 # Make sure the index components are within the legal range.
55 if idx[j] < 0 || idx[j] >= self._dims[j] :
56 return None
57 else : # sum the product of i_j * f_j.
58 offset += idx[j] * self._factors[j]
59 return offset
60
61 # Computes the factor values used in the index equation.
62 def _computeFactors( self ):
63 ......
Konstruktor didefinisikan untuk menerima argumen panjang variabel seperti yang dipersyaratkan
dalam definisi ADT. Tuple yang dihasilkan akan berisi ukuran dimensi individu dan ditetapkan
ke bidang redup. Dimensi larik harus diverifikasi di awal konstruktor karena ADT MultiArray
dimaksudkan untuk digunakan dengan larik dua dimensi atau lebih.
Perhitungan dan inisialisasi sebenarnya dilakukan oleh metode helper computeFactors(), yang
dibiarkan sebagai latihan. Contoh contoh kelas MultiArray diilustrasikan pada Gambar 3.9.
Dalam versi multi-dimensi dari array, tidak ada nilai panjang tunggal. Sebaliknya, setiap dimensi
array memiliki ukuran terkait. Fungsi len() Python tidak dapat digunakan untuk tugas ini karena
kita harus menentukan dimensi tertentu untuk mendapatkan ukurannya. Sebagai gantinya,
metode length(), seperti yang ditunjukkan pada baris 26{29 dari Listing 3.3, digunakan. Metode
pertama memverifikasi indeks dimensi yang diberikan adalah antara 1 dan n, yang merupakan
rentang hukum yang ditentukan dalam definisi ADT. Ukuran dimensi yang diminta kemudian
dikembalikan menggunakan nilai yang sesuai dari dims tuple. Metode numDims()
mengembalikan dimensi larik, yang dapat diperoleh dari jumlah elemen dalam tupel redup.
Akses Elemen
Akses ke elemen individu dalam array nD memerlukan n-tupel atau subskrip multikomponen,
satu untuk setiap dimensi. Seperti yang ditunjukkan dalam Bagian 2.3.2, ketika subskrip multi-
komponen ditentukan (yaitu, y = x[i,j]), Python secara otomatis menyimpan komponen dalam
sebuah tupel dalam urutan yang tercantum dalam tanda kurung dan meneruskan tupel ke
argumen ndxTuple.
Konten ndxTuple diteruskan ke metode helper computeIndex() untuk menghitung offset indeks
dalam larik penyimpanan 1-D. Penggunaan metode pembantu mengurangi kebutuhan akan kode
Menghitung Offset
Metode helper computeIndex(), yang ditunjukkan pada baris 51{59 dari Listing 3.3,
mengimplementasikan Persamaan 3.4, yang menghitung offset dalam larik penyimpanan 1-D.
Metode ini juga harus memverifikasi komponen subskrip berada dalam rentang hukum dari
panjang dimensi. Jika valid, offset dihitung dan dikembalikan; jika tidak, None dikembalikan ke
indeks array yang tidak valid. Dengan mengembalikan None dari metode helper alih-alih
memunculkan pengecualian di dalam metode, informasi yang lebih baik dapat diberikan kepada
programmer mengenai operasi akses elemen yang tepat yang menyebabkan kesalahan.
Lazy Mart, Inc. adalah department store rantai regional kecil dengan lokasi di beberapa kota dan
negara bagian yang berbeda. Perusahaan memelihara kumpulan catatan penjualan untuk berbagai
item yang dijual dan ingin menghasilkan beberapa jenis laporan yang berbeda dari data ini. Salah
satu laporan tersebut, misalnya, adalah penjualan tahunan menurut toko, seperti yang
diilustrasikan pada Gambar 3.13 di halaman berikutnya, sementara laporan lainnya dapat
mencakup total penjualan di semua toko untuk bulan tertentu atau barang tertentu.
Data penjualan tahun kalender saat ini untuk semua toko Lazy Mart disimpan sebagai kumpulan
entri dalam file teks. Misalnya, berikut ini mengilustrasikan beberapa baris pertama dari contoh
file teks data penjualan:
100
5 11 85 45,23
1 8 75 39,77
di mana baris pertama menunjukkan jumlah toko; baris kedua menunjukkan jumlah item
individual (keduanya bilangan bulat); dan baris yang tersisa berisi data penjualan. Setiap baris
data penjualan terdiri dari empat informasi: nomor toko, nomor bulan, nomor barang, dan jumlah
penjualan untuk barang tertentu di toko tertentu selama bulan tertentu. Untuk mempermudah,
nomor toko dan item akan terdiri dari nilai bilangan bulat berurutan dalam rentang [1…max], di
mana max adalah jumlah toko atau item yang diambil dari dua baris pertama file. Bulan
ditunjukkan dengan bilangan bulat dalam kisaran [1…12] dan jumlah penjualan adalah nilai
floating-point.
Organisasi Data
Sementara beberapa laporan mudah dibuat hanya dengan mengekstrak data dan menulisnya ke
laporan, yang lain mengharuskan kita mengatur data dengan cara yang berarti untuk mengekstrak
informasi yang dibutuhkan. Di mana kita mungkin perlu menghasilkan banyak laporan berbeda
dari kumpulan data yang sama. Struktur ideal untuk menyimpan data penjualan adalah array 3-D,
seperti yang ditunjukkan pada Gambar 3.14, di mana satu dimensi mewakili toko, dimensi lain
mewakili barang yang dijual di toko, dan dimensi terakhir mewakili masing-masing dari 12
bulan di toko. tahun kalender. Array 3-D dapat dilihat sebagai kumpulan spreadsheet, seperti
yang diilustrasikan pada Gambar 3.15.
Karena nomor toko, item, dan bulan semuanya terdiri dari nilai bilangan bulat berurutan mulai
dari 1, kita dapat dengan mudah mewakili masing-masing dengan indeks unik yang kurang satu
dari angka yang diberikan. Misalnya, data bulan Januari akan disimpan di kolom 0, data bulan
Februari akan disimpan di kolom 1, dan seterusnya. Demikian juga data soal nomor 1 akan
disimpan di baris 0, data nomor 2 akan disimpan di baris 1, dan seterusnya. Kami meninggalkan
ekstraksi data yang sebenarnya dari file teks sebagai latihan. Tetapi untuk tujuan ilustrasi, kami
menganggap langkah ini telah selesai menghasilkan pembuatan dan inisialisasi array 3-D seperti
yang ditunjukkan di sini:
Dengan data yang dimuat dari file dan disimpan dalam array 3-D, kami dapat menghasilkan
berbagai jenis laporan atau mengekstrak berbagai informasi dari data penjualan. Misalnya, kita
# Compute the total sales of all items for all months in a given store.
# Subtract 1 from the store # since the array indices are 1 less
s = store-1
total = 0.0
total += salesData[s, i, m]
return total
Dengan asumsi pandangan kami tentang data sebagai kumpulan spreadsheet, ini membutuhkan
melintasi setiap elemen dalam spreadsheet yang berisi data untuk penyimpanan yang diberikan.
Jika simpan sama dengan 1, ini setara dengan memproses setiap elemen dalam spreadsheet yang
ditunjukkan di depan Gambar 3.15. Diperlukan dua loop bersarang karena kita harus
menjumlahkan nilai dari setiap baris dan kolom yang terdapat dalam spreadsheet toko yang
diberikan. Jumlah baris (nomor dimensi 2) dan kolom (nomor dimensi 3) dapat diperoleh dengan
menggunakan metode array length().
# Compute the total sales of all items in all stores for a given month.
m = month - 1
total = 0.0
total += salesData[s, i, m]
return total
Kali ini, dua loop bersarang harus mengulangi setiap baris dari setiap spreadsheet untuk satu
kolom yang mewakili bulan tertentu. Jika kita menggunakan fungsi ini untuk menghitung total
penjualan untuk bulan Januari, elemen array 3-D yang akan diakses ditunjukkan oleh area yang
diarsir pada Gambar 3.16.
Nilai lain yang dapat kita hitung dari data penjualan dalam larik 3-D adalah total penjualan untuk
item tertentu, yang mencakup angka penjualan selama 12 bulan dan dari 8 toko. Ini dihitung
dengan fungsi berikut:
# Compute the total sales of a single item in all stores over all months.
29 |Laporan CBR dan Analisis Studi Kasus_Kelompok 3
def totalSalesByItem( salesData, item ):
m = item - 1
total = 0.0
total += salesData[s, i, m]
return total
Sel-sel larik yang akan diakses saat menggunakan fungsi ini untuk menghitung total penjualan
untuk item nomor 5 ditunjukkan oleh area yang diarsir pada Gambar 3.17. Ingat, penjualan untuk
setiap item disimpan dalam baris tertentu dari array dan indeks baris tersebut kurang dari satu
nomor item karena indeks dimulai dari 0.
Misalkan kita ingin menghitung total penjualan bulanan untuk masing-masing dari 12 bulan di
toko tertentu. Sementara contoh sebelumnya menghitung nilai tunggal, tugas ini membutuhkan
# Compute the total sales per month for a given store. A 1-D array is
s = store - 1
totals = Array( 12 )
sum = 0.0
# Iterate over the sales of each item sold during the m month.
sum += salesData[s, i, m]
totals[m] = sum
return totals
Gambar 3.17 mengilustrasikan penggunaan larik 1-D untuk menyimpan total bulanan individu.
Area yang diarsir menunjukkan elemen larik 3-D yang diakses saat menghitung total penjualan
B. BUKU 2
A. Memainkan Sudoku
Ketika bermain sudoku seperti Gambar 5.1, tugas kita adalah menemukan sisa angka yang
diberikan nomor yang sudah muncul di teka-teki. Cara umum untuk memecahkan teka-teki
ini adalah dengan proses eliminasi. Cara ini membantu untuk menuliskan nilai yang mungkin
untuk teka-teki dan kemudian menghilangkan nilai yang mungkin satu per satu. Misalnya,
teka-teki pada Gambar 5.1 dapat dianotasi dengan nilai yang mungkin untuk yang tidak
diketahui seperti yang ditunjukkan pada Gambar 5.2 .
Gambar 5.2
ATURAN 1 . Aturan pertama adalah generalisasi dari proses yang digunakan di atas
untuk menghapus beberapa nilai dari sel . Di dalam grup, cari sel yang berisi kumpulan
nilai yang mungkin sama. Jika kardinalitas himpunan (yaitu jumlah item dalam
ATURAN 2 . Aturan kedua melihat setiap sel dalam grup dan membuang semua item
yang muncul di sel lain dalam grup. Jika kita dibiarkan dengan hanya satu nilai di sel
yang dipilih, maka itu harus muncul di sel ini dan sel dapat diperbarui dengan membuang
Gambar 5.3
B. Set
Algoritma reduksi untuk teka-teki Sudoku memanipulasi set angka dan menghilangkan nilai
yang mungkin dari set tersebut saat pengurangan berlangsung. Himpunan adalah kumpulan
yang tidak mengizinkan nilai duplikat. Set dapat terdiri dari nilai apa pun seperti bilangan
bulat, objek karyawan, karakter, string, secara harfiah objek apa pun dengan Python dapat
menjadi elemen dari beberapa set. Suatu himpunan memiliki kardinalitas . Kardinalitas
suatu himpunan adalah jumlah item di dalamnya.
Tabel di atas menjelaskan operasi yang didefinisikan secara umum pada himpunan dan
kompleksitas komputasi terkaitnya. Python memiliki dukungan bawaan untuk dua jenis set,
set dan kelas frozenset. Kelas frozenset tidak dapat diubah. Objek dari kelas yang ditetapkan
dapat bermutasi. Pada table di atas, variabel s harus berupa himpunan dan variabel t harus
berupa urutan yang dapat diubah , yang akan mencakup himpunan.
Operasi pada table di bawah tidak didefinisikan pada kelas frozenset karena mereka
mengubah set s . Mereka hanya didefinisikan pada kelas yang ditetapkan . Sekali lagi, ada
operator untuk beberapa metode yang disajikan pada Gambar 5.5 . Metode serikat mutator
Tanpa uji keanggotaan O(1), mengambil gabungan dua himpunan akan membutuhkan lebih
lama seperti yang ditunjukkan di atas. Pengujian keanggotaan set dalam waktu O(1)
dilakukan dengan menggunakan hashing. Hashing adalah konsep yang sangat penting dalam
Ilmu Komputer dan terkait dengan akses acak di komputer.
Jika kita ingin mengimplementasikan suatu himpunan di mana kita dapat menguji
keanggotaan dalam waktu O(1), kita mungkin berpikir untuk menyimpan item-item
himpunan tersebut dalam sebuah daftar. Python (dan banyak bahasa modern lainnya) telah
disertakan fungsi yang disebut hash yang dapat dipanggil pada objek apa pun untuk
mengembalikan nilai integer untuk Sebuah Objek. Kami akan menyebut nilai ini sebagai
kode hash objek atau nilai hash . Pertimbangkan ini panggilan ke fungsi hash.
>>> hash("abc")
-1600925533
>>> hash("123")
1911471187
>>> hash(45)
45
>>> hash(45.0)
45
>>> hash(45.3)
1503225491
>>> hash(False)
>>> hash([1,2,3])
>>>
Sementara sebagian besar objek dapat di- hash , tapi tidak untuk setiap objek. Secara khusus,
objek yang dapat diubah seperti daftar mungkin tidak dapat di- hash karena ketika suatu
objek dimutasi, nilai hash-nya juga dapat berubah. Hal ini memiliki konsekuensi saat
menggunakan nilai hash dalam struktur data.
D. KELAS HASHSET
Nilai Hash dapat digunakan untuk menghitung indeks kedalam bentuk daftar(list) untuk
mendapatkan pencarian item O(1) yang kompleks. Sebuah set class dapat ditulis untuk
menyembunyikan detai list dan memanggil fungsi hash yang berguna untuk menemukan
indeks suatu item. Kelas Hashnet disajikan guna menunjukkan bagaimana set kelas
diimpelmentasikan. Pada awalnya objek Hashset akan berisi daftar dan nomor item yang
tidak bernilai. Namun list harus diisi oleh item yang memiliki nilai karena hashet tidak
berfungsi untuk menyimpan suatu item yang tidak bernilai di dalam daftar(list).Namun
faktanya , beberapa hashset bernilai negative namun tidak negative Ketika dimasukkan
kedalam daftar.
1) KONSTRUKSI HASHSET
Untuk menyimpan item dalam hash set, pertama-tama kita menghitung indeksnya
menggunakan fungsi hash. Ada dua masalah yang harus dihadapi. Pertama, daftar tempat
item yang disimpan harus memiliki panjang yang terbatas dan tidak boleh sama dengan nilai
hash unik yang akan kita hasilkan dengan memanggil fungsi hash.Kedua , Nilai hash belum
tentu unik. Nilai hash merupakan bilangan bulat dan kemungkinan munculnya bilangan
dalam komputer juga akan .Selain itu, karena telah membagi nilai hash dengan panjang
daftar, sisa, atau dengan indeks daftar, maka nilai hash akan menjadi kurang unik daripada
nilai hash yang asli.
Ketika dua objek perlu disimpan pada indeks yang sama dalam daftar hash set, maka akan
terjadi suatu tabrakan.Untuk menangani masalah ini diperlukan untuk menemukan skema
resolusi tabrakannya.Terdapat berbagai jenis skema. Salah satunya adalah skema yang
disebut Linear Probing .Ketika tabrakan muncul Ketika menggunakan Linear Probing , kita
bisa melihat lokasi selanjutnya pada list dan menentukan apakah lokasi tersebut tersedia atau
tidak.Lokasi yang tersedia dapat dilihat jika ditemukan sebuah None Value pada list .
Ketika hanya terdapat satu posisi yang tersedia dalam daftar hashset , pencarian linear akan
melakukan pencarian ke seluruh isi list. Ketika list penuh maka hasilnya akan menjadi
perulangan tak hingga.Oleh karena itu untuk memastikan bahwa kita mendapatkan
komplesitas yang diamortisasi dari O(1) , list tidak boleh tersisi penuh.
5) FAKTOR BEBAN
Faktor beban adalah kelengkapan list hash set. Fakor beban sebuah hash set dapat ditentukan
dengan membagi jumlah item yang disimpan dengan Panjangnya. Faktor beban yang kecil
berarti memiliki list yang lebih besar daripada jumlah item yang disimpan dan kemungkinan
6) MENAMBAHKAN HASHSET
Menghapus nilai dari Hash set berarti menemukan item terlebih dahulu.Hal ini mubgkin akan
melibatkan proses pencarian linear dalam rantai nilai yang berada pada list. Jika sebuah nilai
dihapus maka nilai terakhir dalam rantai akan diganti dengan none value dan item diganti
dengan objek placeholder agar rantai tidak putus dan linear probing dapat terus melanjutkan
tugasmua umtuk mencari objek bila diperlukan.
Saat menghapus item, faktor beban mungkin terlalu rendah untuk menggunakan ruang di
memori secara efisien. Ketika faktor beban turun di bawah 25%, daftar tersebut diulang lagi
untuk mengurangi ukuran daftar hingga setengahnya untuk meningkatkan faktor
beban.Pembantu fungsi remove dapat dilihat dibawah ini.
Untuk alasan yang sama bahwa menambahkan nilai dapat dilakukan dalam waktu O(1),
menghapus nilai juga dapat dilakukan dengan kompleksitas yang diamortisasi dari O(1).
Metode buang hampir sama dengan metode hapus yang disajikan dibawah ini , kecuali tidak
ada pengecualian yang dimunculkan jika item tersebut tidak ada di dalam set saat item
tersebut dibuang.
Dalam menemukan item yang menghasilkan 0 (1) yang kompleksitas dan diamortisasi.
Rantai yang dijaga akan selama sebagian besar nilai hash didistribusikan secara merata dan
juga faktor beban yang dijaga agar tidak mendekati 1.
Untuk mengulangi suatu item pada set, kita perlu mendefinisikan metode untuk
menghasilkan suatu elemen hashset. Metode ini melintasi daftar suatu item yang melewati
elemen placeholder dan referensi none. Berikut ini adalah kode untuk iterator
Pada hashset terdapat banyak operasi himpunan yang dibiarkan sebagai latihan untuk
pembaca. Namun, kebanyakan dari mereka dapat mengimplemtasikannya dengan metode
yang telah disajikan pada bab ini. Mempertimbangkan metode perbedaan pembaruan itu
dapat diimplementasikan menggunakan iterator, tes keanggotaan, dan metode buang. Kode
di sect .5.5.1.4. menyediakan implementasi untuk metode perbedaan pembaruan tersebut.
Metode perbedaan pembaruan yang disajikan dalam sect .5.5.1.4. adalah metode mutator,
karena mengubah urutan yang direferensikan oleh diri sendiri dibandingkan dengan metode
perbedaan pembaruan di sect .5.5.1.4. yang tidak mengubah objek yang dirujuk oleh diri
sendiri. Sebagai gantinya, metode perbedaan pembaruan ini mengembalikan set baru yang
terdiri dari selisih antara diri sendiri dan lainnya.
E. MEMECAHKAN SUDOKU
Ada beberapa teka-teki yang tidak akan bisa dipecahkan oleh pemecah sudoku ini karena dua
aturan yang disajikan diatas tidak cukup kuat untuk semua teka-teki. Ada beberapa situasi
dimana jumlah item dalam satu set tidak dapat dikurangi dengan melihat hanya satu
kelompok.
Aturan yang disajikan dalam bab ini akan memecahkan teka-teki sudoku yang diberikan pada
bagian ini dan bagian lainnya. Teka-teki sudoku dapat diselesaikan oleh pemecah sudoku
jika fungsi diatas akan memanggil daftar masing-masing grup, jika benar maka akan
dipanggil kembali dan jika salah atau palsu maka sebaliknya.
Peta dalam ilmu komputer, berbeda dengan peta yang sering digunakan untuk menunjukan
arah. Peta merupakan istilah matematis yang mengacu pada fungsi yang memetakan domain
ke rentang. Peta memiliki banyak nama, termasuk kamus, tabel hash, dan peta hash.
Ketiganya merupakan struktur data yang sama.
Peta atau kamus memetakan sekumpulan kunci unik ke nilai terkaitnya, sama seperti fungsi
memetakan nilai dalam domain ke rentang. Saat kita ingin mencari pasangan kunci/nilai,
kuncinya adalah apa yang kita berikan ke peta. Kunci peta itu unik. Hanya ada satu salinan
dari nilai kunci yang diberikan dalam kamus pada satu waktu. Seperti yang kita lihat di Bab
1, Python memiliki dukungan bawaan untuk kamus atau peta. Berikut adalah beberapa
contoh interaksi dengan kamus di shell Python.
Peta atau kamus sangat mirip dengan koleksi. Set dan kamus memiliki nilai yang unik. Tipe
data yang ditentukan berisi kumpulan nilai yang unik. Peta berisi kumpulan kunci unik yang
memetakan ke nilai terkait. Seperti set, kita dapat mencari kunci dan nilai terkaitnya di peta
dalam waktu O(1). Seperti yang kita tau, peta dan set diimplementasikan menggunakan hash.
Meskipun implementasi dasarnya sama, peta dan set digunakan secara berbeda.
1) KELAS HASHMAP
HashMap, seperti kelas dict pada Python, menggunakan hashing untuk mencapai
kompleksitas yang dijelaskan dalam tabel di Gambar 5.6. Instansi __KVPair menyimpan
pasangan kunci/nilai saat ditambahkan ke objek HashMap. Kelas HashMap dapat
diimplementasikan menggunakan kelas HashSet dengan menambahkan metode __getitem__
ke kelas HashSet. Metode __getitem__ lainnya dari HashSet diberikan di Sect. 5.7.3
3) KELAS HASHMAP
G. MEMOISASI
Memoisasi adalah teknik pemrograman yang menarik yang dapat digunakan saat menulis fungsi
yang dapat dipanggil beberapa kali dengan argumen yang sama. Gagasan di balik memoisasi
adalah melakukan pekerjaan menghitung nilai sekali dalam suatu fungsi. Kemudian, yang perlu
diingat ketika fungsi dipanggil kembali dengan argumen yang sama, kita akan kembali
mengembalikan nilai yang baru saja kita hitung. Ini menghindari lebih banyak pekerjaan untuk
menghitung nilai.
Contoh yang kuat adalah fungsi Fibonacci rekursif. Deret Fibonacci didefinisikan sebagai
berikut.
Fib(0) = 0
Fib(1) = 1
Fib(n) = Fib(n−1) + Fib(n−2)
Namun, kita tidak perlu menggunakan fungsi ini selain untuk demonstrasi sederhana dari angka
Fibonacci kecil. Fungsi tersebut bahkan tidak dapat digunakan untuk menghitung sesuatu sebesar
fib(100). Bahkan menjalankan fungsi dengan 100 argumen di komputer tercepat membutuhkan
waktu lama. Pertimbangkan apa yang terjadi pada perhitungan fib(5). Untuk melakukan ini,
fib(4) dan fib(3) harus dihitung terlebih dahulu. Kedua hasil tersebut kemudian dapat
ditambahkan untuk menemukan fib(5). Namun, untuk menghitung fib(4), nilai fib(3) dan fib(2)
harus dihitung. Sekarang kita menghitung fib(3) dua kali untuk menghitung fib(5), tetapi untuk
menghitung fib(3) kita harus menghitung fib(2) dan fib(1). Namun, fib(2) harus dihitung untuk
menemukan fib(4). Gambar 5.7 menunjukkan semua panggilan ke fib untuk menghitung fib(5).
Semua tidak hilang. Ada cara yang lebih baik untuk menghitung deret Fibonacci. Cara untuk
menjadi lebih efisien adalah dengan menghindari semua pekerjaan yang tidak perlu. Setelah
menghitung fib (2), kita tidak dapat menghitungnya lagi. Setidaknya ada beberapa cara untuk
meningkatkan efisiensi. Salah satu pendekatan melibatkan menghilangkan rekursi dan komputasi
fib(n) menggunakan loop, yang mungkin merupakan pilihan terbaik. Namun, fungsi rekursif
lebih dekat dengan definisi aslinya. Kami dapat meningkatkan fungsi rekursif melalui
memoisasi. Dalam 5.8.1, kamus memo bertindak sebagai peta kita dari nilai n ke hasil fib(n).
Fungsi memoisasi fib dalam denominasi. 5.8.1 Mendokumentasikan nilai apa pun yang
dikembalikan oleh fungsi dalam memonya. Variabel memo diakses dari ruang lingkup tambahan.
Memo tidak dibuat secara lokal karena memo itu bertahan dari satu panggilan fib ke panggilan
berikutnya. Setiap kali fib dipanggil dengan nilai n baru, jawabannya dicatat dalam memo. Kali
berikutnya fib(n) dipanggil, hasil memoisasi dicari dan dikembalikan. Hasil: fungsi fib yang
diingat sekarang memiliki kompleksitas O(n) dan menghitung fib(100) hampir seketika. Tanpa
memori, dibutuhkan 1.146.295.688.027.634.168.201 panggilan ke fungsi fib untuk menghitung
fib(100). Dengan asumsi setiap panggilan fungsi selesai dalam 10 mikrodetik, komputasi
fib(100) membutuhkan waktu sekitar 363 juta tahun. Menggunakan memoisasi membutuhkan
100 panggilan ke fib dan mengasumsikan bahwa setiap panggilan membutuhkan waktu 10
mikrodetik, yaitu 1000 mikrodetik atau 1/1000 detik.
Ini adalah contoh ekstrim dari manfaat memoisasi, tetapi dapat berguna dalam banyak situasi.
Misalnya, dalam masalah tic-tac-toe di Bab 1. Panggil 4 fungsi minmax di banyak papan yang
sama. Fungsi minimax tidak mempermasalahkan X diletakkan di pojok kanan atas dulu, baru
kemudian pojok kiri bawah, atau sebaliknya. Namun, cara minimax ditulis akan dipanggil untuk
menghitung nilai papan yang sama beberapa kali. Memory Mini-Max mempercepat permainan
tic-tac-toe.
Penggunaan lain dari peta atau kamus adalah untuk menghubungkan data dari sumber yang
berbeda. Misalkan Anda mendapatkan daftar kota dan kode pos atau kode di kota-kota tersebut.
Anda dapat mencari daftar kota untuk menemukan daftar kode pos yang sesuai. Atau, Anda
dapat membuat kamus dari nama kota ke daftar kode pos. Kemudian, ketika diberi nama kota,
Anda memeriksa apakah itu ada dalam kamus, dan jika ya, Anda dapat mencari daftar kode pos
yang sesuai dalam waktu O(1).
I. KESIMPULAN
Setiap strategi resolusi konflik harus memiliki cara penanganan nilai-nilai baru yang
ditambahkan ke urutan dan nilai-nilai yang ada dihapus dari urutan.Karakteristik utama hashing
adalah kompleksitas rata-rata O(1) dari pengujian keanggotaan dan pencarian tabel. Kemampuan
untuk memeriksa nilai keanggotaan atau pencarian dalam waktu O(1) membuat banyak
algoritma efisien yang mungkin tidak bekerja secara efisien pada kumpulan data besar.Memori
adalah salah satu kegunaan paling penting dari kamus atau peta. Ketika kita memiliki informasi
dari dua sumber yang berbeda dan perlu mencocokkan kedua sumber tersebut, peta atau kamus
membuat korelasi tersebut bekerja.
PEMBAHASAN
BAB IV
A. KESIMPULAN
B. DAFTAR PUSTAKA
Data Structures and Algorithms Using Python: Necaise, Rance D.: 9780470618295: Amazon.com:
Books. (n.d.). Retrieved March 21, 2022, from https://www.amazon.com/Data-Structures-
Algorithms-Using-Python/dp/0470618299
Data Structures and Algorithms with Python (Undergraduate Topics in Computer Science): Lee, Kent
D., Hubbard, Steve: 9783319130712: Amazon.com: Books. (n.d.). Retrieved March 21, 2022,
from https://www.amazon.com/Structures-Algorithms-Undergraduate-Computer-Science/dp/
3319130714