在两个圆的交叉区域中搜索常见对象
Search for common objects in a two circle intersection area
我正在解决一个可以用一系列要点来描述的任务:
两种用户类型:Fighter
、Arena
。
每个 Fighter
都可以在注册过程中自由设置他们的地理位置和首选搜索半径(稍后他们可以在他们的设置中更改这些值)。搜索半径,顾名思义,就是用户可以搜索到潜在对手的半径。
每个 Arena
对象都有其地理位置和可用性时间段。
如果两个战士匹配:他们的搜索圈相交并且相交区域包含至少一个 Arena
.
如果 Arena
位于 Fighter
的搜索范围内,则 Arena
可用。
我正在执行匹配逻辑。因此需要实现匹配算法。我正在努力找出正确的方法。
据我所知,一切都可以简化为寻找共同的 Arena
。换句话说,可能有许多表会提供有关每个 Fighter
可用的 Arena
的信息。也就是说,例如 Fighter
和 id
98 有 Arena
s 和 ids
34, 57, 22,另一个 id
17 的用户有 Arena
s ids
156, 57.
userId = 98; available_arenas = [34, 57, 22];
userId = 17; available_arenas = [156, 57];
通过比较可用Arena
的ids
我们可以看到他们有一个Arena
是共同的,它的id
是57。所以我假设基于这一事实,可以肯定地说,他们的搜索圈相交,并且有一个 Arena
可能会发生战斗事件。
我认为这种方法可以用来判断 Fighter
是否匹配。我想,但我不能说基于这个想法的搜索是否有效,我看到它有以下困难:每个 Fighter
/ 都应该支持所有这些 Arena
列表Arena
。所以,如果,比方说,一些新的 Arena
被添加到数据库中,形象地说,所有那些 Fighter
的 available_arenas
列表必须立即更新......这也可能是一个非常耗时的操作。如果注册了新的 Fighter
,则必须计算他们可用的 Arena
的个人列表。如果一个已经存在的 Fighter
改变了它的地理位置,他们的 Arena
也必须重新计算等等。
另一种方法可能是做同样的事情,但不将那些 Arena
ids
存储在数据库中。给定 Fighter
的 (long, lat, r)
参数和 Arena
.
的 (long, lat)
参数,即时进行所有计算
我相信还有一些更好的方法。我想听听您对我的看法,如果您知道更好的方法,我也想知道。
我正在使用 PostgreSQL
13 作为 DBMS。
我认为没有太多的解决方案,提供这种战斗机竞技场结构。您可以尝试将您的竞技场位置分组(按地区、锚点位置或类似位置),看看是否可以减少搜索的权重。
另一个想法可能是为每个竞技场也存储一个 available-fighters
列表。每次战斗机旅行时,它都会检查新的竞技场,对于那些不再可用的竞技场,它可以向他们发送一条消息,将其从列表中删除。那么这个竞技场所有可能的战斗都是其available-fighters
中所有可能的组合
我正在解决一个可以用一系列要点来描述的任务:
两种用户类型:
Fighter
、Arena
。每个
Fighter
都可以在注册过程中自由设置他们的地理位置和首选搜索半径(稍后他们可以在他们的设置中更改这些值)。搜索半径,顾名思义,就是用户可以搜索到潜在对手的半径。每个
Arena
对象都有其地理位置和可用性时间段。如果两个战士匹配:他们的搜索圈相交并且相交区域包含至少一个
Arena
.
如果 Arena
位于Fighter
的搜索范围内,则Arena
可用。
我正在执行匹配逻辑。因此需要实现匹配算法。我正在努力找出正确的方法。
据我所知,一切都可以简化为寻找共同的 Arena
。换句话说,可能有许多表会提供有关每个 Fighter
可用的 Arena
的信息。也就是说,例如 Fighter
和 id
98 有 Arena
s 和 ids
34, 57, 22,另一个 id
17 的用户有 Arena
s ids
156, 57.
userId = 98; available_arenas = [34, 57, 22];
userId = 17; available_arenas = [156, 57];
通过比较可用Arena
的ids
我们可以看到他们有一个Arena
是共同的,它的id
是57。所以我假设基于这一事实,可以肯定地说,他们的搜索圈相交,并且有一个 Arena
可能会发生战斗事件。
我认为这种方法可以用来判断 Fighter
是否匹配。我想,但我不能说基于这个想法的搜索是否有效,我看到它有以下困难:每个 Fighter
/ 都应该支持所有这些 Arena
列表Arena
。所以,如果,比方说,一些新的 Arena
被添加到数据库中,形象地说,所有那些 Fighter
的 available_arenas
列表必须立即更新......这也可能是一个非常耗时的操作。如果注册了新的 Fighter
,则必须计算他们可用的 Arena
的个人列表。如果一个已经存在的 Fighter
改变了它的地理位置,他们的 Arena
也必须重新计算等等。
另一种方法可能是做同样的事情,但不将那些 Arena
ids
存储在数据库中。给定 Fighter
的 (long, lat, r)
参数和 Arena
.
(long, lat)
参数,即时进行所有计算
我相信还有一些更好的方法。我想听听您对我的看法,如果您知道更好的方法,我也想知道。
我正在使用 PostgreSQL
13 作为 DBMS。
我认为没有太多的解决方案,提供这种战斗机竞技场结构。您可以尝试将您的竞技场位置分组(按地区、锚点位置或类似位置),看看是否可以减少搜索的权重。
另一个想法可能是为每个竞技场也存储一个 available-fighters
列表。每次战斗机旅行时,它都会检查新的竞技场,对于那些不再可用的竞技场,它可以向他们发送一条消息,将其从列表中删除。那么这个竞技场所有可能的战斗都是其available-fighters