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

我想從數組b中刪除同樣存在於數組a中的所有元素。尋找最快的解決方案。如何從數組B中刪除數組A中的所有元素?

+2

你要到位,以刪除或創建一個新的只有缺少的元素表? –

+0

更快的方法。每個表中可能有〜100-1000個元素。 – user606521

+0

創建一個新表可能* *更快。 –

回答

0

你可以在這裏使用堆棧。當只比較兩個不同的索引時,會壓入堆棧。疊加。

+0

不能這樣做,因爲這兩個數組項可能不會被排序,並且「a」的長度也可能比長度「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

太好了。我忘了提及每個數組實際上都是一個SET(不會有重複) - 您認爲可以用這個假設加速代碼嗎? – user606521

+1

不是我能想到的。首先將這些集合存儲爲散列將有所幫助,因爲這意味着您可以避免反演步驟(這需要花費表迭代,表創建和表分配)。 –

4

這段代碼複製重複鍵到數組c

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}