查找数组中的范围

时间:2016-07-05 15:09:27

标签: javascript arrays sorting

让我们假设我们有一个这些元素的数组(总是排序)。

[1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3]

我们的目标是找到给定值的最小索引和最大索引,例如让我们假设我们正在搜索元素3的最小索引和最大索引。

我们很快发现,3的min-index为8,max-index为11。

对于值1,min为0,max为3。

你如何开发一个能够在JavaScript中返回min和max的解决方案?我试图这样做,但我无法弄清楚如何,我总是得到错误的答案。

4 个答案:

答案 0 :(得分:7)

您可以尝试Array.indexOf()Array.lastIndexOf()

var sortedArr =[1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3];

console.log(sortedArr.indexOf(1));
console.log(sortedArr.lastIndexOf(1));

答案 1 :(得分:1)

基本上Array.indexOf()Array.lastIndexOf()会做,但是他们会进行线性搜索(通过循环遍历整个数组,直到找到元素),这显然是在线性时间内完成的{ {1}}。

如果您的数组始终排序,那么我们可以使用此属性对其进行优化并使用二进制搜索。速度更快,将以对数时间O(n)执行。

之后我们只需检查找到的索引之前(和之后)的元素,直到找到一个不等于我们元素的元素。

找到最后一次出现:

O(log n)

首次出现:

var i= foundIndex;
while(sortedArr[i] == sortedArr[foundIndex]){
    i++;
}
foundIndex = i;

那就是它!这将有助于运行时间,特别是如果你有大数组。 您可以在任何地方找到二进制搜索实现,只需使用它们中的任何一个。

答案 2 :(得分:0)

这就是你想要的吗?

#Define cluster:

addprocs(11);

using Distributions;
@everywhere using Iterators;
d = Normal();

eps_1 = rand(d,1000000);
eps_2 = rand(d,1000000);


#Create a large matrix:
large_matrix = hcat(eps_1,eps_2).>=0;
indices = collect(1:4:1000000)

#Split large matrix:
large_matrix = [large_matrix[i:(i+3),:] for i in indices];

#Define the function to apply:
@everywhere function function_split(x)
    matrix_to_compare = transpose(reinterpret(Int,collect(product([0,1],[0,1])),(2,4)));
    matrix_to_compare = matrix_to_compare.>0;
    find(sum(x.==matrix_to_compare,2).==2)
end

@time map(function_split,large_matrix )
@time pmap(function_split,large_matrix )

   5.167820 seconds (22.00 M allocations: 2.899 GB, 12.83% gc time)
   18.569198 seconds (40.34 M allocations: 2.082 GB, 5.71% gc time)

答案 3 :(得分:-1)

var data={1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3};
var value=3;
var min=data.length;
var max=0;

for(var key in data){
   if(data[key]==value){
      if(key<min){
           min=key;
      }
   if(key > max){
          max=key;
     }
  }
console.log(min);
console.log(max);