Nama : Daniel Meyer Sagala(2607016053) Statistika/B

#LATIHAN 11A

lat_x <- c(12, 7, 19, 7, 25)

print(seq_boolean(lat_x, 7))
## $ketemu
## [1] TRUE
## 
## $posisi
## [1] 2

#PENJELASANNYA ; Target 7 ditemukan pada posisi ke-2. Status ketemu berubah menjadi TRUE ketika elemen kedua diperiksa. Pencarian langsung berhenti.

#LATIHAN 11B

print(seq_tanpa_boolean(lat_x, 8))
## [1] NA
print(seq_tanpa_boolean(numeric(), 8))
## [1] NA

#PENJELASANNYA ; Target 8 tidak ditemukan sehingga menghasilkan NA. Pada larik kosong, perulangan tidak dijalankan karena tidak terdapat elemen yang diperiksa.

#LATIHAN 11C

data_urut <- c(5, 10, 15, 20, 25)

print(seq_terurut(data_urut, 12))
## [1] NA

#PENJELASANNYA ; Pencarian berhenti ketika menemukan nilai 15 karena 15 lebih besar daripada target 12. Target tidak ditemukan.

#LATHAN 11D

lat_awal <- lat_x

print(seq_sentinel(lat_x, 99))
## [1] NA
print(identical(lat_x, lat_awal))
## [1] TRUE

#PENJELASANNYA ; Sentinel berada pada posisi ke-6 karena data asli memiliki 5 elemen. Hasil pencarian adalah NA karena target hanya ditemukan pada posisi sentinel. Data awal tidak berubah, dibuktikan dengan hasil TRUE.

#LATIHAN 11E

print(match(7, lat_x))
## [1] 2
print(which(lat_x == 7))
## [1] 2 4

#PENJELASANNYA ; Fungsi match() menghasilkan posisi pertama yaitu 2, sedangkan which() menghasilkan seluruh posisi target 7 yaitu 2 dan 4.

#LATIHAN 11F

print(tryCatch(
  seq_boolean(c(12, NA, 19), 19),
  error = function(e) conditionMessage(e)
))
## [1] "x harus larik numerik satu dimensi tanpa NA atau Inf"

#PENJELASANNYA ; Program menghasilkan error karena data mengandung NA. Berdasarkan modul, algoritma pencarian tidak menerima nilai NA atau Inf sehingga data harus divalidasi terlebih dahulu.

#LATIHAN 12A

lat_urut <- seq(10, 100, by = 10)

print(jejak_binary(lat_urut, 80))
##   langkah kiri kanan tengah nilai  keputusan
## 1       1    1    10      5    50 Cari kanan
## 2       2    6    10      8    80  Ditemukan

#PENJELASANNYA ; Target 80 ditemukan pada posisi ke-8 setelah 2 kali pemeriksaan. Pada langkah pertama pencarian bergerak ke kanan karena 50 lebih kecil daripada 80.

#LATIHAN 12B

print(bin_boolean(lat_urut, 10))
## [1] 1
print(bin_tanpa_boolean(lat_urut, 10))
## [1] 1
print(bin_boolean(lat_urut, 100))
## [1] 10
print(bin_tanpa_boolean(lat_urut, 100))
## [1] 10
print(bin_boolean(lat_urut, 105))
## [1] NA
print(bin_tanpa_boolean(lat_urut, 105))
## [1] NA

#PENJELASANNYA ; Target 10 ditemukan pada posisi pertama , Target 100 ditemukan pada posisi terakhir , Target 105 tidak ditemukan sehingga menghasilkan NA.Kedua varian binary memberikan hasil yang sama karena menggunakan aturan pembagian interval yang sama.

#LATIHAN 12C

data_ganda <- c(10, 20, 20, 20, 30)

print(bin_boolean(data_ganda, 20))
## [1] 3
print(bin_pertama(data_ganda, 20))
## [1] 2

#PENJELASANNYA ; Binary dasar menghasilkan posisi 3 karena langsung menemukan nilai 20 di tengah. Sedangkan binary posisi pertama menghasilkan posisi 2 karena pencarian dilanjutkan ke bagian kiri untuk menemukan kemunculan pertama target.

#LATIHAN 12D

produk <- data.frame(
  kode = c(104, 101, 107, 103, 106, 102, 105),
  nama = c("Telur", "Beras", "Kopi", "Minyak",
           "Garam", "Gula", "Tepung"),
  stok = c(25, 40, 18, 30, 50, 35, 28)
)

urutan <- order(produk$kode)

produk_urut <- produk[urutan, , drop = FALSE]

p <- bin_tanpa_boolean(produk_urut$kode, 103)

print(c(
  posisi_terurut = p,
  baris_asli = urutan[p]
))
## posisi_terurut     baris_asli 
##              3              4
print(produk_urut[p, , drop = FALSE])
##   kode   nama stok
## 4  103 Minyak   30

#PENJELASANNYA ; Kode produk: 103 , Posisi tabel terurut: 3 , Baris asli: 4 , Nama produk: Minyak , Stok: 30

#LATIHAN 12E

print(tryCatch(
  bin_boolean(c(30, 10, 20), 20),
  error = function(e) conditionMessage(e)
))
## [1] "Data harus terurut menaik"

#PENJELASANNYA ; Program menghasilkan error karena data belum terurut secara menaik. Binary search hanya dapat digunakan pada data yang sudah terurut. Walaupun target 20 tersedia, fungsi tetap menolak data tersebut karena tidak memenuhi syarat pencarian.

#LATIHAN 12F

print(c(
  sequential = kunjungan_sequential(seq_len(1024), 1024),
  binary = nrow(jejak_binary(seq_len(1024), 1024))
))
## sequential     binary 
##       1024         11

#PENJELASANNYA ; Sequential membutuhkan 1024 kali kunjungan, sedangkan binary hanya membutuhkan 11 kali kunjungan. Binary lebih sedikit melakukan pemeriksaan karena membagi data menjadi dua bagian pada setiap langkah.Namun, jumlah kunjungan tersebut hanya menghitung inti pencarian. Biaya validasi data dan persiapan pengurutan tetap harus diperhitungkan.