【发布时间】:2011-09-11 17:44:30
【问题描述】:
在 C# 中,我有一组独特的元素,我想为每个无序对高效地执行一些代码。例如,如果我的容器包含 {a,b,c},则无序对是 (a,b)、(a,c) 和 (b,c)。问题出现在执行 2-opt 优化的范围内,因此效率是一个问题。
-
我目前的解决方案如下:
foreach(var a in container) { foreach(var b in container) { if (a < b) { // execute code } } }显然,如果运算符 [] 可用于获取第 i 个元素(即如果底层数据结构是列表),则可以轻松修改。但是对于所有其他容器,解决方案取决于存在一些比较功能,效率不高。
我还尝试了一种基于 LINQ 语句的公式,该语句只生成每个所需的对一次。然而,正如预期的那样,这比第一种方法慢得多。这也适用于使用
ElementAt的解决方案。
编辑:这是使用的(改进的)LINQ 代码:
var x = from a in container
from b in container
where a < b
select new KeyValuePair<int,int>(a,b);
不过,与其他解决方案相比,执行速度要慢 3-5 倍。
-
这是我在 C++ 中的做法(获得良好的效率):
for(auto it1 = container.begin(); it1!=container.end(); ++it1) { auto it2 = it1; for(++it2; it2!=container.end(); ++it2) { // execute code } }不幸的是,要将其转换为 C#,需要克隆(内部使用的)枚举器,该语言本身不支持。
有人有更好的想法/解决方案吗?
【问题讨论】:
-
您的 Linq 解决方案是什么样的?也许你的工作效率低下。
-
你的 a
-
为什么在 LINQ 语句中调用 ToList()?如果您所做的只是针对每个元素执行每个元素代码,则可以省去分配该列表。
-
ToList() 只是在我编写的代码中用于比较不同的解决方案...
-
是反复迭代的问题还是比较方法本身的问题?最好的解决方案是支持索引运算符。
标签: c# mathematical-optimization