-1

我有一个树算法和数据库问题,我想得到答案。

我有几个区域,比如说 20 个。每个区域都有子区域 ~ 20 个。这些父区域分布在地图上其中一些父区域彼此靠近。

数据库如下所示:[area_id, title, parent_id] - 有些有多个子节点,有一个包含所有区域的根节点。(邻接表模型)

为了在图片中制作这个,我可以这样做:基本树视图

正如我所说,不同的区域可以彼此靠近(或远离)。我想以某种方式将1 区和 5 区联系在一起,因为我知道它们很近,并且1 区也靠近 4 区​​。现在,问题来了,假设4 区也靠近 5 区.

它看起来像这样:问题树

这使它成为一个无限循环?因为我希望Area 1靠近Area 4,而且Area 4也靠近Area 1。

我想做一个搜索,在这里你可以选择“搜索附近区域”,所以你选择一个区域然后你可以搜索附近的区域。我可以使用一些技巧,关于如何使用数据库和 php 解决这个问题。

我一直在这个论坛上寻找帮助,但我真的不知道这个问题的“名称”,如果有人能指出我正确的方向或直接在这个线程中帮助我,我会很高兴。

谢谢大家,如果还有什么需要知道的,我会尽快回复。

4

3 回答 3

1

For anything that is dealing with proximity, I would certainly take an approach of putting in either geospatial information (if these are true areas/regions) and then applying a radial search which can be done via any number of simple through to complex queries and calculations.

If these places are on the other hand fictional, it might be interesting to consider making a fake location - even if it a simple x,y coordinate system. This will allow you to perform radial searches again - which you can enlarge or shrink to your needs - or even simply order the results in ascending distance from site a to b.

于 2013-08-28T06:07:57.033 回答
1

要细分一个区域,您需要一个可以沿轴拆分的矩形。查看 kd-tree、r-tree 或四叉树和空间索引。我可以向您推荐我的 php 类希尔伯特曲线。这是一条怪物曲线,完全填满了平面。您可以在 phpclasses.org 上找到它。

于 2013-08-28T06:15:20.933 回答
-1

我终于使用一种“相邻”选择语句解决了它。

我通过创建另一个包含邻居关系的表来做到这一点。该表看起来像:[table_id,area_id,neighbor_area_id]

在这里,我添加了所有可用的邻居,通过一些 INNER JOIN 和选择语句,我设法得到了我想要的东西,因此可以对所选区域附近的所有区域进行搜索。

sql 语句如下所示:

SELECT adds.title, categories.title, area.title
FROM adds
INNER JOIN categories ON categories.category_id = adds.category_id
INNER JOIN areas ON adds.area_id = areas.area_id
WHERE areas.area_id IN (SELECT area_neighbors.area_neighbor_id 
                        FROM area_neighbors 
                        WHERE area_id='25')
OR adds.area_id='25'

这将使我在 area_id 25 的相邻区域中添加所有内容。

我不能说这是否是最聪明或最好的解决方案,但它对我有用。希望这对某人有帮助!并感谢所有回复!

于 2013-08-28T10:06:12.390 回答