2010-10-26 37 views
10

Xem xét bitmap MxN trong đó các ô là 0 hoặc 1. '1' có nghĩa là đã điền và '0' có nghĩa là trống.Đếm số "lỗ hổng" trong bitmap

Tìm số lượng lỗ '' trong bitmap, trong đó lỗ là vùng tiếp giáp của ô trống.

Ví dụ, điều này có hai lỗ:

11111 
10101 
10101 
11111 

... và điều này chỉ có một:

11111 
10001 
10101 
11111 

gì là cách nhanh nhất, khi M và N đều giữa 1 và số 8?

Làm rõ: đường chéo không được coi là tiếp giáp, chỉ các vấn đề phụ kề nhau.

Lưu ý: Tôi đang tìm kiếm thứ gì đó tận dụng được định dạng dữ liệu. Tôi biết làm thế nào để biến đổi điều này thành một đồ thị và [BD] FS nó nhưng điều đó có vẻ quá mức cần thiết.

+0

Tại sao mùi của bài tập về nhà hoặc chơi gôn mã này? @ Florin, cảm ơn vì đã cập nhật. Xin vui lòng xem xét nhận xét này "hủy bỏ". Chúng tôi sẽ lấy từ của bạn. – jcolebrand

+0

TASTES giống như bài tập về nhà! – Luiscencio

+1

Nó không phải là bài tập về nhà, nhưng nó không quan trọng. Tôi đang cố gắng giải quyết một vấn đề lớn hơn và đây chỉ là một vấn đề nhỏ. – florin

Trả lời

17

Bạn cần làm connected component labeling trên hình ảnh của mình. Bạn có thể sử dụng số Two-pass algorithm được mô tả trong bài viết Wikipedia tôi đã liên kết ở trên. Với kích thước nhỏ của vấn đề của bạn, One-pass algorithm có thể đủ.

Bạn cũng có thể sử dụng BFS/DFS nhưng tôi khuyên bạn nên sử dụng các thuật toán trên.

+1

Có, ghi nhãn thành phần được kết nối sẽ thực hiện thủ thuật. Ngoài ra, congrats đến 10k, @Jacob (hoặc gần như - tôi đoán bạn đã nhấn rep-cap cho ngày hôm nay). – Jonas

+0

@ Jonas: Tôi biết! Hy vọng rằng hoa sẽ chấp nhận câu trả lời này ngày hôm nay :) – Jacob

+0

@ Jason: Tôi có thể thừa nhận các congrats ngay bây giờ: D – Jacob

5

Điều này có vẻ như là sử dụng tốt đẹp cấu trúc dữ liệu được phân tách.
Chuyển đổi bitmap vào một mảng 2ngày
lặp qua mỗi phần tử
nếu các yếu tố hiện tại là 0, kết hợp nó với các thiết lập của một trong các nước láng giềng 'trước' rỗng (đã truy cập)
nếu nó không có hàng xóm rỗng , thêm nó vào thiết lập riêng của nó

sau đó chỉ cần đếm số lượng các bộ

+0

~ đó là chính xác những gì @ Jacob đã được liên kết đến. – jcolebrand

+0

Tôi đã viết câu trả lời này trước khi nhìn vào. –

0

có thể có lợi thế đạt được bằng cách sử dụng tra cứu bảng và các hoạt động trên bit.

Ví dụ: toàn bộ dòng 8 pixel có thể được tra cứu trong bảng phần tử 256, do đó số lỗ trong trường 1xN được nhận bằng tra cứu đơn lẻ. Sau đó, có thể có một số bảng tra cứu các phần tử 256xK, trong đó K là số cấu hình lỗ trong dòng trước đó, số lượng lỗ hoàn chỉnh và số lỗ tiếp theo. Đó chỉ là một ý tưởng.

+0

Tôi chỉ mới bắt đầu xây dựng bảng tra cứu 2^64 của mình, nhưng tôi đã hết ngân sách cho năm cho RAM 8 ^) – florin

+0

florin: Sử dụng tính toán phân tán! =) – Vovanium

+0

Tôi thấy câu đố này rất thú vị và tôi đã dành thời gian rảnh để vẽ phác thảo thuật toán 'theo dòng' với tra cứu và hoạt động bitwise, chỉ sử dụng 560 byte bảng (cho mẫu rộng 8 bit). Đây là mã: http://dl.dropbox.com/u/13343791/holecount2.c Xin lỗi nếu mã không được ghi lại tài liệu. – Vovanium

Các vấn đề liên quan