Підрахунок островів у булевих матрицях


9

З огляду на н×м Булева матриця Х, дозволяє 0 записи представляють море і 1записи представляють землю. Визначте острів як вертикальний або горизонтальний (але не по діагоналі) сусідній1 записи.

Первісне питання полягав у підрахунку кількості островів у даній матриці. Автор описав рекурсивне рішення (О(нм) пам'ять).

Але я безуспішно намагався знайти потокове (зліва направо, а потім вниз до наступного ряду) рішення, яке динамічно рахує острови з О(м) або О(н) або О(н+м)пам'ять (для складності в часі немає обмежень). Це можливо? Якщо ні, то як я можу це довести?


Кілька прикладів очікуваних виходів для певних входів для countфункції:

cоунт(010111010)=1;cоунт(101010101)=5;cоунт(111101111)=1;

cоунт(1111100100010110100011011111)=2

cоунт(101111)=1


1
1. Що ви маєте на увазі під «ортогональним»? Ви маєте на увазі підключений компонент? 2. Що можна припустити про те, як зберігається матриця? Чи можемо ми припустити, що він зберігається на зовнішньому сховищі (наприклад, на повільному жорсткому диску), тож ви можете прочитати будь-яку потрібну вам частину, але буде швидше її читати за один раз? Або ми отримуємо матрицю потоковим способом, коли, отримавши трохи вхідної матриці, ми більше ніколи не можемо побачити цей біт вводу?
DW

1
Класно, спасибі. Я рекомендую вам відредагувати питання, щоб уточнити ці моменти. Якщо він потоковий, в який порядок надходять біти матриці? Сканування зліва направо серед рядків, а потім вниз до наступного ряду?
DW

1
Будь ласка, відредагуйте питання, щоб включити всі ці дані. Коментарі ефемерні.
Yuval Filmus

2
Не всю інформацію, надану в коментарях, можна знайти в самому дописі. Частина цієї інформації є досить важливою, як і ваша потокова модель. Коментарі можуть зникнути, і тому (і через стандарти громади) всі необхідні деталі повинні складати частину основної публікації.
Yuval Filmus

1
Яка необхідна часова складність?
hengxin

Відповіді:


4

Ось ескіз алгоритму, який зберігає лише два ряди пам’яті одночасно, так О(м)пам'ять. Але оскільки ви можете запустити цей алгоритм на транспонировку матриці без проблем, фактична складність єО(хв(м,н))пам'ять. Час обробки - цеО(мн).

  1. Ініціалізація. Перегляньте перший рядок і знайдіть усі підключені підрядки цього рядка. Призначте кожній роз'єднаній підрядці унікальний позитивний ідентифікатор і збережіть це як вектор, який дорівнює нулюХ дорівнює нулю, а унікальний позитивний інакше.

  2. Кожному решті, що залишився, призначте унікальні ідентифікатори (ніколи не призначайте попередні унікальні ідентифікатори, переконайтесь, що ваші ідентифікатори суворо збільшуються) підрядкам у цьому рядку знову. Перегляньте попередній рядок плюс поточний рядок як2 від мматриці, і будь-які підключені області повинні бути присвоєні мінімуму. Як приклад:

    010402220333300506607080009990010402220333300504402020003330

    Для коректності цього алгоритму не потрібно оновлювати попередній рядок, лише поточний.

    Після цього знайдіть набір усіх ідентифікаторів у попередньому рядку, які не підключаються до наступного рядка, відкинувши дублікати . Додайте розмір цього набору до вашого запущеного лічильника островів.

    Тепер ви можете відкинути попередній рядок і призначити поточний рядок попередньому рядку та рухатися далі.

  3. Щоб правильно обробити останній рядок, зробіть вигляд, що внизу є ще один ряд нулів Х і знову запустіть крок 2.


6

Orlp дає рішення, використовуючи О(н) слова простір, які є О(нжурналн) біт простору (якщо вважати, що це простота н=м). І навпаки, це легко показатиΩ(n) біти місця потрібні, зменшуючи встановлену непересічність вашої проблеми.

Припустимо, що Аліса містить бінарний вектор x1,,xn а Боб утримує двійковий вектор y1,,yn, і вони хочуть знати, чи існує індекс i такий як хi=уi=1. Вони виконують ваш алгоритм для2×(2н-1) матриця, рядки якої є х1,0,х2,0,,0,хн і у1,0,у2,0,,0,ун. Після того, як перший рядок буде прочитаний, Аліса надсилає Бобаiхi а також вміст пам'яті, щоб Боб міг скласти алгоритм та порівняти i(хi+уi)до кількості підключених компонентів. Якщо два числа збігаються, два вектори роз'єднані (немає індексуi), і навпаки. Оскільки потрібен будь-який протокол для встановленої непересічностіΩ(н) біт (навіть якщо це може помилитися з невеликою постійною ймовірністю), ми виводимо an Ω(н) нижня межа, яка справедлива навіть для рандомізованих протоколів, яким дозволено помилятися з невеликою постійною ймовірністю.

Ми можемо покращити рішення Orlp, використовуючи некросинг-розділи . Читаємо матрицю рядок. Для кожного ряду ми пам’ятаємо, які зразки пов’язані через шляхи, що проходять через попередні рядки. Відповідний розділ не є схрещувальним, і тому його можна кодувати за допомогоюО(н)біти (оскільки непересічні розділи обчислюються каталонськими числами, швидкість зростання яких є швидше експоненціальною, ніж факторною). Читаючи наступний рядок, ми підтримуємо це зображення, і збільшуємо лічильник, коли всі кінці частини не з'єднані з поточним рядком (лічильник займає додатковийО(журналн)біт). Як і в рішення Орлпа, ми додаємо остаточний макетний ряд нулів, щоб закінчити обробку матриці. Це рішення використовуєО(н) біт, що є асимптотично оптимальним, враховуючи нижню межу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.