union find algorithm
This commit is contained in:
parent
3c192b7712
commit
f2817471d1
12 changed files with 2001239 additions and 0 deletions
2000001
fundamentals/exrecises/union_find/largeUF.txt
Normal file
2000001
fundamentals/exrecises/union_find/largeUF.txt
Normal file
File diff suppressed because it is too large
Load diff
901
fundamentals/exrecises/union_find/mediumUF.txt
Normal file
901
fundamentals/exrecises/union_find/mediumUF.txt
Normal file
|
@ -0,0 +1,901 @@
|
|||
625
|
||||
528 503
|
||||
548 523
|
||||
389 414
|
||||
446 421
|
||||
552 553
|
||||
154 155
|
||||
173 174
|
||||
373 348
|
||||
567 542
|
||||
44 43
|
||||
370 345
|
||||
546 547
|
||||
204 229
|
||||
404 429
|
||||
240 215
|
||||
364 389
|
||||
612 611
|
||||
513 512
|
||||
377 376
|
||||
468 443
|
||||
410 435
|
||||
243 218
|
||||
347 322
|
||||
580 581
|
||||
188 163
|
||||
61 36
|
||||
545 546
|
||||
93 68
|
||||
84 83
|
||||
94 69
|
||||
7 8
|
||||
619 618
|
||||
314 339
|
||||
155 156
|
||||
150 175
|
||||
605 580
|
||||
118 93
|
||||
385 360
|
||||
459 458
|
||||
167 168
|
||||
107 108
|
||||
44 69
|
||||
335 334
|
||||
251 276
|
||||
196 197
|
||||
501 502
|
||||
212 187
|
||||
251 250
|
||||
269 270
|
||||
332 331
|
||||
125 150
|
||||
391 416
|
||||
366 367
|
||||
65 40
|
||||
515 540
|
||||
248 273
|
||||
34 9
|
||||
480 479
|
||||
198 173
|
||||
463 488
|
||||
111 86
|
||||
524 499
|
||||
28 27
|
||||
323 324
|
||||
198 199
|
||||
146 147
|
||||
133 158
|
||||
416 415
|
||||
103 102
|
||||
457 482
|
||||
57 82
|
||||
88 113
|
||||
535 560
|
||||
181 180
|
||||
605 606
|
||||
481 456
|
||||
127 102
|
||||
470 445
|
||||
229 254
|
||||
169 170
|
||||
386 385
|
||||
383 384
|
||||
153 152
|
||||
541 542
|
||||
36 37
|
||||
474 473
|
||||
126 125
|
||||
534 509
|
||||
154 129
|
||||
591 592
|
||||
161 186
|
||||
209 234
|
||||
88 87
|
||||
61 60
|
||||
161 136
|
||||
472 447
|
||||
239 240
|
||||
102 101
|
||||
342 343
|
||||
566 565
|
||||
567 568
|
||||
41 42
|
||||
154 153
|
||||
471 496
|
||||
358 383
|
||||
423 448
|
||||
241 242
|
||||
292 293
|
||||
363 364
|
||||
361 362
|
||||
258 283
|
||||
75 100
|
||||
61 86
|
||||
81 106
|
||||
52 27
|
||||
230 255
|
||||
309 334
|
||||
378 379
|
||||
136 111
|
||||
439 464
|
||||
532 533
|
||||
166 191
|
||||
523 522
|
||||
210 211
|
||||
115 140
|
||||
347 346
|
||||
218 217
|
||||
561 560
|
||||
526 501
|
||||
174 149
|
||||
258 259
|
||||
77 52
|
||||
36 11
|
||||
307 306
|
||||
577 552
|
||||
62 61
|
||||
450 425
|
||||
569 570
|
||||
268 293
|
||||
79 78
|
||||
233 208
|
||||
571 570
|
||||
534 535
|
||||
527 552
|
||||
224 199
|
||||
409 408
|
||||
521 520
|
||||
621 622
|
||||
493 518
|
||||
107 106
|
||||
511 510
|
||||
298 299
|
||||
37 62
|
||||
224 249
|
||||
405 380
|
||||
236 237
|
||||
120 121
|
||||
393 418
|
||||
206 231
|
||||
287 288
|
||||
593 568
|
||||
34 59
|
||||
483 484
|
||||
226 227
|
||||
73 74
|
||||
276 277
|
||||
588 587
|
||||
288 313
|
||||
410 385
|
||||
506 505
|
||||
597 598
|
||||
337 312
|
||||
55 56
|
||||
300 325
|
||||
135 134
|
||||
4 29
|
||||
501 500
|
||||
438 437
|
||||
311 312
|
||||
598 599
|
||||
320 345
|
||||
211 236
|
||||
587 562
|
||||
74 99
|
||||
473 498
|
||||
278 279
|
||||
394 369
|
||||
123 148
|
||||
233 232
|
||||
252 277
|
||||
177 202
|
||||
160 185
|
||||
331 356
|
||||
192 191
|
||||
119 118
|
||||
576 601
|
||||
317 316
|
||||
462 487
|
||||
42 43
|
||||
336 311
|
||||
515 490
|
||||
13 14
|
||||
210 235
|
||||
473 448
|
||||
342 341
|
||||
340 315
|
||||
413 388
|
||||
514 515
|
||||
144 143
|
||||
146 145
|
||||
541 566
|
||||
128 103
|
||||
184 159
|
||||
488 489
|
||||
454 455
|
||||
82 83
|
||||
70 45
|
||||
221 222
|
||||
241 240
|
||||
412 411
|
||||
591 590
|
||||
592 593
|
||||
276 301
|
||||
452 453
|
||||
256 255
|
||||
397 372
|
||||
201 200
|
||||
232 207
|
||||
466 465
|
||||
561 586
|
||||
417 442
|
||||
409 434
|
||||
238 239
|
||||
389 390
|
||||
26 1
|
||||
510 485
|
||||
283 282
|
||||
281 306
|
||||
449 474
|
||||
324 349
|
||||
121 146
|
||||
111 112
|
||||
434 435
|
||||
507 508
|
||||
103 104
|
||||
319 294
|
||||
455 480
|
||||
558 557
|
||||
291 292
|
||||
553 578
|
||||
392 391
|
||||
552 551
|
||||
55 80
|
||||
538 539
|
||||
367 392
|
||||
340 365
|
||||
272 297
|
||||
266 265
|
||||
401 376
|
||||
279 280
|
||||
516 515
|
||||
178 177
|
||||
572 571
|
||||
154 179
|
||||
263 262
|
||||
6 31
|
||||
323 348
|
||||
481 506
|
||||
178 179
|
||||
526 527
|
||||
444 469
|
||||
273 274
|
||||
132 133
|
||||
275 300
|
||||
261 236
|
||||
344 369
|
||||
63 38
|
||||
5 30
|
||||
301 300
|
||||
86 87
|
||||
9 10
|
||||
344 319
|
||||
428 427
|
||||
400 375
|
||||
350 375
|
||||
235 236
|
||||
337 336
|
||||
616 615
|
||||
381 380
|
||||
58 59
|
||||
492 493
|
||||
555 556
|
||||
459 434
|
||||
368 369
|
||||
407 382
|
||||
166 141
|
||||
70 95
|
||||
380 355
|
||||
34 35
|
||||
49 24
|
||||
126 127
|
||||
403 378
|
||||
509 484
|
||||
613 588
|
||||
208 207
|
||||
143 168
|
||||
406 431
|
||||
263 238
|
||||
595 596
|
||||
218 193
|
||||
183 182
|
||||
195 220
|
||||
381 406
|
||||
64 65
|
||||
371 372
|
||||
531 506
|
||||
218 219
|
||||
144 145
|
||||
475 450
|
||||
547 548
|
||||
363 362
|
||||
337 362
|
||||
214 239
|
||||
110 111
|
||||
600 575
|
||||
105 106
|
||||
147 148
|
||||
599 574
|
||||
622 623
|
||||
319 320
|
||||
36 35
|
||||
258 233
|
||||
266 267
|
||||
481 480
|
||||
414 439
|
||||
169 168
|
||||
479 478
|
||||
224 223
|
||||
181 182
|
||||
351 326
|
||||
466 441
|
||||
85 60
|
||||
140 165
|
||||
91 90
|
||||
263 264
|
||||
188 187
|
||||
446 447
|
||||
607 606
|
||||
341 316
|
||||
143 142
|
||||
443 442
|
||||
354 353
|
||||
162 137
|
||||
281 256
|
||||
549 574
|
||||
407 408
|
||||
575 550
|
||||
171 170
|
||||
389 388
|
||||
390 391
|
||||
250 225
|
||||
536 537
|
||||
227 228
|
||||
84 59
|
||||
139 140
|
||||
485 484
|
||||
573 598
|
||||
356 381
|
||||
314 315
|
||||
299 324
|
||||
370 395
|
||||
166 165
|
||||
63 62
|
||||
507 506
|
||||
426 425
|
||||
479 454
|
||||
545 570
|
||||
376 375
|
||||
572 597
|
||||
606 581
|
||||
278 277
|
||||
303 302
|
||||
190 165
|
||||
230 205
|
||||
175 200
|
||||
529 528
|
||||
18 17
|
||||
458 457
|
||||
514 513
|
||||
617 616
|
||||
298 323
|
||||
162 161
|
||||
471 472
|
||||
81 56
|
||||
182 207
|
||||
539 564
|
||||
573 572
|
||||
596 621
|
||||
64 39
|
||||
571 546
|
||||
554 555
|
||||
388 363
|
||||
351 376
|
||||
304 329
|
||||
123 122
|
||||
135 160
|
||||
157 132
|
||||
599 624
|
||||
451 426
|
||||
162 187
|
||||
502 477
|
||||
508 483
|
||||
141 140
|
||||
303 328
|
||||
551 576
|
||||
471 446
|
||||
161 160
|
||||
465 490
|
||||
3 2
|
||||
138 113
|
||||
309 284
|
||||
452 451
|
||||
414 413
|
||||
540 565
|
||||
210 185
|
||||
350 325
|
||||
383 382
|
||||
2 1
|
||||
598 623
|
||||
97 72
|
||||
485 460
|
||||
315 316
|
||||
19 20
|
||||
31 32
|
||||
546 521
|
||||
320 321
|
||||
29 54
|
||||
330 331
|
||||
92 67
|
||||
480 505
|
||||
274 249
|
||||
22 47
|
||||
304 279
|
||||
493 468
|
||||
424 423
|
||||
39 40
|
||||
164 165
|
||||
269 268
|
||||
445 446
|
||||
228 203
|
||||
384 409
|
||||
390 365
|
||||
283 308
|
||||
374 399
|
||||
361 386
|
||||
94 119
|
||||
237 262
|
||||
43 68
|
||||
295 270
|
||||
400 425
|
||||
360 335
|
||||
122 121
|
||||
469 468
|
||||
189 188
|
||||
377 352
|
||||
367 342
|
||||
67 42
|
||||
616 591
|
||||
442 467
|
||||
558 533
|
||||
395 394
|
||||
3 28
|
||||
476 477
|
||||
257 258
|
||||
280 281
|
||||
517 542
|
||||
505 504
|
||||
302 301
|
||||
14 15
|
||||
523 498
|
||||
393 368
|
||||
46 71
|
||||
141 142
|
||||
477 452
|
||||
535 510
|
||||
237 238
|
||||
232 231
|
||||
5 6
|
||||
75 50
|
||||
278 253
|
||||
68 69
|
||||
584 559
|
||||
503 504
|
||||
281 282
|
||||
19 44
|
||||
411 410
|
||||
290 265
|
||||
579 554
|
||||
85 84
|
||||
65 66
|
||||
9 8
|
||||
484 459
|
||||
427 402
|
||||
195 196
|
||||
617 618
|
||||
418 443
|
||||
101 126
|
||||
268 243
|
||||
92 117
|
||||
290 315
|
||||
562 561
|
||||
255 280
|
||||
488 487
|
||||
578 603
|
||||
80 79
|
||||
57 58
|
||||
77 78
|
||||
417 418
|
||||
246 271
|
||||
95 96
|
||||
234 233
|
||||
530 555
|
||||
543 568
|
||||
396 397
|
||||
22 23
|
||||
29 28
|
||||
502 527
|
||||
12 13
|
||||
217 216
|
||||
522 547
|
||||
357 332
|
||||
543 518
|
||||
151 176
|
||||
69 70
|
||||
556 557
|
||||
247 248
|
||||
513 538
|
||||
204 205
|
||||
604 605
|
||||
528 527
|
||||
455 456
|
||||
624 623
|
||||
284 285
|
||||
27 26
|
||||
94 95
|
||||
486 511
|
||||
192 167
|
||||
372 347
|
||||
129 104
|
||||
349 374
|
||||
313 314
|
||||
354 329
|
||||
294 293
|
||||
377 378
|
||||
291 290
|
||||
433 408
|
||||
57 56
|
||||
215 190
|
||||
467 492
|
||||
383 408
|
||||
569 594
|
||||
209 208
|
||||
2 27
|
||||
466 491
|
||||
147 122
|
||||
112 113
|
||||
21 46
|
||||
284 259
|
||||
563 538
|
||||
392 417
|
||||
458 433
|
||||
464 465
|
||||
297 298
|
||||
336 361
|
||||
607 582
|
||||
553 554
|
||||
225 200
|
||||
186 211
|
||||
33 34
|
||||
237 212
|
||||
52 51
|
||||
620 595
|
||||
492 517
|
||||
585 610
|
||||
257 282
|
||||
520 545
|
||||
541 540
|
||||
269 244
|
||||
609 584
|
||||
109 84
|
||||
247 246
|
||||
562 537
|
||||
172 197
|
||||
166 167
|
||||
264 265
|
||||
129 130
|
||||
89 114
|
||||
204 179
|
||||
51 76
|
||||
415 390
|
||||
54 53
|
||||
219 244
|
||||
491 490
|
||||
494 493
|
||||
87 62
|
||||
158 183
|
||||
517 518
|
||||
358 359
|
||||
105 104
|
||||
285 260
|
||||
343 318
|
||||
348 347
|
||||
615 614
|
||||
169 144
|
||||
53 78
|
||||
494 495
|
||||
576 577
|
||||
23 24
|
||||
22 21
|
||||
41 40
|
||||
467 466
|
||||
112 87
|
||||
245 220
|
||||
442 441
|
||||
411 436
|
||||
256 257
|
||||
469 494
|
||||
441 416
|
||||
132 107
|
||||
468 467
|
||||
345 344
|
||||
608 609
|
||||
358 333
|
||||
418 419
|
||||
430 429
|
||||
130 131
|
||||
127 128
|
||||
115 90
|
||||
364 365
|
||||
296 271
|
||||
260 235
|
||||
229 228
|
||||
232 257
|
||||
189 190
|
||||
234 235
|
||||
195 170
|
||||
117 118
|
||||
487 486
|
||||
203 204
|
||||
142 117
|
||||
582 583
|
||||
561 536
|
||||
7 32
|
||||
387 388
|
||||
333 334
|
||||
420 421
|
||||
317 292
|
||||
327 352
|
||||
564 563
|
||||
39 14
|
||||
177 152
|
||||
144 119
|
||||
426 401
|
||||
248 223
|
||||
566 567
|
||||
53 28
|
||||
106 131
|
||||
473 472
|
||||
525 526
|
||||
327 302
|
||||
382 381
|
||||
222 197
|
||||
610 609
|
||||
522 521
|
||||
291 316
|
||||
339 338
|
||||
328 329
|
||||
31 56
|
||||
247 222
|
||||
185 186
|
||||
554 529
|
||||
393 392
|
||||
108 83
|
||||
514 489
|
||||
48 23
|
||||
37 12
|
||||
46 45
|
||||
25 0
|
||||
463 462
|
||||
101 76
|
||||
11 10
|
||||
548 573
|
||||
137 112
|
||||
123 124
|
||||
359 360
|
||||
489 490
|
||||
368 367
|
||||
71 96
|
||||
229 230
|
||||
496 495
|
||||
366 365
|
||||
86 85
|
||||
496 497
|
||||
482 481
|
||||
326 301
|
||||
278 303
|
||||
139 114
|
||||
71 70
|
||||
275 276
|
||||
223 198
|
||||
590 565
|
||||
496 521
|
||||
16 41
|
||||
501 476
|
||||
371 370
|
||||
511 536
|
||||
577 602
|
||||
37 38
|
||||
423 422
|
||||
71 72
|
||||
399 424
|
||||
171 146
|
||||
32 33
|
||||
157 182
|
||||
608 583
|
||||
474 499
|
||||
205 206
|
||||
539 514
|
||||
601 600
|
||||
419 420
|
||||
208 183
|
||||
537 538
|
||||
110 85
|
||||
105 130
|
||||
288 289
|
||||
455 430
|
||||
531 532
|
||||
337 338
|
||||
227 202
|
||||
120 145
|
||||
559 534
|
||||
261 262
|
||||
241 216
|
||||
379 354
|
||||
430 405
|
||||
241 266
|
||||
396 421
|
||||
317 318
|
||||
139 164
|
||||
310 285
|
||||
478 477
|
||||
532 557
|
||||
238 213
|
||||
195 194
|
||||
359 384
|
||||
243 242
|
||||
432 457
|
||||
422 447
|
||||
519 518
|
||||
271 272
|
||||
12 11
|
||||
478 453
|
||||
453 428
|
||||
614 613
|
||||
138 139
|
||||
96 97
|
||||
399 398
|
||||
55 54
|
||||
199 174
|
||||
566 591
|
||||
213 188
|
||||
488 513
|
||||
169 194
|
||||
603 602
|
||||
293 318
|
||||
432 431
|
||||
524 523
|
||||
30 31
|
||||
88 63
|
||||
172 173
|
||||
510 509
|
||||
272 273
|
||||
559 558
|
||||
494 519
|
||||
374 373
|
||||
547 572
|
||||
263 288
|
||||
17 16
|
||||
78 103
|
||||
542 543
|
||||
131 132
|
||||
519 544
|
||||
504 529
|
||||
60 59
|
||||
356 355
|
||||
341 340
|
||||
415 414
|
||||
285 286
|
||||
439 438
|
||||
588 563
|
||||
25 50
|
||||
463 438
|
||||
581 556
|
||||
244 245
|
||||
500 475
|
||||
93 92
|
||||
274 299
|
||||
351 350
|
||||
152 127
|
||||
472 497
|
||||
440 415
|
||||
214 215
|
||||
231 230
|
||||
80 81
|
||||
550 525
|
||||
511 512
|
||||
483 458
|
||||
67 68
|
||||
255 254
|
||||
589 588
|
||||
147 172
|
||||
454 453
|
||||
587 612
|
||||
343 368
|
||||
508 509
|
||||
240 265
|
||||
49 48
|
||||
184 183
|
||||
583 558
|
||||
164 189
|
||||
461 436
|
||||
109 134
|
||||
196 171
|
||||
156 181
|
||||
124 99
|
||||
531 530
|
||||
116 91
|
||||
431 430
|
||||
326 325
|
||||
44 45
|
||||
507 482
|
||||
557 582
|
||||
519 520
|
||||
167 142
|
||||
469 470
|
||||
563 562
|
||||
507 532
|
||||
94 93
|
||||
3 4
|
||||
366 391
|
||||
456 431
|
||||
524 549
|
||||
489 464
|
||||
397 398
|
||||
98 97
|
||||
377 402
|
||||
413 412
|
||||
148 149
|
||||
91 66
|
||||
308 333
|
||||
16 15
|
||||
312 287
|
||||
212 211
|
||||
486 461
|
||||
571 596
|
||||
226 251
|
||||
356 357
|
||||
145 170
|
||||
295 294
|
||||
308 309
|
||||
163 138
|
||||
364 339
|
||||
416 417
|
||||
402 401
|
||||
302 277
|
||||
349 348
|
||||
582 581
|
||||
176 175
|
||||
254 279
|
||||
589 614
|
||||
322 297
|
||||
587 586
|
||||
221 246
|
||||
526 551
|
||||
159 158
|
||||
460 461
|
||||
452 427
|
||||
329 330
|
||||
321 322
|
||||
82 107
|
||||
462 461
|
||||
495 520
|
||||
303 304
|
||||
90 65
|
||||
295 320
|
||||
160 159
|
||||
463 464
|
||||
10 35
|
||||
619 594
|
||||
403 402
|
44
fundamentals/exrecises/union_find/quick_find.go
Normal file
44
fundamentals/exrecises/union_find/quick_find.go
Normal file
|
@ -0,0 +1,44 @@
|
|||
package unionfind
|
||||
|
||||
type quickFind struct {
|
||||
id []int
|
||||
count int
|
||||
}
|
||||
|
||||
func NewQuickFind(count int) UnionFind {
|
||||
id := make([]int, count)
|
||||
|
||||
for i := range id {
|
||||
id[i] = i
|
||||
}
|
||||
|
||||
return &quickFind{id, count}
|
||||
}
|
||||
|
||||
func (qf *quickFind) Find(site int) int {
|
||||
return qf.id[site]
|
||||
}
|
||||
|
||||
func (qf *quickFind) Union(aSite, bSite int) {
|
||||
aComponent := qf.Find(aSite)
|
||||
bComponent := qf.Find(bSite)
|
||||
|
||||
if aComponent == bComponent {
|
||||
return
|
||||
}
|
||||
|
||||
for site, component := range qf.id {
|
||||
if component == aComponent {
|
||||
qf.id[site] = bComponent
|
||||
}
|
||||
}
|
||||
qf.count--
|
||||
}
|
||||
|
||||
func (qf *quickFind) Connected(aSite, bSite int) bool {
|
||||
return qf.Find(aSite) == qf.Find(bSite)
|
||||
}
|
||||
|
||||
func (qf *quickFind) Count() int {
|
||||
return qf.count
|
||||
}
|
44
fundamentals/exrecises/union_find/quick_union.go
Normal file
44
fundamentals/exrecises/union_find/quick_union.go
Normal file
|
@ -0,0 +1,44 @@
|
|||
package unionfind
|
||||
|
||||
type quickUnion struct {
|
||||
id []int
|
||||
count int
|
||||
}
|
||||
|
||||
func NewQuickUnion(count int) UnionFind {
|
||||
id := make([]int, count)
|
||||
|
||||
for i := range id {
|
||||
id[i] = i
|
||||
}
|
||||
|
||||
return &quickUnion{id, count}
|
||||
}
|
||||
|
||||
func (qf *quickUnion) Find(site int) int {
|
||||
for site != qf.id[site] {
|
||||
site = qf.id[site]
|
||||
}
|
||||
|
||||
return site
|
||||
}
|
||||
|
||||
func (qf *quickUnion) Union(aSite, bSite int) {
|
||||
aComponent := qf.Find(aSite)
|
||||
bComponent := qf.Find(bSite)
|
||||
|
||||
if aComponent == bComponent {
|
||||
return
|
||||
}
|
||||
|
||||
qf.id[aComponent] = bComponent
|
||||
qf.count--
|
||||
}
|
||||
|
||||
func (qf *quickUnion) Connected(aSite, bSite int) bool {
|
||||
return qf.Find(aSite) == qf.Find(bSite)
|
||||
}
|
||||
|
||||
func (qf *quickUnion) Count() int {
|
||||
return qf.count
|
||||
}
|
11
fundamentals/exrecises/union_find/test_count.go
Normal file
11
fundamentals/exrecises/union_find/test_count.go
Normal file
|
@ -0,0 +1,11 @@
|
|||
package unionfind
|
||||
|
||||
import "log"
|
||||
|
||||
func testCount(i implementation) {
|
||||
qf := i.create(10)
|
||||
|
||||
if qf.Count() != 10 {
|
||||
log.Fatalf("%v: Before any union number of components should be equal to number of sites", i.name)
|
||||
}
|
||||
}
|
53
fundamentals/exrecises/union_find/test_file.go
Normal file
53
fundamentals/exrecises/union_find/test_file.go
Normal file
|
@ -0,0 +1,53 @@
|
|||
package unionfind
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"log"
|
||||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func testFile(fileName string, components int, i implementation) {
|
||||
lines := readByLine(fileName)
|
||||
count, _ := strconv.Atoi(<-lines)
|
||||
qf := i.create(count)
|
||||
|
||||
for line := range lines {
|
||||
first, second := pair(line)
|
||||
if qf.Connected(first, second) {
|
||||
continue
|
||||
}
|
||||
qf.Union(first, second)
|
||||
}
|
||||
|
||||
if components != qf.Count() {
|
||||
log.Fatalf("%v: Expected components count: %v, got: %v", i.name, components, qf.Count())
|
||||
}
|
||||
fmt.Printf("%v: Components: %v\n", i.name, qf.Count())
|
||||
}
|
||||
|
||||
func readByLine(fileName string) <-chan string {
|
||||
file, _ := os.Open(fileName)
|
||||
scanner := bufio.NewScanner(file)
|
||||
line := make(chan string)
|
||||
|
||||
go func() {
|
||||
defer close(line)
|
||||
for scanner.Scan() {
|
||||
line <- scanner.Text()
|
||||
}
|
||||
}()
|
||||
|
||||
return line
|
||||
}
|
||||
|
||||
func pair(str string) (int, int) {
|
||||
numbers := strings.Split(str, " ")
|
||||
|
||||
a, _ := strconv.Atoi(numbers[0])
|
||||
b, _ := strconv.Atoi(numbers[1])
|
||||
|
||||
return a, b
|
||||
}
|
11
fundamentals/exrecises/union_find/test_find.go
Normal file
11
fundamentals/exrecises/union_find/test_find.go
Normal file
|
@ -0,0 +1,11 @@
|
|||
package unionfind
|
||||
|
||||
import "log"
|
||||
|
||||
func testFind(i implementation) {
|
||||
qf := i.create(2)
|
||||
|
||||
if qf.Find(0) != 0 || qf.Find(1) != 1 {
|
||||
log.Fatalf("%v Before union all sites belongs to component with same number", i.name)
|
||||
}
|
||||
}
|
33
fundamentals/exrecises/union_find/test_union.go
Normal file
33
fundamentals/exrecises/union_find/test_union.go
Normal file
|
@ -0,0 +1,33 @@
|
|||
package unionfind
|
||||
|
||||
import "log"
|
||||
|
||||
func testUnion(i implementation) {
|
||||
qf := i.create(4)
|
||||
|
||||
qf.Union(0, 1)
|
||||
|
||||
if !qf.Connected(0, 1) {
|
||||
log.Fatalf("%v: sites should be connected after union", i.name)
|
||||
}
|
||||
|
||||
if qf.Find(0) != qf.Find(1) {
|
||||
log.Fatalf("%v after union sites should be in the same component", i.name)
|
||||
}
|
||||
|
||||
qf.Union(2, 3)
|
||||
|
||||
if !qf.Connected(2, 3) {
|
||||
log.Fatalf("%v: sites should be connected after union", i.name)
|
||||
}
|
||||
|
||||
if qf.Find(2) != qf.Find(3) {
|
||||
log.Fatalf("%v after union sites should be in the same component", i.name)
|
||||
}
|
||||
|
||||
qf.Union(1, 2)
|
||||
|
||||
if qf.Count() != 1 {
|
||||
log.Fatalf("%v after union count should be decreased", i.name)
|
||||
}
|
||||
}
|
12
fundamentals/exrecises/union_find/tinyUF.txt
Normal file
12
fundamentals/exrecises/union_find/tinyUF.txt
Normal file
|
@ -0,0 +1,12 @@
|
|||
10
|
||||
4 3
|
||||
3 8
|
||||
6 5
|
||||
9 4
|
||||
2 1
|
||||
8 9
|
||||
5 0
|
||||
7 2
|
||||
6 1
|
||||
1 0
|
||||
6 7
|
8
fundamentals/exrecises/union_find/union_find.go
Normal file
8
fundamentals/exrecises/union_find/union_find.go
Normal file
|
@ -0,0 +1,8 @@
|
|||
package unionfind
|
||||
|
||||
type UnionFind interface {
|
||||
Find(site int) int // returns "component" to which "site" belongs
|
||||
Union(aSite, bSite int) // links two sites. After union a and b belongs to same component
|
||||
Connected(aSite, bSite int) bool // checks if two sites belongs to same component
|
||||
Count() int // returns number of
|
||||
}
|
62
fundamentals/exrecises/union_find/union_find_test.go
Normal file
62
fundamentals/exrecises/union_find/union_find_test.go
Normal file
|
@ -0,0 +1,62 @@
|
|||
package unionfind
|
||||
|
||||
import (
|
||||
"testing"
|
||||
)
|
||||
|
||||
type implementation struct {
|
||||
name string
|
||||
create func(int) UnionFind
|
||||
}
|
||||
|
||||
var implementations = []implementation{
|
||||
{
|
||||
name: "quick find",
|
||||
create: NewQuickFind,
|
||||
},
|
||||
{
|
||||
name: "quick union",
|
||||
create: NewQuickUnion,
|
||||
},
|
||||
{
|
||||
name: "weighted quick union",
|
||||
create: NewWeightedQuickUnion,
|
||||
},
|
||||
}
|
||||
|
||||
func TestCount(t *testing.T) {
|
||||
for _, implementation := range implementations {
|
||||
testCount(implementation)
|
||||
}
|
||||
}
|
||||
|
||||
func TestFind(t *testing.T) {
|
||||
for _, implementation := range implementations {
|
||||
testFind(implementation)
|
||||
}
|
||||
}
|
||||
|
||||
func TestUnion(t *testing.T) {
|
||||
for _, implementation := range implementations {
|
||||
testUnion(implementation)
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkLarge(b *testing.B) {
|
||||
testFile("largeUF.txt", 6, implementation{
|
||||
name: "weighted quick union",
|
||||
create: NewWeightedQuickUnion,
|
||||
})
|
||||
}
|
||||
|
||||
func BenchmarkTiny(b *testing.B) {
|
||||
for _, implementation := range implementations {
|
||||
testFile("tinyUF.txt", 2, implementation)
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkMedium(b *testing.B) {
|
||||
for _, implementation := range implementations {
|
||||
testFile("mediumUF.txt", 3, implementation)
|
||||
}
|
||||
}
|
59
fundamentals/exrecises/union_find/weighted_quick_union.go
Normal file
59
fundamentals/exrecises/union_find/weighted_quick_union.go
Normal file
|
@ -0,0 +1,59 @@
|
|||
package unionfind
|
||||
|
||||
type weightedQuickUnion struct {
|
||||
id []int
|
||||
sizes []int
|
||||
count int
|
||||
}
|
||||
|
||||
func NewWeightedQuickUnion(count int) UnionFind {
|
||||
id := make([]int, count)
|
||||
sizes := make([]int, count)
|
||||
|
||||
for i := range id {
|
||||
id[i] = i
|
||||
}
|
||||
|
||||
for i := range sizes {
|
||||
sizes[i] = 1
|
||||
}
|
||||
|
||||
return &weightedQuickUnion{id, sizes, count}
|
||||
}
|
||||
|
||||
func (qf *weightedQuickUnion) Find(site int) int {
|
||||
for site != qf.id[site] {
|
||||
site = qf.id[site]
|
||||
}
|
||||
|
||||
return site
|
||||
}
|
||||
|
||||
func (qf *weightedQuickUnion) Union(aSite, bSite int) {
|
||||
aComponent := qf.Find(aSite)
|
||||
bComponent := qf.Find(bSite)
|
||||
|
||||
if aComponent == bComponent {
|
||||
return
|
||||
}
|
||||
|
||||
aSize := qf.sizes[aComponent]
|
||||
bSize := qf.sizes[bComponent]
|
||||
|
||||
if aSize > bSize {
|
||||
qf.id[bComponent] = aComponent
|
||||
qf.sizes[aComponent] += bSize
|
||||
} else {
|
||||
qf.id[aComponent] = bComponent
|
||||
qf.sizes[bComponent] += aSize
|
||||
}
|
||||
qf.count--
|
||||
}
|
||||
|
||||
func (qf *weightedQuickUnion) Connected(aSite, bSite int) bool {
|
||||
return qf.Find(aSite) == qf.Find(bSite)
|
||||
}
|
||||
|
||||
func (qf *weightedQuickUnion) Count() int {
|
||||
return qf.count
|
||||
}
|
Loading…
Reference in a new issue