计算“孔”的数量。在位图中
考虑一个 MxN 位图,其中单元格为 0 或 1。“1”表示已填充,“0”表示空。
查找位图中“孔”的数量,其中孔是空单元的连续区域。
例如,这个有两个洞:
11111
10101
10101
11111
...而这个只有一个:
11111
10001
10101
11111
当 M 和 N 都在 1 到 8 之间时,最快的方法是什么?
澄清:对角线不被认为是连续的,只有侧面相邻才重要。
注意:我正在寻找利用数据格式的东西。我知道如何将其转换为图表并 [BD]FS 它,但这似乎有点过分了。
Consider a MxN bitmap where the cells are 0 or 1. '1' means filled and '0' means empty.
Find the number of 'holes' in the bitmap, where a hole is a contiguous region of empty cells.
For example, this has two holes:
11111
10101
10101
11111
... and this has only one:
11111
10001
10101
11111
What is the fastest way, when M and N are both between 1 and 8?
Clarification: diagonals are not considered contiguous, only side-adjacency matters.
Note: I am looking for something that takes advantage of the data format. I know how to transform this into a graph and [BD]FS it but that seems overkill.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
您需要在图像上进行连接组件标记。您可以使用我上面链接的维基百科文章中描述的两遍算法。鉴于您的问题规模较小,单遍算法可能就足够了。
您还可以使用BFS/DFS 但我推荐上述算法。
You need to do connected component labeling on your image. You can use the Two-pass algorithm described in the Wikipedia article I linked above. Given the small size of your problem, the One-pass algorithm may suffice.
You could also use BFS/DFS but I'd recommend the above algorithms.
这似乎是对不相交集数据结构的一个很好的使用。
将位图转换为二维数组
循环遍历每个元素
如果当前元素是 0,则将其与其“前一个”空邻居(已访问过)的集合合并
如果它没有空邻居,则将其添加到自己的集合中
,然后只计算集合的数量
This seems like a nice use of the disjoint-set data structure.
Convert the bitmap to a 2d array
loop through each element
if the current element is a 0, merge it with the set of one its 'previous' empty neighbors (already visited)
if it has no empty neighbors, add it to its own set
then just count the number of sets
使用表查找和按位运算可能会带来一些优势。
例如,可以在256个元素表中查找整行8像素,因此通过单次查找获得字段1xN中的孔数。然后可能有一些256xK个元素的查找表,其中K是上一行中的孔配置的数量,包含完整孔的数量和下一个孔配置的数量。这只是一个想法。
There may be advantages gained by using table lookups and bitwise operations.
For example whole line of 8 pixels may be looked up in 256 element table, so number of holes in a field 1xN is got by single lookup. Then there may be some lookup table of 256xK elements, where K is number of hole configurations in previous line, contatining number of complete holes and next hole configuration. That's just an idea.
我在 Medium 上写了一篇文章描述答案https: //medium.com/@ahmed.wael888/bitmap-holes-count-using-typescript-javascript-387b51dd754a
但这里是代码,逻辑并不复杂,不用看文章也能理解。
main.ts 文件
I wrote an article describe the answer on Medium https://medium.com/@ahmed.wael888/bitmap-holes-count-using-typescript-javascript-387b51dd754a
but here is the code, the logic isn't complicated and you can understand it without reading the article.
main.ts file