我有一个包含重复非负整数的数组,例如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));
还有更好的方法吗?
答案 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解决方案更快,并且也适用于字符串(不适用于生成器)。 lastindmax
和lastimax
之间存在差异 - 第一个返回字节索引,第二个返回字符索引:
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