Платформа ЦРНП "Мирокод" для разработки проектов
https://git.mirocod.ru
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
63 lines
1.1 KiB
63 lines
1.1 KiB
// +build !arm64 gccgo appengine |
|
|
|
package roaring |
|
|
|
func union2by2(set1 []uint16, set2 []uint16, buffer []uint16) int { |
|
pos := 0 |
|
k1 := 0 |
|
k2 := 0 |
|
if 0 == len(set2) { |
|
buffer = buffer[:len(set1)] |
|
copy(buffer, set1[:]) |
|
return len(set1) |
|
} |
|
if 0 == len(set1) { |
|
buffer = buffer[:len(set2)] |
|
copy(buffer, set2[:]) |
|
return len(set2) |
|
} |
|
s1 := set1[k1] |
|
s2 := set2[k2] |
|
buffer = buffer[:cap(buffer)] |
|
for { |
|
if s1 < s2 { |
|
buffer[pos] = s1 |
|
pos++ |
|
k1++ |
|
if k1 >= len(set1) { |
|
copy(buffer[pos:], set2[k2:]) |
|
pos += len(set2) - k2 |
|
break |
|
} |
|
s1 = set1[k1] |
|
} else if s1 == s2 { |
|
buffer[pos] = s1 |
|
pos++ |
|
k1++ |
|
k2++ |
|
if k1 >= len(set1) { |
|
copy(buffer[pos:], set2[k2:]) |
|
pos += len(set2) - k2 |
|
break |
|
} |
|
if k2 >= len(set2) { |
|
copy(buffer[pos:], set1[k1:]) |
|
pos += len(set1) - k1 |
|
break |
|
} |
|
s1 = set1[k1] |
|
s2 = set2[k2] |
|
} else { // if (set1[k1]>set2[k2]) |
|
buffer[pos] = s2 |
|
pos++ |
|
k2++ |
|
if k2 >= len(set2) { |
|
copy(buffer[pos:], set1[k1:]) |
|
pos += len(set1) - k1 |
|
break |
|
} |
|
s2 = set2[k2] |
|
} |
|
} |
|
return pos |
|
}
|
|
|