让我们假设我们有一个这些元素的数组(总是排序)。
[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的解决方案?我试图这样做,但我无法弄清楚如何,我总是得到错误的答案。
答案 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);