Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/402.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_Performance_Google Apps Script_Big O - Fatal编程技术网

Javascript 如何减少用于检查一个值数组是否位于另一个范围数组之间的循环数

Javascript 如何减少用于检查一个值数组是否位于另一个范围数组之间的循环数,javascript,performance,google-apps-script,big-o,Javascript,Performance,Google Apps Script,Big O,我试图检查一个时间是否在一系列的时间间隔内,我知道如何进行比较……但是我担心效率,因为我需要检查大量的时间条目(6000000),并且我使用的服务提供有限的处理时间 现在我有一个48个时间范围的数组,它是一个24小时的一天,分为30分钟的间隔。我使用6000k条目中的每一个循环遍历这个数组,以查看条目介于两者之间。所以我需要执行2880000个循环,每个循环有2个条件检查 这差不多是O(n*48) 在哪些方面可以加以改进?这是用JavaScript编写的 按要求编辑代码: 示例间隔: 开始:新

我试图检查一个时间是否在一系列的时间间隔内,我知道如何进行比较……但是我担心效率,因为我需要检查大量的时间条目(6000000),并且我使用的服务提供有限的处理时间

现在我有一个48个时间范围的数组,它是一个24小时的一天,分为30分钟的间隔。我使用6000k条目中的每一个循环遍历这个数组,以查看条目介于两者之间。所以我需要执行2880000个循环,每个循环有2个条件检查

这差不多是O(n*48)

在哪些方面可以加以改进?这是用JavaScript编写的

按要求编辑代码:

示例间隔:

  • 开始:
    新日期(0,0,0,1,30,0)
  • 结束:
    新日期(0,0,0,2,0,1)
示例时间:(我将时间字符串转换为日期,如第二个项目符号所示)

  • '2015-12-03 15:25:00'
  • 新日期(0,0,0,15,25,0)
循环示例:

for(var i = 0; i < myArray.length; i++)
{
    for(var ii = 0; ii < myIntervals.length; ii++)
    {
        if(myArray[i] >= myIntervals[ii].start && myArray[i] <= myIntervals[ii].end)
        {
            myIntervalCounts[ii] ++;
        }
    }
}
for(var i=0;i如果(myArray[i]>=MyInterval[ii].start&&myArray[i]根据对该问题的理解,您有6kk个条目,形式为“11:37 AM”、“10:00 PM”和48个30分钟的时间间隔,并且您为它们添加了一个标签(例如,11:37 AM位于第23个标签中,索引为0)

我认为在时间段内只需要一个循环条目:

function label_timestamp(hour,minute,period)
   return hour*2 + (period==="PM")*24 + (minute>30)*1 )

for (e in entries) 
   console.log(label_timestamp(e.hour, e.minute, e.period)
这样,上午11:37变成
11*2+0*24+1*1=23


这是O(n),但问题也不是很清楚。

好吧,如果你的时间范围一致,你可以这样做:

var start = myIntervals[0].start, 
    end = myIntervals[myIntervals.length-1].end,
    segment = (end-start) / myIntervals.length;

for(var i=0, j=myArray.length; i<j; ++i){
    var v = myArray[i];

    if(v < start || v >= end) continue;
    var ii = ((v - start)/segment) >>> 0;
    myIntervalCounts[ii]++; 
}
var start=myinterval[0]。开始,
end=myinterval[myinterval.length-1]。end,
段=(结束-开始)/myinterval.length;
对于(var i=0,j=myArray.length;i=end)continue;
var ii=((v-开始)/段)>>>0;
myIntervalCounts[ii]+;
}

假设间隔已排序,否则您将需要添加一些映射

请显示一些代码,我不知道您的数组实际包含什么类型的数据/值。当然,发布了一些代码。我完全不明白您为什么需要嵌套循环。小时是关键的一部分,在分钟上对
>30
进行简单的比较将为您提供e键后缀。你不需要将其解析为日期或循环…哦,天哪,这太明显了,谢谢DanHey Eduardo,我发布了一些可能有用的信息。现在查看你的答案。根据这些信息,我认为此代码可以工作。让我知道。