Учитывая булеву матрицу X , пусть 0 записей представляют море, а 1 запись представляет землю. Определите остров как вертикально или горизонтально (но не по диагонали) смежные 1 записи.
Первоначальный вопрос заключался в подсчете количества островков в данной матрице. Автор описал рекурсивное решение ( памяти).
Но я безуспешно пытался найти потоковое (слева направо, а затем вниз к следующему ряду) решение, которое динамически подсчитывает острова с или O ( n ) или O ( n + m ) памятью (ограничений нет) за сложность времени). Это возможно? Если нет, то как я могу это доказать?
Несколько примеров ожидаемых выходов для определенных входов для count
функции:
Ответы:
Вот эскиз алгоритма, который одновременно хранит только две строки в памяти, поэтому памяти. Но так как вы можете запустить этот алгоритм для транспонирования матрицы без проблем, фактическая сложность составляет O ( min ( m , n ) ) памяти. Время обработки O ( m n ) .O ( м ) O ( мин ( м , н ) ) O ( м н )
Инициализация. Просканируйте первую строку и найдите все связанные подстроки этой строки. Присвойте каждой непересекающейся подстроке уникальный положительный идентификатор и сохраните его как вектор, который равен нулю, где равен нулю, а уникальный положительный идентификатор в противном случае.Икс
Для каждой оставшейся строки назначьте уникальные идентификаторы (никогда не назначайте предыдущие уникальные идентификаторы, убедитесь, что ваши идентификаторы строго увеличиваются) для подстрок в этой строке снова. Просмотрите предыдущую строку плюс текущую строку в виде матрицы размером на m , и всем связанным областям следует назначить их минимум. Например:2 м
Нет необходимости обновлять предыдущий ряд для корректности этого алгоритма, только текущий.
После того, как это сделано, найдите набор всех идентификаторов в предыдущей строке, которые не подключаются к следующей строке, отбрасывая дубликаты . Добавьте размер этого набора к вашему бегущему счетчику островов.
Теперь вы можете отказаться от предыдущей строки и назначить текущую строку предыдущей строке и двигаться дальше.
источник
Предположим, что Алиса содержит двоичный вектор а Боб содержит двоичный вектор y 1 , … , y n , и они хотят знать, существует ли индекс i такой, что 0 , x n и y 1 , 0 , у 2 , 0 ,Икс1, … , ХN Y1, ... , уN я Икся= уя= 1 2 × ( 2 n - 1 ) Икс1, 0 , х2, 0 , … , 0 , хN Y1, 0 , у2, 0 , … , 0 , уN ΣяИкся Σя( хя+ уя) я Ω ( n ) Ω ( n )
источник