2015-09-03 3 views
1
local a = {1, 2, 3} 
local b = {1, 2, 3, 4, 5, 6} 
-- I need b - a = {4, 5, 6} 

Я хочу удалить все элементы из массива b, которые также присутствуют в массиве a. Ищете решение FASTEST.Как удалить все элементы в массиве A из массива B?

+2

Хотите удалить на месте или создать новый таблица с только отсутствующими элементами? –

+0

Более быстрый подход. В каждой таблице может быть ~ 100-1000 элементов. – user606521

+0

Создание новой таблицы, вероятно, будет * намного быстрее. –

ответ

0

вы можете использовать стек здесь. когда просто сравниваете два индекса, которые не являются одинаковыми нажатиями в стек. стек.

+0

Не может быть так, потому что оба элемента массивов могут не сортироваться, а длина «а» может быть также больше длины «b» – user606521

+0

, тогда вы можете использовать быструю сортировку .... –

+0

длина двух массивов Здесь неважно. –

4

Инвертировать меньшую таблицу в хэш и сравнивать с ней в цикле.

function invtab(t) 
    local tab = {} 
    for _, v in ipairs(t) do 
     tab[v]=true 
    end 
    return tab 
end 

local a = {1, 2, 3} 
local b = {1, 2, 3, 4, 5, 6} 

local ainv = invtab(a) 

-- To get a new table with just the missing elements. 
local ntab = {} 
for _, v in ipairs(b) do 
    if not ainv[v] then 
     ntab[#ntab + 1] = v 
    end 
end 

-- To remove the elements in place. 
for i = #b, 1, -1 do 
    local v = b[i] 
    if ainv[v] then 
     table.remove(b, i) 
    end 
end 
+0

Wow большой. Я забыл упомянуть, что каждый массив будет SET на самом деле (там не будет дубликатов) - как вы думаете, можно ускорить код с этим предположением? – user606521

+1

Не то, чтобы я мог думать. Хранение наборов как хэшей в первую очередь поможет, так как это означает, что вы можете избежать шага инверсии (который стоит за итерацией таблицы, созданием таблицы и распределением таблиц). –

4

Этот код копирует дубликаты ключей к массиву гр

local a = {1, 2, 3} 
local b = {1, 2, 3, 4,5 ,6} 
local c = {} 

for k,v in ipairs(b) do 
    local foundkey = false 
    for _k,_v in ipairs(a) do 
     if _v == v then 
      foundkey = true 
     end 
    end 
    if foundkey then 
     table.insert(c,v) 
    end 
end 

Или

local a = {1, 2, 3} 
local b = {1, 2, 3, 4, 5, 6} 

for k,v in ipairs(b) do 
    local key = 0 
    for _k,_v in ipairs(a) do 
     if _v == v then 
      key = _k 
     end 
    end 
    if key ~= 0 then 
     table.remove(a,key) 
    end 
end 

-- Outputs a = {7} 

или

local a = {1, 2, 3} 
local b = {1, 2, 3, 4, 5, 6} 
local c = {} 

for k,v in ipairs(b) do 
    local foundkey = 0 
    for _k,_v in ipairs(a) do 
     if _v == v then 
      foundkey = _k 
     end 
    end 
    if foundkey == 0 then 
     table.insert(c,v) 
    end 
end 
a = c 

-- Output a = {4, 5, 6} 
Смежные вопросы