Bien que vous puissiez utiliser les files d'attente, avec insert() et remove() de la bibliothèque table, il n'en reste pas moins vrai que cette méthode reste trop lente pour les grandes structures.
Une autre structure bien plus efficace, consiste à utiliser 2 indices:
first pour le premier élément et last pour le dernier.
function ListNew()
return {first = 0, last = -1}
end
Pour éviter de polluer l'espace global, vous allez définir toutes les opérations de liste dans une table appelée List.
L'exemple précédent devient.
List = {}
function List.new()
return {first = 0, last = -1}
end
Maintenant, vous pouvez insérer ou retirer un élément aux deux extrémités en temps constant.
function List.pushleft(list, value)
local first = list.first - 1
list.first = first
list[first] = value
end
function List.pushright(list, value)
local last = list.last + 1
list.last = last
list[last] = value
end
function List.popleft(list)
local first = list.first
if first > list.last then error("liste vide") end
local value = list[first]
list[first] = nil -- à la corbeille
list.first = first + 1
return value
end
function List.popright(list)
local last = list.last
if list.first > last then error("liste vide") end
local value = list[last]
list[last] = nil -- à la corbeille
list.last = last - 1
return value
end
Si vous utilisez cette structure de la file d'attente, d'une manière stricte, en appelant seulement pushright et popleft, à la fois first et last seront sans cesse augmentés.
Comme LUA représente les rangées à l'aide de tables, vous pourrez les indexer soit à partir de 1 à 20 ou de 16.777.216 à 16.777.236.
Et comme LUA utilise la double précision, pour représenter les nombres, votre programme pourra s'exécuter pendant deux cents ans, faisant un million d'insertions par seconde, sans rencontrer le moindre problème de débordement. (overflows)