# Studi kasus pencarian kode produk simulasi ----
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)
)
# Membuat data produk
produk <- data.frame(
  kode = c(101, 103, 105, 106, 108, 110),
  nama = c("Buku", "Pensil", "Pulpen", "Penghapus", "Tas", "Penggaris"),
  harga = c(15000, 2000, 3000, 1000, 75000, 5000)
)

# Fungsi Sequential Search
seq_tanpa_boolean <- function(data, target) {
  for (i in seq_along(data)) {
    if (data[i] == target) {
      return(i)
    }
  }
  return(NA)
}

# Fungsi Binary Search
bin_tanpa_boolean <- function(data, target) {
  kiri <- 1
  kanan <- length(data)

  while (kiri <= kanan) {
    tengah <- floor((kiri + kanan) / 2)

    if (data[tengah] == target) {
      return(tengah)
    } else if (data[tengah] < target) {
      kiri <- tengah + 1
    } else {
      kanan <- tengah - 1
    }
  }
  return(NA)
}

# Fungsi Binary Search dengan Boolean
bin_boolean <- function(data, target) {
  posisi <- bin_tanpa_boolean(data, target)
  return(!is.na(posisi))
}

# Menentukan kode yang dicari
target_kode <- 106

# Sequential Search
pos_asli <- seq_tanpa_boolean(produk$kode, target_kode)

if (!is.na(pos_asli)) {
  print(produk[pos_asli, , drop = FALSE])
}
##   kode      nama harga
## 4  106 Penghapus  1000
# Mengurutkan data
urutan <- order(produk$kode)
produk_urut <- produk[urutan, , drop = FALSE]

# Binary Search tanpa Boolean
pos_urut <- bin_tanpa_boolean(produk_urut$kode, target_kode)

if (!is.na(pos_urut)) {
  baris_asli <- urutan[pos_urut]
  print(c(posisi_terurut = pos_urut, baris_asli = baris_asli))
  print(produk_urut[pos_urut, , drop = FALSE])
}
## posisi_terurut     baris_asli 
##              4              4 
##   kode      nama harga
## 4  106 Penghapus  1000
# Binary Search dengan Boolean
target_tidak_ada <- bin_boolean(produk_urut$kode, 999)

if (!target_tidak_ada) {
  print("Kode 999 tidak ditemukan")
} else {
  print("Kode 999 ditemukan")
}
## [1] "Kode 999 tidak ditemukan"
# Fungsi bawaan R
print(match(target_kode, produk$kode))
## [1] 4
print(target_kode %in% produk$kode)
## [1] TRUE
print(which(produk$kode == target_kode))
## [1] 4