Skip to content

Commit 549e8bf

Browse files
committed
performance bust for intersection implementation
1 parent f72bc6b commit 549e8bf

File tree

2 files changed

+24
-2
lines changed

2 files changed

+24
-2
lines changed

slices/slices.go

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -260,9 +260,19 @@ func Clip[S ~[]E, E any](s S) S {
260260
// Intersection finds elements that are present in both slices, returning new slice without duplicates
261261
func Intersection[E comparable](s1, s2 []E) []E {
262262
var result []E
263-
for i := 0; i < len(s1); i++ {
263+
s2len := len(s2)
264+
s1len := len(s1)
265+
if s1len == 0 || s2len == 0 {
266+
return result
267+
}
268+
s2Map := make(map[E]bool, s2len)
269+
for i := 0; i < s2len; i++ {
270+
el := s2[i]
271+
s2Map[el] = true
272+
}
273+
for i := 0; i < s1len; i++ {
264274
element := s1[i]
265-
if Contains(s2, element) && !Contains(result, element) {
275+
if _, ok := s2Map[element]; ok {
266276
result = append(result, element)
267277
}
268278
}

slices/slices_test.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -798,6 +798,18 @@ func TestIntersection(t *testing.T) {
798798
v: []int{3, 4, 5},
799799
want: []int{3},
800800
},
801+
{
802+
name: "nil value",
803+
s: nil,
804+
v: nil,
805+
want: nil,
806+
},
807+
{
808+
name: "different size",
809+
s: []int{1, 5},
810+
v: []int{5, 10, 25},
811+
want: []int{5},
812+
},
801813
}
802814
strTypeCases := []struct {
803815
name string

0 commit comments

Comments
 (0)