使用从数据库中提取的数据计算最短路径



所以我需要创建一个与我的Android通信的网络服务应用。在我的安卓应用程序中,客户端选择两点开始和到达这两个点将发送到我的网络服务找到巴士它们之间的路径最短。我的网络有问题服务端。

我尝试使用Dijkstra的算法来找到两者之间的最短路径两点。要测试 Dijkstra 算法,我必须从MySQL数据库,而不是将其直接放入我的算法中。我不知道不过我该怎么做。

在我的数据库中,我有两个包含公交路线(公交编号)的表,代码(工作站 ID)、pt_arret(站点名称)。还有一张桌子包含位置代码(ID 站)、纬度和经度,以及距离(是车站与车站之间的距离之前。

> 你必须创建一个结构,让你使用Dijkstra的算法。 为此,必须从数据库中读取所有相关数据。 从关系数据到面向对象的过渡总是很尴尬。

理想情况下,您希望对每个表使用单个简单的 SQL 选择来获取数据。 优化是棘手的。 单个 select 语句可以抓取一百万行,几乎与抓取一行的速度一样快;一个选择将比 10 个选择将获取 10 行快一百万行(根据我的经验)。 但是,如果您的数据库连接速度较慢(带宽较窄),则抓取太多不需要的行可能需要很长时间。

使用地图(树状图或哈希图)跟踪您阅读的内容,以便您可以找到已被读取并放置在结构中的"站"对象,并向其添加连接。

在内存中设置数据结构后,请尝试尽可能长时间地保留它,以限制重新读取数据库的延迟。

留意你的记忆和时间。 对于用户来说,您有运行速度太慢或内存不足的危险。 您需要注意性能(如今,这似乎不是常见的需求)。 我提出了一些建议,但我真的不知道您的硬件和数据会发生什么。 (例如,读取数据库可能没有我怀疑的那么慢。

希望这有帮助。 如果你以前没有做过这样的事情,你还有很多工作和学习要做。 我参与了这样一个主要程序(但它也写信给DB),我觉得我一直在上游游。

加法:

您希望内存中的是一组工作站(工作站类对象)和路由(路由类对象)。 每个站点都将拥有描述一个站点(包括位置)所需的所有数据。 至关重要的是,它还需要一个 ID。 站点应使用 ID 作为键进入树状图。 (这是我的偏见,很多人会使用HashMap。

每条路线都将包含对其链接的两个站点的引用、距离或行驶时间以及任何其他所需信息。

每个站点还将包含引用它的路线列表。 为了灵活性,我推荐一个LinkedList。 (在这种情况下,ArrayList 容易在未使用的数组元素上浪费大量空间。 您需要从数据库中读取车站,然后读取路线信息。 在阅读每个路线的信息时,创建 Route 对象,找到两个站点,将对这些站点的引用添加到路由,然后将路由添加到两个站点的路由列表中。

现在,对于每个车站,您可以找到离开它的所有路线,然后找到一次巴士旅行可以到达的所有车站。 从这些站点,您可以通过您的网络继续工作。 这个结构确实是一个"稀疏数组",如果你想这样想的话。

应用Dijkstra的算法 - 或任何其他算法 - 非常简单。 您需要在站点和路径(站点和路径类中的字段)上使用各种标志来跟踪已用于各种目的的节点(站点)和连接(路由)。 在一张纸上绘制地图(从一个小地图开始!)可能会有所帮助,以跟踪您的代码正在做什么。 我的经验是,完成所有这些操作只需要很少的代码,但需要仔细思考。

最新更新