Jump to content

Module:Exponential search: Difference between revisions

From Wikipedia, the free encyclopedia
Content deleted Content added
specify a lower bound of 0 initially so that we don't have to do it on every recursion
don't check testFunc(1) twice every time
Line 30: Line 30:
checkType('Exponential search', 1, testFunc, 'function')
checkType('Exponential search', 1, testFunc, 'function')
checkType('Exponential search', 2, initNum, 'number', true)
checkType('Exponential search', 2, initNum, 'number', true)
if not testFunc(1) then
return nil
end
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(
Line 37: Line 40:
), 2)
), 2)
end
end
init = init or 1
init = init or 2
return search(testFunc, init, 1, nil)
if not testFunc(1) then
return nil
end
return search(testFunc, init, 0, nil)
end
end

Revision as of 12:48, 26 February 2015

-- 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, initNum, 'number', true)
	if not testFunc(1) then
		return nil
	end
	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