Difference between revisions of "Module:Exponential search"
Jump to navigation
Jump to search
imported>Mr. Stradivarius (don't check testFunc(1) twice every time) |
imported>Mr. Stradivarius (move the init checkType a little later so that we don't execute it for empty arrays) |
||
Line 29: | Line 29: | ||
return function (testFunc, init) | return function (testFunc, init) | ||
checkType('Exponential search', 1, testFunc, 'function') | checkType('Exponential search', 1, testFunc, 'function') | ||
− | |||
if not testFunc(1) then | if not testFunc(1) then | ||
return nil | return nil | ||
end | end | ||
+ | checkType('Exponential search', 2, initNum, 'number', true) | ||
if init and (init < 1 or init ~= floor(init) or init == math.huge) then | if init and (init < 1 or init ~= floor(init) or init == math.huge) then | ||
error(string.format( | error(string.format( |
Revision as of 14:12, 26 February 2015
Documentation for this module may be created at Module:Exponential search/doc
-- 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') if not testFunc(1) then return nil end checkType('Exponential search', 2, initNum, 'number', true) if init and (init < 1 or init ~= floor(init) or init == math.huge) then error(string.format( "invalid init value '%s' detected in argument #2 to " .. "'Exponential search' (init values must be a positive integer)", tostring(init) ), 2) end init = init or 2 return search(testFunc, init, 1, nil) end