Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 插入有序数组的计算效率最高的方法?_Javascript_Jquery_Arrays_Performance - Fatal编程技术网

Javascript 插入有序数组的计算效率最高的方法?

Javascript 插入有序数组的计算效率最高的方法?,javascript,jquery,arrays,performance,Javascript,Jquery,Arrays,Performance,我有一个包含时间序列数据的数组,如下所示: var timeseries = [ [Tue Dec 31 2013 00:00:00 GMT+0000 (GMT Standard Time), 3, 2], [Tue Dec 31 2013 01:00:00 GMT+0000 (GMT Standard Time), 1.2, 3], [Tue Dec 31 2013 02:00:00 GMT+0000 (GMT Standard Time), 4, 2] ] 嵌套数组

我有一个包含时间序列数据的数组,如下所示:

var timeseries = [
    [Tue Dec 31 2013 00:00:00 GMT+0000 (GMT Standard Time), 3, 2],
    [Tue Dec 31 2013 01:00:00 GMT+0000 (GMT Standard Time), 1.2, 3],
    [Tue Dec 31 2013 02:00:00 GMT+0000 (GMT Standard Time), 4, 2]
]
嵌套数组中的第一项是javascript日期

我还有第二个数组,其中包含唯一javascript日期的列表,但在timeseries数组中可能存在,也可能不存在:

对于newTimes数组中的每个项,我需要检查该日期是否存在于与timeseries数组一起存储的数组中。如果没有,我想在timeseries数组中插入一个正确位置(按时间顺序)的新数组,关键是从前面的数组复制其他数组值。例如,如上所述组合上述两个阵列将:

var newTimeseries = [
    [Tue Dec 31 2013 00:00:00 GMT+0000 (GMT Standard Time), 3, 2],
    [Tue Dec 31 2013 00:13:00 GMT+0000 (GMT Standard Time), 3, 2],
    [Tue Dec 31 2013 01:00:00 GMT+0000 (GMT Standard Time), 1.2, 3],
    [Tue Dec 31 2013 01:40:00 GMT+0000 (GMT Standard Time), 1.2, 3],
    [Tue Dec 31 2013 02:00:00 GMT+0000 (GMT Standard Time), 4, 2]
]
我应该注意到两个数组都已排序。此外,新时间中的项目将存在于时间序列的范围内。最后,原始的timeseries数组每小时在小时上有一个条目


我尝试过几种不同的方法,但我对计算效率最高的方法感兴趣。如果有用的话,我很乐意使用任何适当的、被广泛采用的第三方库,如underline.js

考虑了二进制搜索(techfoobar在评论中建议)和冒泡排序(friendzis),我迄今为止提出的最佳解决方案就是遵循这个逻辑

与使用二进制搜索相反,请考虑以下内容: 因为我们知道两个数组都已排序;

newTimes
内的日期在
timeseries
日期范围内;而且初始的
timeseries
条目以小时为单位,每小时,我们可以找到timeseries[0][0]date和newTimes[0]之间的差异,以小时为单位。这是启动冒泡排序方法所需的初始偏移量(更像上面评论中讨论的标准循环和切片)。这将使用
Moment.js

代码如下,请随时提出修改建议:

var firstEvent = moment(newTimes[0]);
var firstTime = moment(timeseries[0][0]) ;
var offset = firstEvent.diff(firstTime, 'hours') - 1; 


for (var i = offset; i < timeseries.length;i++) { 
    while (newTimes.length > 0 && typeof moment(timeseries[i+1]) !== "undefined" && moment(newTimes[0])  > moment(timeseries[i][0]) && moment(newTimes[0])  < moment(timeseries[i+1][0])) {
        var newElement = timeseries[i].slice(0);
        newElement[0] = moment(newTimes[0]).toDate();
        timeseries.splice(i+1, 0, newElement);
        newTimes.splice(0,1);
        i++;
    } 
}

我想到了一个链表……嗯,链表将为插入提供
O(1)
复杂性,为搜索提供
O(n)
。我想你会发现“最有效”取决于你被击中/未击中的频率。根据列表的大小,你可能会插入所有内容,然后横穿列表一次,以复制额外的数据或删除双重条目。在这里进行头脑风暴:)在数组中存储unix时间戳而不是日期对象我想这将有助于加快速度(在查找要插入的正确位置时)。列表的大小将有所不同。通常的用例范围可能是150个条目,最多可达4000个
var firstEvent = moment(newTimes[0]);
var firstTime = moment(timeseries[0][0]) ;
var offset = firstEvent.diff(firstTime, 'hours') - 1; 


for (var i = offset; i < timeseries.length;i++) { 
    while (newTimes.length > 0 && typeof moment(timeseries[i+1]) !== "undefined" && moment(newTimes[0])  > moment(timeseries[i][0]) && moment(newTimes[0])  < moment(timeseries[i+1][0])) {
        var newElement = timeseries[i].slice(0);
        newElement[0] = moment(newTimes[0]).toDate();
        timeseries.splice(i+1, 0, newElement);
        newTimes.splice(0,1);
        i++;
    } 
}
var timeseries = [
    [Tue Dec 31 2013 00:00:00 GMT+0000 (GMT Standard Time), 3, 2],
    [Tue Dec 31 2013 01:00:00 GMT+0000 (GMT Standard Time), 1.2, 3]
]

var newTimes = [
    Tue Dec 31 2013 00:13:00 GMT+0000 (GMT Standard Time), 
    Tue Dec 31 2013 00:16:00 GMT+0000 (GMT Standard Time)
]