用于计算距离的修剪集合

时间:2015-07-12 02:39:30

标签: java algorithm

我有数据收集,其中每条记录都有关于此记录的车辆速度和时间的信息。每条记录之间的时差是不同的,大约是300毫秒。我使用这个集合来计算行进距离。我想修剪这个集合而不会太多损失计算的准确性。它有什么算法吗?

我尝试编写简单的算法,如果记录与之前的记录没有差异至少X%,则删除记录。该算法效果不佳。例如,当我使用3%和4%修剪的算法时,记录数量相同,但计算距离在500米距离上相差40米,其中4%更准确。

编辑:本杰明算法的变化:

我有时间收集记录,所以我需要3条记录。

double timeDifference = (next.time - curr.time) / (curr.time - previous.time); previuos.value = (previous.value + curr.value * timeDifference) / 2

此外,我不希望结果是双倍但很长,所以我需要使用可以改变距离的舍入。另外一分钟是大约300条记录,所以我希望舍入不会对计算产生如此大的影响。

2 个答案:

答案 0 :(得分:2)

您有一个价值对列表,即:

    time | speed
1:  0    | 0
2:  300  | 10
3:  600  | 40
4:  900  | 48
5:  1200 | 50
6:  1500 | 30
7:  1800 | 0

您始终需要查看两个值ii-1。我们从i=1开始,因为我们会访问索引-1

for(int i=1; i<list.size(); i++) {
  if(Math.abs(list.get(i).speed - list.get(i-1).speed) < 3) {
    list.get(i-1).time = (list.get(i).time + list.get(i-1).time) / 2;
    list.get(i-1).speed = (list.get(i).speed + list.get(i-1).speed) / 2;
    list.remove(i);
  }
}

单词:如果ii-1之间的速度差异小于3,则更新条目i-1并将其时间和速度设置为平均值ii-1。之后,我们会从列表中删除项目i

示例数据会发生什么:此代码会从示例数据中删除条目5:,因为abs(50-48) = 22 < 3,并设置条目{{1 {}}到4:time = 1150

上面的示例当然有至少两个问题(很容易修复 - 例如你的作业): 1. 如果列表只有一个条目,代码将抛出异常。 2。删除项目后,speed = 49会发生更改,但上面的代码无法识别。这意味着:删除任何条目后,它将抛出异常。

我还没有测试过,只是为了告诉你如何清理列表。

您还可以添加一些代码,以防止从列表中删除最后一个条目,因为否则您可能没有确切的最后时间值。也可以在相同的数据上多次运行,直到list.size()保持不变。

(看看下面的评论)

答案 1 :(得分:0)

如果您不需要保留任何历史记录,则可以在检索新数据时更新行进距离。我不知道你是怎么做微积分的,我写的是我能想到的第一个例子。

Measurement record = null;
double distance = 0;
long totalTime = 0;

// New record handler
public void recordListener(Measurement newRecord) {
    if(record != null) {
        double avgSpeed = (record.speed + newRecord.speed) / 2.0;
        long timeDelta = newRecord.time - record.time;
        distance += avgSpeed * (timeDelta / 1000)   // millis to seconds
        totalTime += timeDelta;
    }
    record = newRecord;
}