Biorąc pod uwagę Macierz boolowska , pozwolić pozycje reprezentują morze i wpisy reprezentują ziemię. Zdefiniuj wyspę jako sąsiadującą pionowo lub poziomo (ale nie po przekątnej) wpisy.
Pierwotne pytanie polegało na zliczeniu liczby wysp w danej matrycy. Autor opisał rozwiązanie rekurencyjne ( pamięć).
Ale bezskutecznie próbowałem znaleźć rozwiązanie strumieniowe (od lewej do prawej, a następnie do następnego rzędu), które dynamicznie liczy wyspy z lub lub pamięć (nie ma ograniczeń złożoności czasowej). Czy to jest możliwe? Jeśli nie, jak mogę to udowodnić?
Kilka przykładów oczekiwanych wyników dla niektórych danych wejściowych dla count
funkcji:
Odpowiedzi:
Oto szkic algorytmu, który zachowuje tylko dwa wiersze w pamięci, więcO(m) pamięć. Ale ponieważ można uruchomić ten algorytm przy transpozycji macierzy bez problemów, faktyczna złożoność jest takaO(min(m,n)) pamięć. Czas przetwarzania wynosi .O(mn)
Inicjalizacja Zeskanuj pierwszy wiersz i znajdź wszystkie połączone podciągi tego wiersza. Przypisz każdemu rozłącznemu podciągowi unikalny identyfikator dodatni i zapisz go jako wektor o wartości zero, gdzie wynosi zero, a w przeciwnym razie unikalny identyfikator dodatni.X
Do każdego pozostałego wiersza przypisz unikalne identyfikatory (nigdy nie przypisuj ponownie poprzednich unikalnych identyfikatorów, upewnij się, że twoje identyfikatory ściśle się zwiększają) do podciągów w tym wierszu. Wyświetl poprzedni wiersz plus bieżący wiersz jako macierz na , a wszelkie połączone obszary należy przypisać do ich minimum. Jako przykład:2 m
Nie ma potrzeby aktualizowania poprzedniego wiersza dla poprawności tego algorytmu, tylko bieżący.
Po zakończeniu znajdź zestaw wszystkich identyfikatorów w poprzednim wierszu, które nie łączą się z następnym wierszem, odrzucając duplikaty . Dodaj rozmiar tego zestawu do licznika wysp.
Możesz teraz odrzucić poprzedni wiersz i przypisać bieżący wiersz do poprzedniego i przejść dalej.
Aby poprawnie obsłużyć ostatni wiersz udawać, na dole znajduje się kolejny rząd zer i ponownie uruchom krok 2.X
źródło
Orlp daje rozwiązanie używając słów spacji, które są bitami przestrzeni (zakładając dla uproszczenia, że ). I odwrotnie, łatwo jest wykazać, że bitów przestrzeni jest potrzebne, zmniejszając rozłączenie zestawu dla twojego problemu.O(n) O(nlogn) n=m Ω(n)
Załóżmy, że Alicja ma wektor binarny a Bob ma wektor binarny i chcą wiedzieć, czy istnieje indeks taki, że . Prowadzą algorytmu dla matrycę, której rzędy są i . Po odczytaniu pierwszego wiersza Alicja wysyła Bob oraz zawartość pamięci, aby Bob mógł ukończyć algorytm i porównać z liczbą połączonych komponentów. Jeśli dwie liczby pasują do siebie, dwa wektory są rozłączne (nie ma indeksux1,…,xn y1,…,yn i xi=yi=1 2×(2n−1) x1,0,x2,0,…,0,xn y1,0,y2,0,…,0,yn ∑ixi ∑i(xi+yi) i ), i wzajemnie. Ponieważ jakikolwiek protokół dla rozłączenia wymaga bitów (nawet jeśli może on błądzić z małym stałym prawdopodobieństwem), dedukujemy dolną granicę , która obowiązuje nawet dla losowych protokołów, które mogą błądzić z niektórymi małe stałe prawdopodobieństwo.Ω(n) Ω(n)
Możemy ulepszyć rozwiązanie Orlp, używając partycji nieprzekraczających . Matryca czytamy wiersz po rzędzie. Dla każdego wiersza pamiętamy, które 1s są połączone ścieżkami przechodzącymi przez poprzednie rzędy. Odpowiednia partycja nie jest krzyżująca, a zatem może być kodowana przy użyciu bitów (ponieważ partycje nie krzyżujące są liczone przez liczby katalońskie, których tempo wzrostu jest bardziej wykładnicze niż silni). Podczas czytania następującego wiersza utrzymujemy to reprezentowanie i zwiększamy licznik, ilekroć wszystkie końce części nie są podłączone do bieżącego wiersza (licznik przyjmuje dodatkowe bity ). Podobnie jak w rozwiązaniu Orlp, dodajemy ostatni zerowy rząd zer, aby zakończyć przetwarzanie matrycy. To rozwiązanie wykorzystujeO(n) O(logn) O(n) bitów, co jest asymptotycznie optymalne, biorąc pod uwagę naszą dolną granicę.
źródło