|
|
1
3
您可以使用
|
|
|
2
5
编写一个方法,在列表中迭代一次并维护一组最大的M个元素。每个步骤只需要O(logm)工作来维护集合,并且您可以拥有O(M)内存和O(nlogm)运行时间。
|
|
|
3
1
你可以用 Indexed LINQ 对正在处理的数据建立索引。在某些情况下,这会导致显著的改善。 |
|
4
1
如果将两者结合起来,可能会少做一点工作:
但基本上这种排名需要排序,这是你最大的成本。 还有一些想法:
|
|
|
5
1
如果您的列表已经存在于内存中,我会将其就地排序,而不是制作一个副本—除非您需要再次取消排序,也就是说,在这种情况下,您必须权衡内存中有两个副本与从存储中再次加载它):
另外,不确定这会有多大帮助,但看起来你要浏览你的列表两次-一次找到截止值,一次选择它们。我想你这样做是因为你想让所有的关系通过,即使这意味着选择超过5%的点。但是,因为它们已经被分类了,所以你可以利用它们,在你完成后停止。
|
|
|
6
1
除非你的名单是
极其
在我看来,cpu时间很可能是性能瓶颈。是的,你的
不使用列表
. 改用IEnumerable。你只是不打电话
另外,在三种情况下,内存使用可能会成为一个问题:
更新: 再读一遍你的问题,我发现你读的文件很大。在这种情况下 最好的 性能可以通过编写自己的代码来解析文件来获得。如果项目数存储在文件顶部附近,则可以执行以下操作 许多的 更好的方法是,即使您可以根据文件的大小估计记录的数量(可以肯定地猜得有点高,然后在完成后截断任何额外的记录),您也可以构建最终的集合作为您的读取。这将大大提高cpu性能和内存使用。 |
|
7
1
我会实现“半”快速排序。
在P中选择轴x。
如果N=| U |那么你就完了。 如果N<|U |然后用P:=U递归。 否则,您需要将一些项添加到U:recurse with N:=N-| U |,P:=L来添加其余的项。 如果你明智地选择了你的轴心点(例如,五个随机样本的中位数),那么这将在O(n logn)时间内运行。 嗯,再想一想,你也许可以完全避免创建新的集合,因为本质上你只是在寻找一种从原始集合中找到第n个最大项的方法。是的,我认为这会管用,所以建议2:
设M是A和Z的平均值(记住,我们这里只考虑Z坐标)。 数一数在[M,Z]范围内有多少项,称之为Q。 如果Q<那么P中第N个最大的项在[A,M]的某处。尝试M:=(A+M)/2。 如果N<那么P中第n个最大的项在[M,Z]的某个地方。尝试M:=(M+Z)/2。
现在遍历P,删除所有大于或等于M的项。 你好吗? |
|
|
8
0
您可以使用以下内容:
|
|
|
9
0
如果你想要一小部分按某种标准排序的分数,你最好使用
Priority queue
数据结构;创建一个大小有限的队列(将大小设置为所需的元素数),然后只需扫描列表中插入的每个元素。扫描之后,你可以按顺序取出结果。
|
|
|
10
0
现在您所要做的就是实现一个FixedSizedPriorityQueue,该队列一次添加一个元素,当最大的元素已满时丢弃它。 |
|
|
11
-1
只是尝试了50000行,100次访问了其中的30%。我的绩效结果是:
试试看。
|
|
|
A B · C#Excel自动调整列避免长文本时出错 1 年前 |
|
|
Megrez7 · C#ToArray转换合并为一行,导致数组元素更改 1 年前 |
|
Aycon · 在工厂方法中释放部分创建的对象的正确方法是什么? 1 年前 |
|
|
Sei · Avalonia/WPF将路由器传递到控制模板 1 年前 |