首页 > 解决方案 > 搜索两圆交叉区域的共同对象

问题描述

我正在解决一个可以用一系列要点描述的任务:

  1. 两种用户类型:Fighter, Arena.

  2. 每个Fighter人都可以在注册过程中自由设置他们的地理位置和首选搜索半径(稍后他们可以在他们的设置中更改这些值)。搜索半径,正如它的名称一样,是用户可以搜索潜在对手的半径。

  3. 每个Arena对象都有其可用的地理位置和时间段。

  4. 两个战士匹配如果:他们的搜索圈相交并且相交区域包含至少一个Arena

  5. ArenaFighter如果它位于其搜索范围内,则可供 a使用。

我正在实现匹配逻辑。所以需要实现匹配算法。我正在努力找出正确的方法。

据我所知,一切都可以归结为寻找 common Arenas。换句话说,可能有许多表会提供关于Arena每个 s 可用的信息Fighter。也就是说,比如一个Fighterid98的用户有Arenas有34、57、22 ids,另一个有id17的用户有Arenas有ids156、57。

userId = 98; available_arenas = [34, 57, 22];
userId = 17; available_arenas = [156, 57];

通过比较idsavailable Arenas 我们可以看到他们有一个Arena共同点,它id是 57。所以我假设基于这个事实,可以肯定地说他们的搜索圈相交并且有一个Arena可能发生战斗事件的地方地方。

我认为这种方法可以用来确定Fighters 是否匹配。我想,但我不能说基于这个想法的搜索是否有效,我认为它存在以下困难:每个/Arena都应该支持所有这些列表。所以,如果说,一些新的被添加到数据库中,形象地说,所有这些列表必须立即更新......这也可能是一个非常耗时的操作。如果注册了新用户,则必须计算其个人可用 s 列表。如果一个已经存在的改变它的地理位置,它们的 s 也必须重新计算等等。FighterArenaArenaFighteravailable_arenasFighterArenaFighterArena

另一种方法可能是做同样的事情,但不将那些Arenas存储ids在数据库中。给定 a和a 的(long, lat, r)参数,即时进行所有计算。Fighter(long, lat)Arena

我确信那里有一些更好的方法。我想听听您对我的看法,如果您知道更好的方法,我也想知道。

我将PostgreSQL13 用于 DBMS。

标签: postgresqlalgorithmsearch

解决方案


我认为没有多少解决方案,只要这种战斗机竞技场结构。您可以尝试将您的竞技场位置(按区域、锚点位置或类似位置)分组,看看是否可以减少搜索的权重。另一个想法可能是存储available-fighters每个竞技场的列表。每次战斗机旅行时,它都会检查新的竞技场,对于那些不再可用的竞技场,它可以向他们发送一条消息以从列表中删除。那么这个竞技场中所有可能的战斗都是它的所有可能的组合available-fighters


推荐阅读