Modul:Exponential search
| Modul Lua ini digunakan pada sekitar 57.000 halaman dan perubahannya kemungkinan memicu perubahan massal pada semua halaman yang menggunakannya. Uji cobalah di subhalaman /bak pasir atau /kasus uji Modul:Exponential search, atau bak pasir modul Anda. Pertimbangkan untuk mendiskusikan perubahan di halaman pembicaraan sebelum mengimplementasikannya. |
Modul ini menyediakan algoritma pencarian eksponensial umum. Pencarian semacam ini dapat berguna ketika Anda ingin menemukan kunci dalam suatu array terurut, dan Anda ingin melakukannya dengan memeriksa elemen array sesedikit mungkin. Ini dapat mencakup situasi seperti:
- Menemukan nomor arsip tertinggi dalam sekumpulan arsip tanpa memeriksa apakah semuanya ada.
- Menemukan jumlah argumen posisional dalam frame.args tanpa harus memperluas teks wiki untuk masing-masing argumen.
-- This module provides a generic exponential search algorithm.
local checkType = require('libraryUtil').checkType
local floor = math.floor
local function midPoint(lower, upper)
return floor(lower + (upper - lower) / 2)
end
local function search(testFunc, i, lower, upper)
if testFunc(i) then
if i + 1 == upper then
return i
end
lower = i
if upper then
i = midPoint(lower, upper)
else
i = i * 2
end
return search(testFunc, i, lower, upper)
else
upper = i
i = midPoint(lower, upper)
return search(testFunc, i, lower, upper)
end
end
return function (testFunc, init)
checkType('Exponential search', 1, testFunc, 'function')
checkType('Exponential search', 2, init, 'number', true)
if init and (init < 1 or init ~= floor(init) or init == math.huge) then
error(string.format(
"nilai init tidak valid: '%s' terdeteksi dalam argumen #2 hingga " ..
"'Exponential search' (nilai init harus bilangan bulat/integer positif)",
tostring(init)
), 2)
end
init = init or 2
if not testFunc(1) then
return nil
end
return search(testFunc, init, 1, nil)
end
Konten ini disalin dari wikipedia, mohon digunakan dengan bijak.


