我有一个主数据数组,它总是由600秒的数据按时间升序排列。数据如下所示:
[{'timestamp' => '2016-10-10T10:00:00', 'p_value' => 55 },
{'timestamp' => '2016-10-10T10:00:01', 'p_value' => 57 },
{'timestamp' => '2016-10-10T10:00:02', 'p_value' => 51 },
{'timestamp' => '2016-10-10T10:00:03', 'p_value' => 54 },
{'timestamp' => '2016-10-10T10:00:04', 'p_value' => 48 }]
我有一个二级数组,最多有600秒的数据。这些数据是一个连续的“子集”。主数据数组的时间戳,但起始(和结束)时间戳值可能会有所不同:
[{'timestamp' => '2016-10-10T10:00:01', 's_value' => 1221 },
{'timestamp' => '2016-10-10T10:00:02', 's_value' => 4322 },
{'timestamp' => '2016-10-10T10:00:03', 's_value' => 2414 },]
我如何'对齐'通过时间戳将主数据库添加到辅助数组,然后添加' s_values'进入主数组,以最有效的计算方式?
我已经使用嵌套的foreach循环实现了非常类似的东西,但我认为这是O(N ^ 2)复杂度。
答案 0 :(得分:1)
假设第一个数组位于$firstArr
且第二个数组位于$secondArr
并且还假设
$secondArr[count($secondArr)-1]['timestamp] <= $firstArr[count($firstArr)-1]['timestamp'])
意味着第二个数组不包含第一个数组中可能不存在的时间戳,然后以下代码在线性时间内执行所需的合并(无O(n ^ 2))
首先在$secondArr
内查找$firstArr
的第一个时间戳,并将其索引保存在变量中。然后它从该索引开始复制p_values。
for($i=0; $i<count($firstArr); $i++)
{
if($firstArr[$i]['timestamp'] == $secondArr[0]['timestamp'])
{
$startingIndex = $i;
break;
}
}
for($i=0; $i<count($secondArr); $i++)
{
$firstArr[$startingIndex+$i]['s_value'] = $secondArr[$i]['s_value'];
}