我的输入是一个gpx文件,其中包含一系列带时间戳的位置,就像您使用GPS进行运行并告诉它记录您的音轨时所获得的那样。
时间戳位置彼此之间的距离不一定相等,或者彼此之间的时间差相等。
鉴于此输入,我希望有效地找到gpx文件指示的所有不同距离的最高速度。
示例:
12:00:00 start
12:00:05 moved 100m
12:00:15 moved 100m
12:00:35 moved 200m
在这个例子中,正确的答案是:
20.0 m/s at 100m
13.3 m/s at 200m
11.4 m/s at 400m
什么是(优选合理有效地)计算这个算法的好算法?
澄清:我不是只关注最快的部分,这是微不足道的。我正在寻找轨道所代表的最快速度,总距离达到轨道长度。如果有人上传了他们跑马拉松的gpx轨道,我想知道他们在那场马拉松中跑的最快100米,最快200米,最快300米等等。
答案 0 :(得分:1)
让我们假设你有一个1500米跑的gpx赛道,你想要这样做。所以你想要最快的100,200,300,400,...... 1500米。有:
15 100-meter segments
14 200-meter segments
13 300-meter segments
12 400-meter segments
...
2 1,400-meter segments
1 1,500-meter segment
这可以达到15 + 14 + 13 + 12 + ... 2 + 1 =(15 ^ 2-15)/ 2,或105个不同的段来检查你是否想要计算15个不同的距离。
您可以在数组的单次传递中执行此操作。只需初始化一个数组,其中包含您感兴趣的每个距离的当前运行总速度和最大速度。当您阅读每个分段时,您减去最旧分段的值,添加新分段值,重新计算平均值速度,并在适当时更新最大速度。
该算法将要求您查看(n ^ 2-n)/ 2个别分割。无论您如何操作,都必须查看要计算的每个距离的每个可能的分割。您有n个数据点,并且您正在尝试确定n个不同的最佳分割时间。你切片的任何方式都是O(n ^ 2)。
但是你所谈论的数据量并不大,当然不是今天的标准。马拉松只有42,165米。如果您想要100米分辨率,则需要422个距离的阵列。并且您的代码将执行178,084次计算。这些天即使是低端计算机也是如此。
对于数据,我建议预处理.gpx文件以生成正好100米的数据点流。您可以单独执行此操作,也可以在计算拆分时将其作为读取数据的一部分。这并不困难,它可以使代码的其余部分更容易使用。