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
A. BUKU 1 ………………………………………………………………………...…. 7
B. BUKU 2 ……………………………………………………………………….…. 32
A. Kesimpulan ………………………………………………………………………. 55
B. Daftar Pustaka ………………………………………………………………….…
56
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 :
Menambah pengetahuan dan wawasan mengenai SET dan MAPS pada Struktur Data
Dapat mengaplikasikannya secara langsung.
D. IDENTITAS BUKU
BUKU 1
ISBN : 978-0-470-61829-5
Penerbit : Springer
ISBN : 978-3-319-13071-2
ISI BUKU
A. BUKU 1
1. Set
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.
Hapus (elemen): Jika nilainya ada di himpunan, hapus nilai yang ditentukan dari
himpunan. Jika tidak, itu melempar pengecualian.
Equals (setB): Menentukan apakah suatu himpunan sama dengan himpunan lain dan
mengembalikan nilai Boolean. Agar dua himpunan A dan B sama, A dan B harus
mengandung elemen yang sama, dan semua elemen A juga harus menjadi elemen B.
Jika kedua himpunan kosong, himpunannya sama. == atau! Akses dengan =.
isSubsetOf (setB): Menunjukkan apakah suatu himpunan adalah subset dari
himpunan lain dan mengembalikan nilai Boolean.
Contoh aplikasi
smith = Set()
smith.add( "CSCI-112" )
smith.add( "MATH-121" )
smith.add( "HIST-340" )
smith.add( "ECON-101" )
roberts = Set()
roberts.add( "POL-101" )
roberts.add( "ANTH-230" )
roberts.add( "CSCI-112" )
roberts.add( "ECON-101" )
If smith == robert:
sameCourses.isEmpty():
print ("Smith and Roberts" \ + "tidak mengambil mata kuliah yang sama.")
lainnya:
percetakan (kursus)
Dalam hal ini, kedua siswa mengambil CSCI 112 dan ECON 101. Jadi jika Anda
menjalankan segmen kode sebelumnya pada, Smith dan Roberts akan mengambil jumlah
kursus yang sama:
CSCI112 ECON101
Misalkan Smith ingin tahu kursus mana yang dia ambil dan yang tidak diambil Roberts. Ini
dapat dikonfirmasi oleh operasi changeset.
10 |Laporan CBR dan Analisis Studi Kasus_Kelompok 3
UniqueCourses = smith.difference (roberts) untukkursus
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
diagram ADT dan diimplementasikan dengan cara yang serupa. Contoh dua set Gambar 1
ditunjukkan pada Gambar 2.
Seperti yang disebutkan sebelumnya, struktur daftar tidak menambahkan nilai duplikat, jadi
Anda perlu memastikan bahwa tidak ada nilai duplikat yang ditambahkan ke kumpulan. Saat
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.
2. Peta
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
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
Sebagian besar bahasa pemrograman tingkat tinggi menyediakan cara yang nyaman untuk
membuat dan mengelola array multidimensi, sementara bahasa lain memerlukan pendekatan
yang lebih pragmatis. C++ dan Java adalah dua contoh bahasa yang menyediakan array
multidimensi sebagai bagian dari bahasa.
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.
Getitem (i1, i2, ... in): Mengembalikan nilai elemen posisi yang ditentukan oleh
ntuple (i1, i2, ... in) yang disimpan dalam array. Semua indeks yang ditentukan harus
ditentukan dan harus berada dalam rentang yang valid dari dimensi larik yang
sesuai. Akses melalui operator elemen: y = x [1, 2].
Setitem (i1, i2, ... in, value): Memodifikasi konten array dalam definisi item untuk
memasukkan nilai yang ditentukan. Elemen didefinisikan oleh ntuple (i1, i2, ... in).
Semua komponen subskrip harus ditentukan dan harus berada dalam cakupan dimensi
larik yang sesuai. Akses melalui operator elemen: x [1, 2] = y.
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.
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.
Untuk dimensi yang lebih besar, pendekatan serupa dapat digunakan. Dengan array tiga dimensi,
tabel individual dapat disimpan secara berurutan menggunakan urutan baris-utama atau kolom-
utama. Seiring bertambahnya jumlah dimensi, semua elemen dalam satu instance dari setiap
dimensi disimpan secara berurutan sebelum instance berikutnya. Misalnya, mengingat array
empat dimensi, yang dapat dianggap sebagai array kotak, semua elemen kotak individu (array 3-
D) disimpan sebelum kotak berikutnya.
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
n∗i. Karena subskrip dimulai dari nol, subskrip ke-i tidak hanya mewakili baris tertentu tetapi
juga menunjukkan jumlah baris lengkap yang dilewati untuk mencapai baris ke-i.
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
Persamaan serupa dapat diturunkan untuk array dimensi yang lebih tinggi. Diberikan array 3-D
dengan ukuran d 1 x d 2 x d 3, offset array 1-D dari elemen (i 1 , i 2, i 3) yang disimpan menggunakan
urutan baris-utama akan menjadi
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.
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:
di mana nilai f j adalah faktor yang mewakili jumlah elemen yang akan dilewati dalam dimensi
yang sesuai dan dihitung menggunakan
Saat menggunakan fungsi, kita dapat melewatkan sejumlah variabel argumen untuk
setiap pemanggilan. Misalnya, semua berikut ini adalah panggilan fungsi yang valid:
func( 12 )
func( 5, 8, 2 )
func( 18, -2, 50, 21, 6 )
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
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
Konstruktor
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
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
duplikat yang seharusnya diperlukan di kedua metode akses elemen. Metode operator _setitem_
dapat diimplementasikan dengan cara yang sama. Perbedaan utama adalah bahwa metode ini
memerlukan argumen kedua untuk menerima nilai yang menjadi dasar suatu elemen dan
memodifikasi elemen yang ditunjukkan dengan nilai baru alih-alih mengembalikan nilai.
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.
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 4 26 128,93
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
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.
Setiap spreadsheet berisi penjualan untuk toko tertentu dan dibagi menjadi baris dan kolom di
mana setiap baris berisi penjualan untuk satu item dan kolom berisi penjualan untuk setiap bulan.
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
ingin menentukan total penjualan untuk toko tertentu, yang mencakup angka penjualan semua
barang yang terjual di toko itu selama 12 bulan. Fungsi berikut menghitung nilai ini:
# 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
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().
Selanjutnya, misalkan kita ingin menghitung total penjualan untuk bulan tertentu yang mencakup
angka penjualan semua barang di semua toko yang terjual selama bulan tersebut. Nilai ini dapat
dihitung menggunakan fungsi berikut:
# Compute the total sales of all items in all stores for a given month.
m = month - 1
total = 0.0
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.
m = item - 1
total = 0.0
total += salesData[s, i, m]
return total
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
perhitungan 12 total yang berbeda, satu untuk setiap bulan. Kita dapat menyimpan total bulanan
dalam larik 1-D dan mengembalikan strukturnya, seperti yang dilakukan dalam fungsi berikut:
# Compute the total sales per month for a given store. A 1-D array is
s = store - 1
totals = Array( 12 )
sum = 0.0
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
untuk bulan April di toko nomor 1. Total bulanan akan disimpan pada posisi indeks 3 dalam larik
1-D karena itu adalah kolom yang sesuai dalam larik 3-D untuk bulan April.
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.1
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
himpunan) cocok dengan jumlah duplikat set yang ditemukan, maka item dari set
duplikat dapat dengan aman dihapus dari semua set non-duplikat dalam grup. Aturan ini
berlaku bahkan dalam kasus degeneratif di mana jumlah set duplikat adalah 1 dan ukuran
set itu adalah 1. Kasus degeneratif adalah apa yang digunakan di atas untuk menghapus
item tunggal dari set lain. Aturan ini dapat diterapkan pada Gambar 5.3 untuk menghapus
2 dari semua sel di baris ke-7 teka-teki kecuali kolom ke-7 di mana 2 muncul dengan
sendirinya.
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
membuang semua nilai lain yang muncul di sel yang dipilih. Menerapkan aturan ini ke yang
kelima baris pada Gambar. 5.3 menghasilkan kolom keempat yang direduksi menjadi berisi 1
karena 1 tidak muncul di sel lain di baris ke-5. Aturan ini juga berlaku pada baris teka-teki
yang terakhir di mana 2 hanya mungkin di kolom kedua setelah dihapus 1, 5 dan 6 dari sel itu
karena mereka muncul di dalam sel lain di baris itu.
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.
35 |Laporan CBR dan Analisis Studi Kasus_Kelompok 3
Operasi Compleksit Penggunaan Keterangan
as
Set Creation O(1) s=set([iterable]) Memanggil konstruktor set untuk
membuat set. Iterable adalah
konten awal opsional di mana
kita memiliki kompleksitas O(n).
Set Creation O(1) s=frozenset([iterable]) Memanggil konstruktor frozenset
untuk objek set yang tidak dapat
diubah untuk membuat objek
frozenset .
Cardinality O(1) len(s) Jumlah elemen dalam s
dikembalikan.
Membership O(1) e in s Mengembalikan True jika e
dalam s dan False sebaliknya.
non- O(1) e not in s Mengembalikan True jika e tidak
Membership dalam s dan False sebaliknya.
Disjoint O(n) s.isdisjoint(t) Mengembalikan True jika s dan t
tidak berbagi elemen, dan False
sebaliknya.
Subset O(n) s.issubset(t) Mengembalikan True jika s
adalah subset dari t, dan False
Superset O(n) s.issuperset(t) sebaliknya.
Mengembalikan True jika s
adalah superset dari t dan False
Union O(n) s.union(t) sebaliknya.
Mengembalikan set baru yang
berisi semua elemen dalam s dan
Intersection O(n) s.intersection(t) t.
Mengembalikan set baru yang
Set O(n) s.difference(t) hanya berisi elemen di s dan t.
Difference Mengembalikan set baru yang
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
dapat ditulis s| = t . Pembaruan persimpangan dapat ditulis sebagai s& = t . Akhirnya,
operator pembaruan perbedaan simetris ditulis s^ = t . Sementara ini operator nyaman,
mereka tidak terkenal dan kode yang ditulis dengan memanggil metode pada tabel di atas
akan lebih deskriptif.
C. Hashing
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(True)
>>> hash(False)
>>> hash([1,2,3])
>>>
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
2) PENYIMPANAN ITEM
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
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 .
Kode diatas digunakan untuk menambahkan item baru yang belum terdaftar pada list.
Perintah While pada source code tersebut menujukkan bagian Linear Probing . Menemukan
sebuah None Value akan menjadi akhir dari rantai linear , karena tujuan akhir dari pencarian
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
terjadinya tabrakan juga kecil.Sedangkan faktor beban tinggi berarti memiliki ruang yang
lebih efisien namun memiliki kemungkinan tabrakan yang tinggi juga.Eksperimen
membuktikan bahwa faktor beban maksimum yang wajar adalah sebesar 75%. Ketika faktor
beban lebih dari itu maka semua nilai dan item yang disimpan harus dipindahkan ke list
lain.Proses ini disebut proses pengulangan atau looping.
6) MENAMBAHKAN HASHSET
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.
9) MENGHAPUS HASHSET
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).
Untuk menemukan sebuah item dalam sebuah hashset maka diperlukan pencarian alamat dan
kemungkinan rantai nilainya.Jika item tersebut berada disuatu rantai nilai , maka metode
_contains_ akan mengeluarkan nilai FALSE atau TRUE
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.
Untuk menggunakan suatu aturan atau hashset tipe data, kita bisa memiliki alat untuk
memecahkan sebagian besar teka-teki yang terdapat pada sudoku. Teka-teki dapat dibaca dari
file dimana nilai yang diketahui diwakili oleh nilai dan digitnya tidak diketahui, seperti pada
teka-teki dibawa ini. Memecahkan teka-teki sudoku berarti mengurangi jumlah item dari
setiap set grup sesuai dengan aturan yang disajikan pada sect .5.2. Menulis fungsi yang
disebut kurangi grup yang diberikan daftar set untuk dapat membantu mengurangi.
Fungsinya harus kembali benar, jika itu bisa mengurangi grup palsu. Jika tidak, mengingat
fungsi kurangi grup adalah seperti yang didefinisikan dalam sect .5.6.1.
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.
F. MAPS
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.
Perbedaan yang menarik dari pernyataan diatas adalah bahwa pasangan kunci/nilai yang
disimpan dalam kamus, bukan hanya item dalam koleksi. Bagian kunci dari pasangan
kunci/nilai digunakan untuk menentukan apakah kunci ada dalam kamus, seperti yang kita
harapkan.
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
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
1. Pencarian data
#include <stdio.h>
/*******************************************
Fungsi Rekursif untuk f(n) = f(n-1) + 1
********************************************/
unsigned int deret1(int n)
{
if (n == 1)
return 1;
else
return (deret1(n-1) + 1);
}
int main()
{
int x;
for (x=1; x<=10; x++)
printf("%4d", deret1(x));
return 0;
}
PENUTUP
A. KESIMPULAN
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. Algoritme 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. Bilangan bulat, objek karyawan, karakter, string, secara
harfiah objek apa pun dalam Python bisa menjadi elemen dari beberapa set. Suatu himpunan
memiliki kardinalitas. Kardinalitas suatu himpunan adalah jumlah item di dalamnya.
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. Peta dalam ilmu komputer tidak seperti peta yang biasa Anda baca
saat pergi ke suatu tempat di mobil Anda. Istilah peta adalah istilah yang lebih matematis
yang mengacu pada fungsi yang memetakan domain ke rentang. Anda mungkin sudah
menggunakan peta dengan Python. Peta disebut dengan banyak nama termasuk kamus, tabel
hash, dan peta hash. Mereka semua adalah struktur data yang sama.
Peta atau kamus memetakan satu set kunci unik ke nilai terkaitnya seperti halnya
fungsi memetakan nilai dalam domain ke rentang. Kunci adalah apa yang kami berikan ke
peta ketika kami ingin mencari pasangan kunci/nilai. Kunci dari sebuah peta adalah unik.
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