0

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

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

在我的数据库中,我有两个表,其中包含巴士路线(巴士编号)、代码(车站 ID)、pt_arret(车站名称)。还有另一个表,其中包含位置代码(id 站)、纬度和经度以及距离(是一个站与之前的站之间的距离。

4

1 回答 1

0

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

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

使用 Maps(TreeMap 或 HashMap)来跟踪您阅读的内容,因此您可以找到已经阅读并放置在您的结构中的“站”对象,并为它们添加连接。

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

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

希望这可以帮助。如果您以前没有做过这样的事情,那么您有很多工作和学习要做。我参与了这样一个主要程序(但它也写到了数据库中),我感觉自己一直在逆流而上。

添加:

您在内存中想要的是一组车站(Station 类对象)和路线(Route 类对象)。每个站点都将拥有描述一个站点所需的所有数据,包括位置。至关重要的是,它还需要一个 ID。站应该使用 ID 作为键进入 TreeMap。(这是我的偏见,很多人会使用 HashMap。)

每条路线都将引用它连接的两个车站、距离或旅行时间以及任何其他需要的信息。

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

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

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

于 2012-05-24T17:24:31.693 回答