2016-12-16 5 views
0

У меня есть бинарный растр, как это:Алгоритм рекурсивного алгоритма или наводнения для растра?

101101 
010111 
101011 
111101 

Теперь мне нужно, чтобы сделать эту строку за строкой: (! Только ячейки в строке) Переход через строку и подсчитать соседние ячейки, которые являются 1 , И я хотел бы получить вектор или что-то вроде этого. , например, для растра выше было бы:

1st row: 1 2 1 

2nd row: 1 3 

3rd row: 1 1 2 

4th row: 4 1 

Я много читал о алгоритме заливки и так далее. Но я просто не понимаю.

Я попробовал этот рекурсивный алгоритм:

rec=function(x) 
    {if (x==0) 
     {return 0) 
    else return(1+rec(x+1))} 

Но это не работает.

ответ

0

Вы можете использовать rle.

xy <- read.table(text = "1 0 1 1 0 1 
0 1 0 1 1 1 
1 0 1 0 1 1 
1 1 1 1 0 1", sep = "") 
xy 

apply(xy, MARGIN = 1, FUN = function(x) { 
    x <- rle(x) 
    x$lengths[x$values == 1] 
}) 

[[1]] 
V2 V5  
1 2 1 

[[2]] 
V3  
1 3 

[[3]] 
V2 V4  
1 1 2 

[[4]] 
V5  
4 1 
0

Вам не нужен алгоритм заполнения наводнений. Рекурсия тоже не нужна.

Просто подсчитайте нули. Простой конечный автомат:

Starting state in the beginning of every line is 0 
When state is 0 and you meet 1, remember X-position Start and make state 1 
When state is 1 and you meet 0, make state 0 and add `Current - Start` to list 
In other cases do nothing 
+0

ОК спасибо большое за ваш ответ! Я попробовал это, и это сработало для небольшого растра. Но мне приходится иметь дело с большими растрами (180x480), и это занимает слишком много времени. Возможно, моя версия недостаточно эффективна. – Cocilein

+0

Этот алгоритм имеет наилучшее время выполнения - он посещает каждый элемент растра только один раз. Он должен быстро вспыхивать для любого разумного размера растра. – MBo