Skip to content

Commit 8e538ba

Browse files
authored
Merge pull request #512 from DhruvilK7/master
Optimised intersects2by2
2 parents 3fe77fa + e5f346b commit 8e538ba

File tree

1 file changed

+45
-1
lines changed

1 file changed

+45
-1
lines changed

setutil.go

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,10 +202,22 @@ func intersects2by2(
202202
set1 []uint16,
203203
set2 []uint16,
204204
) bool {
205-
// could be optimized if one set is much larger than the other one
206205
if (len(set1) == 0) || (len(set2) == 0) {
207206
return false
208207
}
208+
if len(set1)*64 < len(set2) {
209+
return onesidedgallopingintersect2by2Bool(set1, set2)
210+
} else if len(set2)*64 < len(set1) {
211+
return onesidedgallopingintersect2by2Bool(set2, set1)
212+
} else {
213+
return intersects2by2Bool(set1, set2)
214+
}
215+
}
216+
217+
func intersects2by2Bool(
218+
set1 []uint16,
219+
set2 []uint16,
220+
) bool {
209221
index1 := 0
210222
index2 := 0
211223
value1 := set1[index1]
@@ -244,6 +256,38 @@ mainwhile:
244256
return false
245257
}
246258

259+
func onesidedgallopingintersect2by2Bool(
260+
smallset []uint16,
261+
largeset []uint16,
262+
) bool {
263+
k1 := 0
264+
k2 := 0
265+
s1 := largeset[k1]
266+
s2 := smallset[k2]
267+
mainwhile:
268+
for {
269+
if s1 < s2 {
270+
k1 = advanceUntil(largeset, k1, len(largeset), s2)
271+
if k1 == len(largeset) {
272+
break mainwhile
273+
}
274+
s1 = largeset[k1]
275+
}
276+
if s2 < s1 {
277+
k2++
278+
if k2 == len(smallset) {
279+
break mainwhile
280+
}
281+
s2 = smallset[k2]
282+
} else {
283+
// (set2[k2] == set1[k1])
284+
return true
285+
}
286+
287+
}
288+
return false
289+
}
290+
247291
func localintersect2by2(
248292
set1 []uint16,
249293
set2 []uint16,

0 commit comments

Comments
 (0)