Julia在数组数组中选择最长数组的最有效方法是什么?

时间:2018-01-04 22:18:20

标签: arrays max julia

我有一个数组<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div id="aligned"> <h2 class="iam">I am</h2> <h2 class="wrapper"><span class="quotes">first quote</span></h2> </div>数组,它是整数的A。我正在尝试使用Julia在N-element Array{Array{Int64,1},1}中找到最大的数组。

例如:

A

在Python中我只会这样做:A = [[1, 2], [3, 4], [5, 6, 7], [1, 2, 5, 8]] 但在朱莉娅我不知道该怎么做。

我做的是:

max(A, key=len)

谢谢!

3 个答案:

答案 0 :(得分:6)

编辑:注意,也值得查看@crstnbr的其他答案

请考虑以下示例代码:

julia> A = [[1,2], [1,2,3,4,5,6], [1,2,3]]
3-element Array{Array{Int64,1},1}:
 [1, 2]            
 [1, 2, 3, 4, 5, 6]
 [1, 2, 3]         

julia> length(A)
3

julia> length.(A)
3-element Array{Int64,1}:
 2
 6
 3

julia> indmax(length.(A))
2

julia> A[indmax(length.(A))]
6-element Array{Int64,1}:
 1
 2
 3
 4
 5
 6

第一次调用length会获得A中外部向量的长度,不是我们想要的内容。在第二个调用中,我使用broadcasting operator .,以便我得到每个内部向量的长度。在indmax行中,我找到length.(A)中最大值的索引,即最长内向量的索引。如果您想要返回最长的内部向量,则只需使用A行的结果索引到indmax

答案 1 :(得分:6)

@Colin提供了一个紧凑,方便的答案。但是,如果速度很重要(op要求最有效的方法),这应该接近最佳

function findlongest(A)
    idx = 0
    len = 0
    @inbounds for i in 1:length(A)
        l = length(A[i])
        l > len && (idx = i; len=l)
    end
    return A[idx]
end

请注意,这个实现(可能)在Python中是个坏主意:)

快速基准:

julia> using BenchmarkTools

julia> A = [[1,2], [1,2,3,4,5,6], [1,2,3]]
3-element Array{Array{Int64,1},1}:
 [1, 2]            
 [1, 2, 3, 4, 5, 6]
 [1, 2, 3] 

julia> @btime findlongest(A);
  26.880 ns (0 allocations: 0 bytes)

julia> @btime A[indmax(length.(A))];
  9.813 μs (25 allocations: 1.14 KiB)

对于此示例,这是 ~365倍的加速

编辑: 更好的基准(评论中建议)

julia> @btime findlongest($A);
  9.813 ns (0 allocations: 0 bytes)

julia> @btime $A[indmax(length.($A))];
  41.813 ns (1 allocation: 112 bytes)

$符号可避免设置分配和时间。加速 ~4

快速解释

  • for循环在Julia中很快,所以为什么不使用它们
  • 避免分配(length.(A)分配一个新的整数数组)
  • a && b是“if a then b”
  • 的快捷方式
  • @inbounds避免对A[i]
  • 进行绑定检查

答案 2 :(得分:1)

indmax不再在Julia中定义(至少1.3)。

改为使用argmax

>>> A = [[1,2], [1,2,3]]
2-element Array{Array{Int64,1},1}:
 [1, 2]   
 [1, 2, 3]

>>> length.(A)
2-element Array{Int64,1}:
 2
 3

>>> argmax(length.(A))
2

>>> A[argmax(length.(A))]
3-element Array{Int64,1}:
 1
 2
 3