# =====================================================================
# PEMBAHASAN PERTEMUAN 11: PENCARIAN LINEAR & VALIDASI
# =====================================================================

# Latihan 11A:
# "Latihan 11A menghasilkan posisi 2. Status ketemu berubah menjadi TRUE setelah 
# elemen kedua diperiksa, sehingga elemen keempat yang juga bernilai 7 tidak dikunjungi.[span_0](start_span)"[span_0](end_span)
latihan_11a <- function() {
  data_larik <- c(5, 7, 9, 7, 12)
  target <- 7
  ketemu <- FALSE
  posisi <- NA
  
  for (i in seq_along(data_larik)) {
    if (data_larik[i] == target) {
      ketemu <- TRUE
      posisi <- i
      break # Berhenti setelah elemen kedua ditemukan
    }
  }
  return(posisi) # Menghasilkan posisi 2[span_1](start_span)[span_1](end_span)
}

# Latihan 11B:
# "Latihan 11B menghasilkan NA untuk target 8 dan juga NA pada larik kosong; 
# pada kasus kosong, for tidak memiliki indeks untuk dijalankan.[span_2](start_span)"[span_2](end_span)
latihan_11b_kosong <- function() {
  larik_kosong <- c()
  target <- 8
  posisi <- NA
  for (i in seq_along(larik_kosong)) {
    # Tidak ada eksekusi karena larik kosong
  }
  return(posisi) # Menghasilkan NA[span_3](start_span)[span_3](end_span)
}

# Latihan 11C:
# "Pada Latihan 11C, penelusuran berhenti saat membaca 15 karena 15 melebihi 12 
# dan sisa data tidak lebih kecil.[span_4](start_span)"[span_4](end_span)

# Latihan 11D:
# "Pada Latihan 11D, sentinel berada di posisi 6, sehingga keluaran tetap NA; 
# identical membuktikan data awal tidak berubah.[span_5](start_span)"[span_5](end_span)

# Latihan 11E:
# "Latihan 11E menghasilkan 2 dari match dan c(2, 4) dari which.[span_6](start_span)"[span_6](end_span)
data_11e <- c(1, 7, 3, 7, 5)
hasil_match <- match(7, data_11e)          # Menghasilkan 2[span_7](start_span)[span_7](end_span)
hasil_which <- which(data_11e == 7)        # Menghasilkan c(2, 4)[span_8](start_span)[span_8](end_span)

# Latihan 11F:
# "Latihan 11F ditolak karena NA melanggar kontrak masukan tanpa nilai hilang.[span_9](start_span)"[span_9](end_span)
latihan_11f_validasi <- function(data_input) {
  if (any(is.na(data_input))) {
    stop("Latihan 11F ditolak karena NA melanggar kontrak masukan tanpa nilai hilang.")[span_10](start_span)[span_10](end_span)
  }
}


# =====================================================================
# PEMBAHASAN PERTEMUAN 12: PENCARIAN BINER & KOMPLEKSITAS
# =====================================================================

# Latihan 12A:
# "Latihan 12A memeriksa posisi tengah 5 dengan nilai 50, kemudian posisi 8 
# dengan nilai 80. Pencarian selesai dalam dua kunjungan.[span_11](start_span)"[span_11](end_span)

# Latihan 12B:
# "Pada Latihan 12B, target 10 menghasilkan posisi 1, target 100 menghasilkan posisi 10, 
# dan target 105 menghasilkan NA pada kedua varian binary.[span_12](start_span)"[span_12](end_span)

# Latihan 12C:
# "Latihan 12C menghasilkan posisi 3 pada binary dasar dan posisi 2 pada bin_pertama.[span_13](start_span)"[span_13](end_span)

# Latihan 12D:
# "Pada Latihan 12D, kode 103 adalah Minyak dengan stok 30, berada pada posisi 3 
# tabel terurut dan baris 4 tabel asli.[span_14](start_span)"[span_14](end_span)

# Latihan 12E:
# "Latihan 12E ditolak karena susunan data tidak memenuhi syarat menaik; 
# keberadaan target tidak menghapus prasyarat algoritma.[span_15](start_span)"[span_15](end_span)
latihan_12e_cek_syarat <- function(data_terurut) {
  if (!all(diff(data_terurut) > 0)) {
    stop("Latihan 12E ditolak karena susunan data tidak memenuhi syarat menaik.")[span_16](start_span)[span_16](end_span)
  }
}

# Latihan 12F:
# "Latihan 12F membutuhkan 1024 kunjungan sequential dan 11 kunjungan binary. 
# Biaya tersebut hanya untuk inti pencarian. Pemeriksaan seluruh data pada fungsi 
# validasi menambah biaya linear pada kedua pemanggilan dalam implementasi praktikum.[span_17](start_span)"[span_17](end_span)
n_data <- 1024
kunjungan_sequential <- n_data              # 1024 kunjungan[span_18](start_span)[span_18](end_span)
kunjungan_binary <- ceiling(log2(n_data) + 1) # 11 kunjungan[span_19](start_span)[span_19](end_span)