我有一个长度为A=[3, 5, 1, 2, 7, 9, 10, 2, 3]
的数组length(A)=9
和一个包含索引S
的子集的1:9
,例如S=Set([1, 3, 6, 8])
。我想找到A
超过S
的最大值(值和索引)。也就是说,最大值为9
,索引为6
。
我试着这样做
A = [3, 5, 1, 2, 7, 9, 10, 2, 3];
S = Set([1, 3, 6, 8]);
B = [if i in S A[i] else 0 end for i in 1:length(A)];
findmax(B);
但我觉得有一种更好,更聪明的方式。
答案 0 :(得分:7)
怎么样?
julia> maximum((A[i],i) for i in S)
(9, 6)
这依赖于元组按字典顺序排序的事实。这只会迭代子集,因此当S
的元素明显少于A
时,它应该更快。
maximum
是比findmax
更好的选择。
答案 1 :(得分:5)
这更详细,但在我的电脑上大约是发电机解决方案(版本0.6)的2.5倍:
function mymax(A, S)
val, ind = typemin(eltype(A)), -1
for i in S
val_ = A[i]
if val_ > val
val, ind = val_, i
end
end
return val, ind
end
答案 2 :(得分:3)
如果<div class="modal fade" id="tableDivID" tabindex="-1" role="dialog" data-backdrop="static" data-keyboard="false">
<div class="modal-dialog" style="width:95%">
<div class="modal-content " style="margin-top: 20%;">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
<h4 class="modal-title">Caption</h4>
</div>
<div class="modal-body min-height-400">
<div class="row">
<div class="col-sm-12">
<div id="tableId" style="width: 100%"></div>
</div>
</div>
</div>
</div>
</div>
</div>
不包含重复项(或者至少是最大值是唯一的),我发现以下内容更具可读性:
function populateTableData(){
var data= [];
for(i=0;i<10;i++){
var row = {'id': i, 'sectionCode': 'hello', 'headerName': 'header'+i, 'amount': '123,123'};
data.push(row);
}
var columns = [
{field: 'id',checkbox: true},
{field: 'sectionCode', title:'Section Code',visible: false},
{field: 'headerName', title:'Header Name'},
{field: 'amount', title:'Amount',width: '30%', align:'right'}];
$("#tableId").bootstrapTable('destroy');
$("#tableId").bootstrapTable({
height: 350,
checkboxHeader: true,
columns: columns ,
data: data
});
}
A
适用于生成器,因此不应有内存开销。如果julia> i = findfirst(A, maximum(A[i] for i in S))
6
julia> A[i], i
(9, 6)
很小,则maximum
的大小占主导地位,无论如何你必须遍历它。
答案 3 :(得分:2)
如果你可以做更多的最大值:
function maximums(A,S)
maxvalue = maximum(A[i] for i in S)
(maxvalue, [i for i in S if A[i]==maxvalue])
end
A = [3,3,3]
S = Set([1,3])
maximums(A, S) # (3, [3, 1])
如果您想保留顺序而且Set不是S的必要类型,那么您可以使用unique
函数:
S = unique([1,3])
maximums(A, S) # (3, [1, 3])