Ответ 1
Самый простой (с точки зрения использования только массивов, уже существующих и методов массива), является union различия:
a = [1,2,3,4]
b = [1,2,4]
(a-b) | (b-a)
=> [3]
Это может быть или не быть лучше, чем O(n**2)
. Существуют и другие варианты, которые могут дать лучшую оценку (см. Другие ответы/комментарии).
Изменить: здесь выполняется быстрая реализация метода сортировки и итерации (это предполагает, что массив не имеет повторяющихся элементов, в противном случае его нужно будет изменить в зависимости от того, какое поведение требуется в этом случае). Если кто-нибудь может придумать более короткий способ сделать это, мне было бы интересно. Ограничивающим фактором является используемый вид. Я предполагаю, что Ruby использует какой-то Quicksort, поэтому средние сложности O(n log n)
с возможным наихудшим случаем O(n**2)
; если массивы уже отсортированы, то, конечно, два вызова sort
могут быть удалены и будут выполняться в O(n)
.
def diff a, b
a = a.sort
b = b.sort
result = []
bi = 0
ai = 0
while (ai < a.size && bi < b.size)
if a[ai] == b[bi]
ai += 1
bi += 1
elsif a[ai]<b[bi]
result << a[ai]
ai += 1
else
result << b[bi]
bi += 1
end
end
result += a[ai, a.size-ai] if ai<a.size
result += b[bi, b.size-bi] if bi<b.size
result
end