pagina page oficial homepage home funciona decision curso como arboles algorithm math matrix

algorithm - page - ¿Qué fila tiene más 1s en una matriz de 0-1 con todos los 1s "a la izquierda"?



weka homepage (5)

Problema

Cada fila de una matriz nxn consta de 1 y 0, de modo que en cualquier fila, todos los 1 preceden a los 0. Encuentra la fila que contiene la mayoría de los no en 1 en O (n).

Ejemplo

1 1 1 1 1 0 <- Contains maximum number of 1s, return index 1 1 1 1 0 0 0 1 0 0 0 0 0 1 1 1 1 0 0 1 1 1 1 0 0 1 1 0 0 0 0

Encontré esta pregunta en mi libro de algoritmos. Lo mejor que pude hacer fue el tiempo O (n logn). ¿Cómo hacer esto en O (n)?


Cierto código C para hacer esto.

int n = 6; int maxones = 0, maxrow = -1, row = 0, col = 0; while(row < n) { while(col < n && matrix[row][col] == 1) col++; if(col == n) return row; if(col > maxones){ maxrow = row; maxones = col; } row++; }


Comience con la primera fila. Mantenga la fila R que tenga la mayor cantidad de 1s y el índice i del último 1 de R en cada iteración compara la fila actual con la fila R en el índice i . si la fila actual tiene un 0 en la posición i , la fila R sigue siendo la respuesta. De lo contrario, devuelve el índice de la fila actual. Ahora solo tenemos que encontrar el último 1 de la fila actual. Itere del índice i hasta el último 1 de la fila actual, establezca R en esta fila y i en este nuevo índice.

i | v R-> 1 1 1 1 1 0 | v 1 1 1 0 0 0 (Compare ith index of this row) 1 0 0 0 0 0 Repeat 1 1 1 1 0 0 " 1 1 1 1 0 0 " 1 1 0 0 0 0 "


Comience en 1,1.

Si la celda contiene 1, estás en la fila más larga hasta el momento; escríbelo y ve a la derecha. Si la celda contiene 0, baje. Si la celda está fuera de límites, ya terminaste.


Puedes hacerlo en O(N) siguiente manera:

Comience en A[i][j] con i=j=0 .

1, keep moving to the right by doing j++ A[i][j] = 0, move down to the next row by doing i++

Cuando llegue a la última fila o a la última columna, el valor de j será la respuesta.

Pseudo código:

Let R be number of rows Let C be number of columns Let i = 0 Let j = 0 Let max1Row = 0 while ( i<R && j<C ) if ( matrix[i][j] == 1 ) j++ max1Row = i else i++ end-while print "Max 1''s = j" print "Row number with max 1''s = max1Row"


int [] getMax1withRow(int [][] matrix){ int [] result=new int[2]; int rows=matrix.length; int cols=matrix[0].length; int i=0, j=0; int max_row=0;// This will show row with maximum 1. Intialing pointing to 0th row. int max_one=0;// max one while(i< rows){ while(matrix[i][j]==1){ j++; } if(j==n){ result[0]=n; result[1]=i; return result; } if(j>max_one){ max_one=j; max_row=i; } j=0;// Again start from the first column i++;// increase row number } result[0]=max_one; result[1]=max_row; return result; }

Complejidad del tiempo => O (fila + col), en el peor de los casos Si cada fila tiene n-1 una, excepto la última fila que tiene n 1s, entonces tenemos que viajar hasta la última fila.