Module:Exponential search/doc explained

This module provides a generic exponential search algorithm. This kind of search can be useful when you want to find a key in some kind of sorted array, and you want to do it by checking as few array elements as possible. This could include situations like:

You shouldn't use this module if any of the following apply:

  1. You can use the Lua length operator to find what you need.
  2. Your array has any gaps in it. (In other words, any of the items before the final item is nil, e.g. .) If you try and use this module on a sparse array, you might get an erroneous value.
  3. Your array has less then about 10 items in it. It's possible to use this module for those arrays, but you will access most of the array elements anyway (perhaps some of them twice), and your code will be more complicated than if you just used a for loop.

Usage

First, load the module.

local expSearch = require('Module:Exponential search')

You can then use the expSearch function with the following syntax:

expSearch(testFunc, init)

Parameters:

expSearch will return the highest value of i for which testFunc was truthy. If no values were truthy, the function will return nil.

Examples

Jimbo's talk archives

has archives at,, ... To find the highest archive number, you would use code like this:

local expSearch = require('Module:Exponential search')local highestArchive = expSearch(function (i) local archive = 'User talk:Jimbo Wales/Archive ' .. i return mw.title.new(archive).existsend)

Village pump archives

has old archives at,, etc. After they go through to Archive Z, the next archive is Archive AA. Although these archives aren't being updated anymore, as a demonstration we can find the highest one using this module; all we need is a function that converts from an integer to the corresponding archive name.

local expSearch = require('Module:Exponential search')

local function integerToAlpha(i) -- This function converts 1 to A, 2 to B, ... 26 to Z, 27 to AA, ... local ret = while i > 0 do local rem = i % 26 if rem

0 then rem = 26 end local char = string.char(rem + 64) -- the "rem"th letter of the alphabet ret = char .. ret i = (i - rem) / 26 end return retend

local function integerToArchive(i) return 'Wikipedia:Village pump (proposals)/Archive ' .. integerToAlpha(i)end

local highestInteger = expSearch(function (i) local archive = integerToArchive(i) return mw.title.new(archive).existsend)local highestArchive = integerToArchive(highestInteger)