如何找到julialang中最后一个最大值的索引?

时间:2017-11-04 17:15:56

标签: julia

我有一个包含重复非负整数的数组,例如A=[5,5,5,0,1,1,0,0,0,3,3,0,0]。我想找到A中最后一个最大值的位置。这是所有i的最大索引A[i]>=A[j]j。在我的示例中,i=3

我试图找到所有最大值A的索引,然后找到这些索引的最大值:

A = [5,5,5,0,1,1,0,0,0,3,3,0,0];
Amax = maximum(A);
i = maximum(find(x -> x == Amax, A));

还有更好的方法吗?

4 个答案:

答案 0 :(得分:5)

myView.setOnApplyWindowInsetsListener { view, insets -> {
  val statusBarSize = insets.systemWindowInsetTop
  return insets
}

应该很快,但我没有对它进行基准测试。

编辑:我应该注意到,根据定义,@ crstnbr的解决方案(从头开始编写算法)更快(小岱的响应显示了多快)。这是尝试使用julia的内置数组函数。

答案 1 :(得分:4)

contain怎么样(当然这在概念上类似于你的方法)?

最快的事情可能是这样的显式循环实现:

body {
    background:url("NewLogo.png") no-repeat center center;
    background-size: contain;
}

答案 2 :(得分:3)

迈克尔的解决方案不支持字符串(ERROR: MethodError: no method matching view(::String, ::StepRange{Int64,Int64}))或序列,因此我添加了另一种解决方案:

julia> lastimax(x) = maximum((j,i) for (i,j) in enumerate(x))[2]
julia> A="abžcdž"; lastimax(A)  # unicode is OK
6
julia> lastimax(i^2 for i in -10:7)
1

如果您更喜欢不为空序列捕获异常:

julia> lastimax(x) = !isempty(x) ? maximum((j,i) for (i,j) in enumerate(x))[2] : 0;
julia> lastimax(i for i in 1:3 if i>4)
0

简单(!)基准:

这比 Float64 的解决方案<<>>慢10倍:

julia> mlastimax(A) = length(A) - indmax(@view A[end:-1:1]) + 1;
julia> julia> A = rand(Float64, 1_000_000); @time lastimax(A); @time mlastimax(A)
  0.166389 seconds (4.00 M allocations: 91.553 MiB, 4.63% gc time)
  0.019560 seconds (6 allocations: 240 bytes)
80346

(我很惊讶) Int64 快2倍

julia> A = rand(Int64, 1_000_000); @time lastimax(A); @time mlastimax(A)
  0.015453 seconds (10 allocations: 304 bytes)
  0.031197 seconds (6 allocations: 240 bytes)
423400
对于字符串

慢2-3倍
julia> A = ["A$i" for i in 1:1_000_000]; @time lastimax(A); @time   mlastimax(A)
  0.175117 seconds (2.00 M allocations: 61.035 MiB, 41.29% gc time)
  0.077098 seconds (7 allocations: 272 bytes)
999999

EDIT2: @crstnbr解决方案更快,并且也适用于字符串(不适用于生成器)。 lastindmaxlastimax之间存在差异 - 第一个返回字节索引,第二个返回字符索引:

julia> S = "1š3456789ž"
julia> length(S)
10
julia> lastindmax(S)  # return value is bigger than length
11
julia> lastimax(S)  # return character index (which is not byte index to String) of last max character
10

julia> S[chr2ind(S, lastimax(S))]
'ž': Unicode U+017e (category Ll: Letter, lowercase)

julia> S[chr2ind(S, lastimax(S))]==S[lastindmax(S)]
true

答案 3 :(得分:3)

我尝试了@ Michael的解决方案和@ crstnbr的解决方案,我发现后者更快

a = rand(Int8(1):Int8(5),1_000_000_000)

@time length(a) - indmax(@view a[end:-1:1]) + 1 # 19 seconds
@time length(a) - indmax(@view a[end:-1:1]) + 1 # 18 seconds


function lastindmax(x)
   k = 1
   m = x[1]
   @inbounds for i in eachindex(x)
       if x[i]>=m
           k = i
           m = x[i]
       end
   end
   return k
end

@time lastindmax(a) # 3 seconds
@time lastindmax(a) # 2.8 seconds