# ===== Nomor 1: Sequential search =====
seq_search1 <- function(L, x) {
n <- length(L); i <- 1
while (i <= n && L[i] != x) i <- i + 1 # && = short-circuit
if (i <= n) i else 0
}
seq_search2 <- function(L, x) { # versi sentinel
n <- length(L)
A <- c(L, x)
i <- 1
while (A[i] != x) i <- i + 1
if (i <= n) i else 0
}
A <- c(7, 3, 9, 3, 5)
seq_search1(A, 3); seq_search1(A, 8) # 2 0
## [1] 2
## [1] 0
seq_search2(A, 3); seq_search2(A, 8) # 2 0
## [1] 2
## [1] 0
# ===== Nomor 2: tanpa short-circuit =====
# while (i <= n & L[i] != x) # & = tanpa short-circuit; L[n+1] = NA, tetap aman
# ===== Nomor 3: Binary search =====
bin_search1 <- function(L, x) {
low <- 1; high <- length(L)
while (low <= high) {
mid <- (low + high) %/% 2
if (L[mid] == x) return(mid)
else if (L[mid] < x) low <- mid + 1
else high <- mid - 1
}
0
}
bin_search2 <- function(L, x) {
low <- 1; high <- length(L)
while (low < high) {
mid <- (low + high) %/% 2
if (L[mid] < x) low <- mid + 1 else high <- mid
}
if (L[low] == x) low else 0
}
B <- c(2, 5, 8, 12, 16, 23, 38, 56, 72, 91)
bin_search1(B, 23); bin_search1(B, 6) # 6 0
## [1] 6
## [1] 0
bin_search2(B, 23); bin_search2(B, 6) # 6 0
## [1] 6
## [1] 0
# ===== Nomor 4: Larik menurun =====
bin_search_desc <- function(L, x) {
low <- 1; high <- length(L)
while (low <= high) {
mid <- (low + high) %/% 2
if (L[mid] == x) return(mid)
else if (L[mid] > x) low <- mid + 1 # tanda dibalik
else high <- mid - 1
}
0
}
bin_search_desc(rev(B), 23) # 5
## [1] 5
# ===== Nomor 5: Data precip =====
kota <- sort(names(precip))
target <- "Seattle Tacoma"
low <- 1; high <- length(kota); banding_bin <- 0; hasil <- 0
while (low <= high) {
mid <- (low + high) %/% 2
banding_bin <- banding_bin + 1
if (kota[mid] == target) { hasil <- mid; break }
else if (kota[mid] < target) low <- mid + 1
else high <- mid - 1
}
banding_seq <- 0
for (i in seq_along(kota)) {
banding_seq <- banding_seq + 1
if (kota[i] == target) break
}
cat("Indeks:", hasil, "\n")
## Indeks: 64
cat("Binary search :", banding_bin, "perbandingan\n")
## Binary search : 5 perbandingan
cat("Sequential search:", banding_seq, "perbandingan\n")
## Sequential search: 64 perbandingan
# ===== Nomor 6: Rekursif =====
bin_search_rek <- function(L, x, low = 1, high = length(L)) {
if (low > high) return(0)
mid <- (low + high) %/% 2
if (L[mid] == x) return(mid)
else if (L[mid] < x) return(bin_search_rek(L, x, mid + 1, high))
else return(bin_search_rek(L, x, low, mid - 1))
}
bin_search_rek(B, 23) # 6
## [1] 6
bin_search_rek(B, 6) # 0
## [1] 0