在我的情况下,我必须处理大量数据,这些数据包含每个日期的相应数字的日期。这些日期之间的间隔不是静态的,这意味着某些日期相隔几秒而其他日期相隔几天。此数据具有以下格式:(以PHP数组转储格式给出)
Array[2000] {
Array[2] {
Date: 2014-7-7 7:07:07
Data: 29.2934
}
Array[2] {
Date: 2014-7-7 7:08:13
Data: 30.10203
}
Array[2] {
Date: 2014-7-9 3:24:43
Data: 30.10203
}
...
}
我需要在两个日期之间找到最大的数据增长,这些日期属于某个时间限制,例如一天,一周等。我一直在使用这个PHP代码来实现这一目标:
for ($i=0; $i<$numrows-1; $i++) {
for($o=1; $o<($numrows-1)-$i; $o++) {
if((strtotime($dataArray[$i+$o]['Date'])-strtotime($dataArray[$i]['Date']))<86400) { //86400 for constraint of one day
$diffs[$i]['date'] = strtotime($dataArray[$i+$o]['Date']);
$diffs[$i]['data'] = $dataArray[$i+$o]['data']-$dataArray[$i]['Data'];
}
}
}
这将返回一个数组,其中包含数据数组中每个元素的边界内的最大结束日期以及它们之间的数字差异。然后,我可以搜索diffs数组的最大数据元素,以确定数据在哪一天增加最多。这很好用,但不幸的是,它涉及将我的服务器的CPU置于100%超过20秒的某些数据集并导致它在此期间对其他请求没有响应。
我想弄清楚的是如何以更有效的方式做到这一点;我做了一些研究,我认为这是在O(n ^ 2)时间,但我似乎找不到使用更有效算法的方法。有没有办法用更少的处理时间和系统资源来实现同样的目标?
答案 0 :(得分:0)
使用数据库可以更容易实现。总之...
我添加一个索引(这是一个保留对原始数据的引用的附加数组),按delta日期和 delta数据排序。
Array[2000] {
Array[2] {
DeltaDate: 10
DeltaData: 1.234
Row: ???
}
Array[2] {
DeltaDate: 66
DeltaData: 0.80863
Row: 1
}
Array[2] {
Date: 160000
Data: 0
Row: 2
}
Array[2] {
Date: 160000
Data: 1
Row: ???
}
Array[2] {
Date: 160000
Data: 234
Row: ???
}
...
}
之后,我将在该索引中查找满足时间约束的最高记录。鉴于索引是有序的,您可以使用二进制搜索(O = log N)。
在SQL数据库中,这将使用以下查询表示:
SELECT * FROM Array
WHERE DeltaDate <= time constraint
ORDER BY DeltaData DESC LIMIT 1