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.

setutil.go 9.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610
  1. package roaring
  2. func equal(a, b []uint16) bool {
  3. if len(a) != len(b) {
  4. return false
  5. }
  6. for i := range a {
  7. if a[i] != b[i] {
  8. return false
  9. }
  10. }
  11. return true
  12. }
  13. func difference(set1 []uint16, set2 []uint16, buffer []uint16) int {
  14. if 0 == len(set2) {
  15. buffer = buffer[:len(set1)]
  16. for k := 0; k < len(set1); k++ {
  17. buffer[k] = set1[k]
  18. }
  19. return len(set1)
  20. }
  21. if 0 == len(set1) {
  22. return 0
  23. }
  24. pos := 0
  25. k1 := 0
  26. k2 := 0
  27. buffer = buffer[:cap(buffer)]
  28. s1 := set1[k1]
  29. s2 := set2[k2]
  30. for {
  31. if s1 < s2 {
  32. buffer[pos] = s1
  33. pos++
  34. k1++
  35. if k1 >= len(set1) {
  36. break
  37. }
  38. s1 = set1[k1]
  39. } else if s1 == s2 {
  40. k1++
  41. k2++
  42. if k1 >= len(set1) {
  43. break
  44. }
  45. s1 = set1[k1]
  46. if k2 >= len(set2) {
  47. for ; k1 < len(set1); k1++ {
  48. buffer[pos] = set1[k1]
  49. pos++
  50. }
  51. break
  52. }
  53. s2 = set2[k2]
  54. } else { // if (val1>val2)
  55. k2++
  56. if k2 >= len(set2) {
  57. for ; k1 < len(set1); k1++ {
  58. buffer[pos] = set1[k1]
  59. pos++
  60. }
  61. break
  62. }
  63. s2 = set2[k2]
  64. }
  65. }
  66. return pos
  67. }
  68. func exclusiveUnion2by2(set1 []uint16, set2 []uint16, buffer []uint16) int {
  69. if 0 == len(set2) {
  70. buffer = buffer[:len(set1)]
  71. copy(buffer, set1[:])
  72. return len(set1)
  73. }
  74. if 0 == len(set1) {
  75. buffer = buffer[:len(set2)]
  76. copy(buffer, set2[:])
  77. return len(set2)
  78. }
  79. pos := 0
  80. k1 := 0
  81. k2 := 0
  82. s1 := set1[k1]
  83. s2 := set2[k2]
  84. buffer = buffer[:cap(buffer)]
  85. for {
  86. if s1 < s2 {
  87. buffer[pos] = s1
  88. pos++
  89. k1++
  90. if k1 >= len(set1) {
  91. for ; k2 < len(set2); k2++ {
  92. buffer[pos] = set2[k2]
  93. pos++
  94. }
  95. break
  96. }
  97. s1 = set1[k1]
  98. } else if s1 == s2 {
  99. k1++
  100. k2++
  101. if k1 >= len(set1) {
  102. for ; k2 < len(set2); k2++ {
  103. buffer[pos] = set2[k2]
  104. pos++
  105. }
  106. break
  107. }
  108. if k2 >= len(set2) {
  109. for ; k1 < len(set1); k1++ {
  110. buffer[pos] = set1[k1]
  111. pos++
  112. }
  113. break
  114. }
  115. s1 = set1[k1]
  116. s2 = set2[k2]
  117. } else { // if (val1>val2)
  118. buffer[pos] = s2
  119. pos++
  120. k2++
  121. if k2 >= len(set2) {
  122. for ; k1 < len(set1); k1++ {
  123. buffer[pos] = set1[k1]
  124. pos++
  125. }
  126. break
  127. }
  128. s2 = set2[k2]
  129. }
  130. }
  131. return pos
  132. }
  133. func union2by2(set1 []uint16, set2 []uint16, buffer []uint16) int {
  134. pos := 0
  135. k1 := 0
  136. k2 := 0
  137. if 0 == len(set2) {
  138. buffer = buffer[:len(set1)]
  139. copy(buffer, set1[:])
  140. return len(set1)
  141. }
  142. if 0 == len(set1) {
  143. buffer = buffer[:len(set2)]
  144. copy(buffer, set2[:])
  145. return len(set2)
  146. }
  147. s1 := set1[k1]
  148. s2 := set2[k2]
  149. buffer = buffer[:cap(buffer)]
  150. for {
  151. if s1 < s2 {
  152. buffer[pos] = s1
  153. pos++
  154. k1++
  155. if k1 >= len(set1) {
  156. copy(buffer[pos:], set2[k2:])
  157. pos += len(set2) - k2
  158. break
  159. }
  160. s1 = set1[k1]
  161. } else if s1 == s2 {
  162. buffer[pos] = s1
  163. pos++
  164. k1++
  165. k2++
  166. if k1 >= len(set1) {
  167. copy(buffer[pos:], set2[k2:])
  168. pos += len(set2) - k2
  169. break
  170. }
  171. if k2 >= len(set2) {
  172. copy(buffer[pos:], set1[k1:])
  173. pos += len(set1) - k1
  174. break
  175. }
  176. s1 = set1[k1]
  177. s2 = set2[k2]
  178. } else { // if (set1[k1]>set2[k2])
  179. buffer[pos] = s2
  180. pos++
  181. k2++
  182. if k2 >= len(set2) {
  183. copy(buffer[pos:], set1[k1:])
  184. pos += len(set1) - k1
  185. break
  186. }
  187. s2 = set2[k2]
  188. }
  189. }
  190. return pos
  191. }
  192. func union2by2Cardinality(set1 []uint16, set2 []uint16) int {
  193. pos := 0
  194. k1 := 0
  195. k2 := 0
  196. if 0 == len(set2) {
  197. return len(set1)
  198. }
  199. if 0 == len(set1) {
  200. return len(set2)
  201. }
  202. s1 := set1[k1]
  203. s2 := set2[k2]
  204. for {
  205. if s1 < s2 {
  206. pos++
  207. k1++
  208. if k1 >= len(set1) {
  209. pos += len(set2) - k2
  210. break
  211. }
  212. s1 = set1[k1]
  213. } else if s1 == s2 {
  214. pos++
  215. k1++
  216. k2++
  217. if k1 >= len(set1) {
  218. pos += len(set2) - k2
  219. break
  220. }
  221. if k2 >= len(set2) {
  222. pos += len(set1) - k1
  223. break
  224. }
  225. s1 = set1[k1]
  226. s2 = set2[k2]
  227. } else { // if (set1[k1]>set2[k2])
  228. pos++
  229. k2++
  230. if k2 >= len(set2) {
  231. pos += len(set1) - k1
  232. break
  233. }
  234. s2 = set2[k2]
  235. }
  236. }
  237. return pos
  238. }
  239. func intersection2by2(
  240. set1 []uint16,
  241. set2 []uint16,
  242. buffer []uint16) int {
  243. if len(set1)*64 < len(set2) {
  244. return onesidedgallopingintersect2by2(set1, set2, buffer)
  245. } else if len(set2)*64 < len(set1) {
  246. return onesidedgallopingintersect2by2(set2, set1, buffer)
  247. } else {
  248. return localintersect2by2(set1, set2, buffer)
  249. }
  250. }
  251. func intersection2by2Cardinality(
  252. set1 []uint16,
  253. set2 []uint16) int {
  254. if len(set1)*64 < len(set2) {
  255. return onesidedgallopingintersect2by2Cardinality(set1, set2)
  256. } else if len(set2)*64 < len(set1) {
  257. return onesidedgallopingintersect2by2Cardinality(set2, set1)
  258. } else {
  259. return localintersect2by2Cardinality(set1, set2)
  260. }
  261. }
  262. func intersects2by2(
  263. set1 []uint16,
  264. set2 []uint16) bool {
  265. // could be optimized if one set is much larger than the other one
  266. if (0 == len(set1)) || (0 == len(set2)) {
  267. return false
  268. }
  269. k1 := 0
  270. k2 := 0
  271. s1 := set1[k1]
  272. s2 := set2[k2]
  273. mainwhile:
  274. for {
  275. if s2 < s1 {
  276. for {
  277. k2++
  278. if k2 == len(set2) {
  279. break mainwhile
  280. }
  281. s2 = set2[k2]
  282. if s2 >= s1 {
  283. break
  284. }
  285. }
  286. }
  287. if s1 < s2 {
  288. for {
  289. k1++
  290. if k1 == len(set1) {
  291. break mainwhile
  292. }
  293. s1 = set1[k1]
  294. if s1 >= s2 {
  295. break
  296. }
  297. }
  298. } else {
  299. // (set2[k2] == set1[k1])
  300. return true
  301. }
  302. }
  303. return false
  304. }
  305. func localintersect2by2(
  306. set1 []uint16,
  307. set2 []uint16,
  308. buffer []uint16) int {
  309. if (0 == len(set1)) || (0 == len(set2)) {
  310. return 0
  311. }
  312. k1 := 0
  313. k2 := 0
  314. pos := 0
  315. buffer = buffer[:cap(buffer)]
  316. s1 := set1[k1]
  317. s2 := set2[k2]
  318. mainwhile:
  319. for {
  320. if s2 < s1 {
  321. for {
  322. k2++
  323. if k2 == len(set2) {
  324. break mainwhile
  325. }
  326. s2 = set2[k2]
  327. if s2 >= s1 {
  328. break
  329. }
  330. }
  331. }
  332. if s1 < s2 {
  333. for {
  334. k1++
  335. if k1 == len(set1) {
  336. break mainwhile
  337. }
  338. s1 = set1[k1]
  339. if s1 >= s2 {
  340. break
  341. }
  342. }
  343. } else {
  344. // (set2[k2] == set1[k1])
  345. buffer[pos] = s1
  346. pos++
  347. k1++
  348. if k1 == len(set1) {
  349. break
  350. }
  351. s1 = set1[k1]
  352. k2++
  353. if k2 == len(set2) {
  354. break
  355. }
  356. s2 = set2[k2]
  357. }
  358. }
  359. return pos
  360. }
  361. func localintersect2by2Cardinality(
  362. set1 []uint16,
  363. set2 []uint16) int {
  364. if (0 == len(set1)) || (0 == len(set2)) {
  365. return 0
  366. }
  367. k1 := 0
  368. k2 := 0
  369. pos := 0
  370. s1 := set1[k1]
  371. s2 := set2[k2]
  372. mainwhile:
  373. for {
  374. if s2 < s1 {
  375. for {
  376. k2++
  377. if k2 == len(set2) {
  378. break mainwhile
  379. }
  380. s2 = set2[k2]
  381. if s2 >= s1 {
  382. break
  383. }
  384. }
  385. }
  386. if s1 < s2 {
  387. for {
  388. k1++
  389. if k1 == len(set1) {
  390. break mainwhile
  391. }
  392. s1 = set1[k1]
  393. if s1 >= s2 {
  394. break
  395. }
  396. }
  397. } else {
  398. // (set2[k2] == set1[k1])
  399. pos++
  400. k1++
  401. if k1 == len(set1) {
  402. break
  403. }
  404. s1 = set1[k1]
  405. k2++
  406. if k2 == len(set2) {
  407. break
  408. }
  409. s2 = set2[k2]
  410. }
  411. }
  412. return pos
  413. }
  414. func advanceUntil(
  415. array []uint16,
  416. pos int,
  417. length int,
  418. min uint16) int {
  419. lower := pos + 1
  420. if lower >= length || array[lower] >= min {
  421. return lower
  422. }
  423. spansize := 1
  424. for lower+spansize < length && array[lower+spansize] < min {
  425. spansize *= 2
  426. }
  427. var upper int
  428. if lower+spansize < length {
  429. upper = lower + spansize
  430. } else {
  431. upper = length - 1
  432. }
  433. if array[upper] == min {
  434. return upper
  435. }
  436. if array[upper] < min {
  437. // means
  438. // array
  439. // has no
  440. // item
  441. // >= min
  442. // pos = array.length;
  443. return length
  444. }
  445. // we know that the next-smallest span was too small
  446. lower += (spansize >> 1)
  447. mid := 0
  448. for lower+1 != upper {
  449. mid = (lower + upper) >> 1
  450. if array[mid] == min {
  451. return mid
  452. } else if array[mid] < min {
  453. lower = mid
  454. } else {
  455. upper = mid
  456. }
  457. }
  458. return upper
  459. }
  460. func onesidedgallopingintersect2by2(
  461. smallset []uint16,
  462. largeset []uint16,
  463. buffer []uint16) int {
  464. if 0 == len(smallset) {
  465. return 0
  466. }
  467. buffer = buffer[:cap(buffer)]
  468. k1 := 0
  469. k2 := 0
  470. pos := 0
  471. s1 := largeset[k1]
  472. s2 := smallset[k2]
  473. mainwhile:
  474. for {
  475. if s1 < s2 {
  476. k1 = advanceUntil(largeset, k1, len(largeset), s2)
  477. if k1 == len(largeset) {
  478. break mainwhile
  479. }
  480. s1 = largeset[k1]
  481. }
  482. if s2 < s1 {
  483. k2++
  484. if k2 == len(smallset) {
  485. break mainwhile
  486. }
  487. s2 = smallset[k2]
  488. } else {
  489. buffer[pos] = s2
  490. pos++
  491. k2++
  492. if k2 == len(smallset) {
  493. break
  494. }
  495. s2 = smallset[k2]
  496. k1 = advanceUntil(largeset, k1, len(largeset), s2)
  497. if k1 == len(largeset) {
  498. break mainwhile
  499. }
  500. s1 = largeset[k1]
  501. }
  502. }
  503. return pos
  504. }
  505. func onesidedgallopingintersect2by2Cardinality(
  506. smallset []uint16,
  507. largeset []uint16) int {
  508. if 0 == len(smallset) {
  509. return 0
  510. }
  511. k1 := 0
  512. k2 := 0
  513. pos := 0
  514. s1 := largeset[k1]
  515. s2 := smallset[k2]
  516. mainwhile:
  517. for {
  518. if s1 < s2 {
  519. k1 = advanceUntil(largeset, k1, len(largeset), s2)
  520. if k1 == len(largeset) {
  521. break mainwhile
  522. }
  523. s1 = largeset[k1]
  524. }
  525. if s2 < s1 {
  526. k2++
  527. if k2 == len(smallset) {
  528. break mainwhile
  529. }
  530. s2 = smallset[k2]
  531. } else {
  532. pos++
  533. k2++
  534. if k2 == len(smallset) {
  535. break
  536. }
  537. s2 = smallset[k2]
  538. k1 = advanceUntil(largeset, k1, len(largeset), s2)
  539. if k1 == len(largeset) {
  540. break mainwhile
  541. }
  542. s1 = largeset[k1]
  543. }
  544. }
  545. return pos
  546. }
  547. func binarySearch(array []uint16, ikey uint16) int {
  548. low := 0
  549. high := len(array) - 1
  550. for low+16 <= high {
  551. middleIndex := int(uint32(low+high) >> 1)
  552. middleValue := array[middleIndex]
  553. if middleValue < ikey {
  554. low = middleIndex + 1
  555. } else if middleValue > ikey {
  556. high = middleIndex - 1
  557. } else {
  558. return middleIndex
  559. }
  560. }
  561. for ; low <= high; low++ {
  562. val := array[low]
  563. if val >= ikey {
  564. if val == ikey {
  565. return low
  566. }
  567. break
  568. }
  569. }
  570. return -(low + 1)
  571. }