algorithm - 算法咨询:方格检查条件
问题描述
假设我有一张看起来像
x x x x
x x x x
x x x x
尺寸可能会发生变化,但请大致了解一下。
我很好奇是否有一种算法可以帮助我快速检查我正在查看的当前点是否是一个角/四个边之一上的点/正方形本身,以及帮助我检查该点周围的所有点我目前正在看。
我目前的方法就像编写一些辅助函数,分别检查当前坐标是否是角/四个边之一上的点/正方形本身?在每个辅助函数中,我使用几个循环来检查我当前正在查看的点周围的所有相邻点。但是我觉得这种方法非常无效,我相信一定有更高级的方法可以做到这一点,如果您以前遇到过这种问题,有人可以帮助我吗?
谢谢。
解决方案
很大程度上你是正确的,但应该不需要使用循环。您可以通过使用一些索引计算和直接访问一维数组来提高函数的效率。
想象一下,您的图像存储在一维数组 D 中。图像是size (m,n)
. 因此数组的大小为m x n
。每个数据点都有其 ID 作为数组 D 的索引。
要访问 ID = a 的邻居,请使用以下偏移量:
a-1, a+1
左右邻居
a-m, a+m
底部和顶部邻居
a-m+1, a-m-1, a+m+1, a+m-1
对角线邻居
每次偏移后,您需要检查以下内容:
数组 D 的邻居索引是否超出范围?
邻居索引是否环绕 x 边界,即断言
abs((neighbor_id % m)-(a%m)) <= 1
,否则neighbor_id
不是我的邻居。
当然,第二个测试假设您的图像足够大(也许m > 3
)。
推荐阅读
- laravel - 如何在 laravel 中获取最新的 n 条相关模型记录
- kubernetes - Eclipse Che7:与“wss://.../api/websocket”的 Websocket 连接失败
- python - 如何让我的 python 程序在新计算机上自动安装模块?
- azure - Azure App 服务连接到本地响应时间问题
- java - 绝对应该初始化的 TextView 的 NullPointerException
- javascript - 如何在表格顶部放置滚动条?
- angular - 安装角度通用时找不到模块'@schemics/angular/utility/json-file'
- sysadmin - 系统管理员将如何计算系统管理员日?
- git - gitlab克隆另一个版本的项目
- odata - 带有命名空间的 OData 操作(通过 VS2019 中的 OData 连接服务)