2015-06-07 4 views
3

Что такое хороший способ обрезать массив 2d с заданным значением?2d массив, обрезка с заданным значением

A = [0 0 0 0 0] 
    [1 2 3 0 0] 
    [4 0 6 0 0] 
    [0 0 0 0 0] 

B = trim(A, 0) 
// results in: 
// B = [1 2 3] 
//  [4 0 6] 

Отделка должна быть способна обрезаться с любой из четырех сторон.

+1

Большой вопрос. Не так много усилий. :/ –

+1

Если 'A = [1 1 1; 0 0 0; 3 3 3] ', будет' trim (A, 0) 'удалить средний ряд? Или ваша функция 'trim' только обрезается внутрь, начиная с периметра? – Synergist

+0

Я сейчас пытаюсь. Метод, который я использую, - это проверить целые строки и столбцы для значения. строка = от 0 до N, строка = от N до 0, col = от 0 до M, col = от M до 0, для получения начальных и конечных строк и столбцов, но это просто кажется смешным. Я прошу, чтобы какой-то способ получить что-то лучше. – Distraction

ответ

0

псевдокод:

trim(array[WIDTH][HEIGHT], trimmed): 

    // top left corner will be (xmin, ymin) 
    xmin = WIDTH 
    ymin = HEIGHT 

    // bottom right corner will be (xmax, ymax) 
    xmax = -1 
    ymax = -1 

    for (y = 0; y < HEIGHT; y++): 
     for (x = 0; x < WIDTH; x++): 
      if (array[x][y] != trimmed): 
       if (xmin > x) xmin = x 
       if (xmax < x) xmax = x 
       if (ymin > y) ymin = y 
       if (ymax < y) ymax = y 

    if (xmin == WIDTH) 
     return an empty array 
    else 
     return sub-array with top left corner in (xmin, ymin) 
       and bottom right corner in (xmax, ymax) 

Время сложность O(WIDTH * HEIGHT), пространство сложность O(1).

В некоторых языках программирования (например, C или C++) цикл for должен быть намного быстрее из-за locality of reference и vectorization.

Смежные вопросы