Имам битова карта, съхранена като (фиксиран) брой цели числа без знак, напр.
1 0 0 1
1 0 1 0
1 1 0 1
0 1 1 0
...се съхранява като целочислен масив [ 9, 10, 13, 6 ]
(отгоре надолу, най-значимият бит вляво).
Бих искал да внедря алгоритъм за наводняване. Например, ако m
е картата, изобразена по-горе, floodFill(m, 3, 2)
трябва да създаде картата:
1 0 0 0
1 0 0 0
1 1 0 0
0 1 1 0
(Тук 3,2
съответства на трети ред (индексиран с 0), втора колона (отдясно). Отговорът ще бъде кодиран като [ 8, 8, 12, 6 ]
.)
Със сигурност мога да приложа един от стандартните подходи, но се чудя дали мога да се справя по-добре, като използвам трикове за битова манипулация.
Например, ако част от решението се съдържа в карта m0
, мисля, че аз m0 | ((m0 >> 1) & m)
"увеличавам" запълването на наводнението вдясно.
Това стандартен трик ли е за паралелизиране на запълване на наводнения на битови карти? Може ли някой да измисли пълен алгоритъм? Докажете интересни граници на времето за работа?
Редактиране: някои допълнителни примери:
floodFill ( 0 0 1 1 , 1, 1 ) = 0 0 1 1
1 1 1 0 1 1 1 0
0 0 1 1 0 0 1 1
1 1 0 1 0 0 0 1
floodFill ( 1 0 0 1 , 1, 2 ) = 0 0 0 0
0 1 0 0 0 1 0 0
0 1 0 1 0 1 0 0
0 0 1 1 0 0 0 0
1
бита от входа, които са достъпни от позиция3,2
. Последният ред е недокоснат, защото и двата1
бита са достъпни. - person Philippe   schedule 31.01.2014