Đếm các đảo trong ma trận Boolean


9

Cho ma trận Boolean X , hãy để 0 mục đại diện cho biển và 1 mục đại diện cho đất liền. Xác định một hòn đảo theo chiều dọc hoặc chiều ngang (nhưng không theo đường chéo) liền kề 1 mục.n×mX011

Câu hỏi ban đầu là đếm số lượng đảo trong một ma trận nhất định. Tác giả đã mô tả một giải pháp đệ quy ( bộ nhớ Ôi(nm) ).

Nhưng tôi đã không thành công khi cố gắng tìm một giải pháp phát trực tuyến (từ trái sang phải, rồi xuống hàng tiếp theo) tự động đếm các đảo có bộ nhớ Ôi(m) hoặc Ôi(n) hoặc Ôi(n+m) (không có giới hạn cho sự phức tạp thời gian). Điều đó có thể không? Nếu không, làm thế nào tôi có thể chứng minh nó?


Một vài ví dụ về đầu ra dự kiến ​​cho các đầu vào nhất định cho counthàm:

cobạnnt(010111010)= =1;cobạnnt(101010101)= =5;cobạnnt(111101111)= =1;

cobạnnt(1111100100010110100011011111)= =2

cobạnnt(101111)= =1


1
1. "Trực giao" nghĩa là gì? Bạn có nghĩa là một thành phần kết nối? 2. Chúng ta có thể giả định gì về cách ma trận được lưu trữ? Chúng ta có thể giả sử nó được lưu trữ trên bộ nhớ ngoài (ví dụ: đĩa cứng chậm), vì vậy bạn có thể đọc bất kỳ phần nào bạn muốn, nhưng sẽ nhanh hơn khi đọc nó một khối? Hay chúng ta nhận được ma trận theo kiểu truyền phát, khi mà chúng ta đã nhận được một chút ma trận đầu vào, chúng ta không bao giờ có thể thấy bit đầu vào đó nữa?
DW

1
Hay quá cảm ơn. Tôi khuyến khích bạn chỉnh sửa câu hỏi để làm rõ những điểm đó. Nếu nó phát trực tuyến, các bit của ma trận đến theo thứ tự nào? Quét từ trái sang phải giữa một hàng, sau đó xuống hàng tiếp theo?
DW

1
Vui lòng chỉnh sửa câu hỏi để bao gồm tất cả các chi tiết. Bình luận là phù du.
Yuval Filmus

2
Không phải tất cả các thông tin được đưa ra trong các ý kiến ​​có thể được tìm thấy trong chính bài viết. Một số thông tin này khá quan trọng, như mô hình phát trực tuyến của bạn. Nhận xét có thể biến mất, và do đó (và do các tiêu chuẩn cộng đồng), tất cả các chi tiết cần thiết sẽ tạo thành một phần của bài đăng chính.
Yuval Filmus

1
Độ phức tạp thời gian cần thiết là gì?
hengxin

Câu trả lời:


4

Đây là bản phác thảo thuật toán chỉ giữ hai hàng trong bộ nhớ tại một thời điểm, vì vậy bộ nhớ . Nhưng vì bạn có thể chạy thuật toán này trên chuyển vị của ma trận mà không gặp vấn đề gì, nên độ phức tạp thực tế là bộ nhớ O ( min ( m , n ) ) . Thời gian xử lý là OÔi(m)Ôi(tối thiểu(m,n)) .Ôi(mn)

  1. Khởi tạo. Quét qua hàng đầu tiên và tìm tất cả các chuỗi con được kết nối của hàng đó. Chỉ định mỗi chuỗi con tách rời một id dương duy nhất và lưu nó dưới dạng một vectơ bằng 0 trong đó bằng 0 và id dương duy nhất khác.X

  2. Đối với mỗi hàng còn lại gán các id duy nhất (không bao giờ gán lại các id duy nhất trước đó, hãy đảm bảo rằng id của bạn đang tăng nghiêm ngặt) cho các chuỗi con trong hàng đó một lần nữa. Xem hàng trước cộng với hàng hiện tại dưới dạng ma trận x m và bất kỳ khu vực được kết nối nào cũng phải được chỉ định ở mức tối thiểu. Ví dụ:2m

    010402220333300506607080009990010402220333300504402020003330

    Không cần cập nhật hàng trước cho tính chính xác của thuật toán này, chỉ có hiện tại.

    Sau khi xong, tìm tập hợp tất cả các id ở hàng trước không kết nối với hàng tiếp theo, loại bỏ các bản sao . Thêm kích thước của bộ này vào bộ đếm đảo đang chạy của bạn.

    Bây giờ bạn có thể loại bỏ hàng trước và gán hàng hiện tại cho hàng trước và tiếp tục.

  3. X


6

Ôi(n)Ôi(nđăng nhậpn)n= =mΩ(n)

x1,Giáo dục,xny1,Giáo dục,ynTôixTôi= =yTôi= =12×(2n-1)x1,0,x2,0,Giáo dục,0,xn . Sau hàng đầu tiên được đọc, Alice gửi Bob Σ i xy1,0,y2,0,Giáo dục,0,ynΣTôixTôiΣTôi(xTôi+yTôi)TôiΩ(n)Ω(n) thấp hơn bị ràng buộc, nắm giữ ngay cả đối với các giao thức ngẫu nhiên được phép err với một số khả năng liên tục nhỏ.

Ôi(n)Ôi(đăng nhậpn)Ôi(n)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.