Вы можете сделать это (не проверено):
function difference(a, b)
local ai = {}
local r = {}
for k,v in pairs(a) do r[k] = v; ai[v]=true end
for k,v in pairs(b) do
if ai[v]~=nil then r[k] = nil end
end
return r
end
Если вы можете изменить a
, то он еще короче:
function remove(a, b)
local ai = {}
for k,v in pairs(a) do ai[v]=true end
for k,v in pairs(b) do
if ai[v]~=nil then a[k] = nil end
return r
end
Если ваши таблицы отсортированы вы также можете выполнить параллельную развертку двух таблиц, что-то вроде следующего псевдокода:
function diff(a, b)
Item = front of a
Diff = front of b
While Item and Diff
If Item < Diff then
Item is next of a
Else if Item == Diff then
remove Item from a
Item = next of a
Diff = next of b
Else # else Item > Diff
Diff = next of b
Это не использует никаких дополнительных таблиц. Даже если вам нужна новая таблица вместо разницы на месте, только одна новая таблица. Интересно, как это будет сравниваться с методом хэш-таблицы (remove
).
Обратите внимание, что неважно, сколько раз вы зацикливаете, если a
и b
малы, тогда не должно быть существенной разницы между этими и вашим alg. Вам понадобится как минимум 100 элементов в a
и b
, возможно даже 1000.
Попробуйте приведенный выше код в .htaccess
файле
RewriteEngine on
ErrorDocument 404 /404.php
RewriteRule ^(.+)\.php$ /$1 [R,L]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ /$1.php [NC,END]
RewriteCond %{REQUEST_METHOD} !POST
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*[^/])$ /$1/ [R=301,L]