【发布时间】:2012-01-17 05:51:37
【问题描述】:
给定一个包含k 子列表的列表,让
A={{a1,a2,a3,...},{b1,b2,b3,...},...},我想按它们的Total[A[i]] 对这些子列表进行排序。有什么有效的方法吗?
【问题讨论】:
标签: list wolfram-mathematica sorting mathematica-8
给定一个包含k 子列表的列表,让
A={{a1,a2,a3,...},{b1,b2,b3,...},...},我想按它们的Total[A[i]] 对这些子列表进行排序。有什么有效的方法吗?
【问题讨论】:
标签: list wolfram-mathematica sorting mathematica-8
查看文档中的SortBy,了解对列表进行排序的一系列可能性。
SortBy[A,Total]
满足您的需求。
编辑:根据下面向导先生的评论和链接中的解释,
SortBy[A,{Total}]
更好。
【讨论】:
SortBy[A, {Total}] 会稍微快一些。
请注意,在许多情况下,基于Ordering 的排序可能比SortBy 更快,因为它允许我们利用矢量化。在这种特殊情况下,加速并没有那么大:
In[50]:= test = RandomInteger[10,{5000000,5}];
In[54]:= (res1=SortBy[test,{Total}]);//Timing
(res2 = test[[Ordering[Total[test,{2}]]]]);//Timing
res1===res2
Out[54]= {1.422,Null}
Out[55]= {1.125,Null}
Out[56]= True
但是,这是因为Total 是一个内置函数。引入SortBy 的全部原因是效率(即对于单个比较函数。对于作为决胜局的几个比较函数,也方便)。 Sort 更有效,因为它更具体,因此绕过了主评估序列中的更多步骤。但是,SortBy 无法利用排序所基于的函数可能的可列表性(矢量化性质) - 它被逐一应用于列表元素。排序解决方案确实明确利用了排序函数的整体计算的可能性(在这种情况下,Total[#,{2}]& 这样做),因此更快。
例如,如果任务是根据每个子列表中的第二、第三和第四个元素进行排序,我们会看到更大的性能差异:
In[60]:= (res3=SortBy[test,{Total[#[[2;;4]]]&}]);//Timing
(res4=test[[Ordering[Total[test[[All,2;;4]],{2}]]]]);//Timing
res3==res4
Out[60]= {2.39,Null}
Out[61]= {1.11,Null}
Out[62]= True
通常,对于计算密集型和矢量化的排序函数,性能提升最大,因此当应用于整个列表时,它们的速度要快得多。但是请注意,对于大型列表,排序的性能提升永远不会像排序函数本身那样大。这是因为排序的内在复杂性,对于长度为n 的大型列表,它与n*Log[n] 成正比,并且这种复杂性将一直存在。
【讨论】:
以下应该可以工作(但我现在无法测试):
Sort[A, Total[#1]<Total[#2]&]
【讨论】: