File tree Expand file tree Collapse file tree 1 file changed +45
-1
lines changed
Expand file tree Collapse file tree 1 file changed +45
-1
lines changed Original file line number Diff line number Diff 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+
247291func localintersect2by2 (
248292 set1 []uint16 ,
249293 set2 []uint16 ,
You can’t perform that action at this time.
0 commit comments