【问题标题】:Efficient List Ordering高效的列表排序
【发布时间】:2014-04-28 19:45:49
【问题描述】:

我目前正在测试按键值排序列表的最佳算法。

我有一个非常简单的对象(以下代码 sn-ps 来自 C#)

class BasicObject
{
int Key;
}

构造对象时随机设置Key。

所以我有一个 BasicObject 对象列表,需要按最后的键值排序。

List<BasicObject> basicList = new List<BasicObject>();
for (int i = 0; i < someAmount; i++)
{
basicList.Add(new BasicObject());
}

我的想法是,创建一个名为orderedList 左右的新列表,并每次循环遍历它,对于每个BasicObject,并检查其 Key 是否高于当前 Value 或更低。 类似的东西:

List<BasicObject> orderedList = new List<BasicObject>();
bool objectWasInserted = false;
orderedList.Add(basicList[0]); // Inserting 1 Object as reference for the upcoming loop

for (int i = 1; i < someAmount; i++)
{
objectWasInserted = false;

for (int c = 0; c < orderedList.Count; c++)
{

if (basicList[i].Key > orderedList[c].Key) // The Key of the current object is higher than the key of the current object of the ordered List
{
orderedList.Insert(c, basicList[i]);
objectWasInserted = true;
break;
}

}

if (!objectWasInserted)
{
orderedList.Add(basicList[i]);
}
}

即使这样有效,它也太慢了。 用 50000 个对象测试它已经需要 8 秒。

LINQ 方法OrderBy 要快得多。

orderedList = basicList.OrderByDescending(x => x.Key).ToList();

50000 个对象只需 7 毫秒!

但是,这是一个辅助方法,我想摆脱它,而是使用我自己的算法通过键对对象列表进行排序。

我还尝试了 LinkedList 而不是普通的 List。这有点快,但距离 LINQ 方法还很远。

那么有没有办法稍微加快对象的排序? :)

提前感谢您的帮助!

【问题讨论】:

  • 你能解释一下 Linq 有什么问题吗'但是这是一个辅助方法,我想摆脱它,而是使用我自己的算法通过键对对象列表进行排序。 '?
  • 是的。通过稍后更改编程语言,我可能无法使用 Linqs 方法。所以我期待拥有自己的所有类,尽可能减少对库的依赖
  • 如果你要改变编程语言,那么就不可能有List&lt;T&gt;类,或者根本就没有类。然后考虑不要使用集合和类
  • 这就是我问的原因。也许它更有效,在 BasicObjects 之间使用数组或某种连接......
  • 使用您现在使用的语言和框架的力量会更有效。另外我相信所有高级语言都内置了对集合进行排序的功能

标签: c# performance linq list


【解决方案1】:

如果你不想使用 Linq(我觉得很奇怪),你可以使用List&lt;T&gt;.Sort

basicList.Sort((o1,o2) => o1.Key.CompareTo(o2.Key));

注意:此方法将修改原始列表,而不是创建新列表。

【讨论】:

    【解决方案2】:

    即使你想使用自己的算法,它也不会像在 LINQ OrderByDescending() 方法中实现的算法那样高效和快速。我们不知道 LINQ 中使用了哪种排序算法,但我们知道它已经过优化,实现了高效并利用了框架的强大功能,否则对 50000 个对象进行排序不会花费 7 毫秒。

    查看this page,了解不同的排序算法。

    如果您要更改编程语言,则必须使用该编程语言的功能。如果您必须更改编程语言,那么当已经有一个排序算法针对您当前使用的语言(如 C#)进行了优化时,开始实现排序算法对我来说没有意义。如果您已经知道要使用哪种语言,那么请考虑一下该语言可以提供哪些工具来解决您的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-06
      • 1970-01-01
      相关资源
      最近更新 更多