【问题标题】:In C# what the best generic to use for many insert and delete?在 C# 中,用于许多插入和删除的最佳泛型是什么?
【发布时间】:2013-03-13 08:13:27
【问题描述】:

我有一个游戏循环,它绘制了一个对象列表,该列表称为“mylist”并包含大约 1000 个对象,需要不断从列表中添加和删除对象(尤其是快速飞行并击中物体的子弹),每秒有几个对象。

如果我理解正确,如果列表容量足够大,则 List 中的插入实际上是免费的,问题在于删除是 O(n),因为首先我需要在列表中找到项目,其次它创建删除后的新列表。

如果我可以汇总所有删除并在每帧中进行一次,那将是有效的,因为我将使用 mylist.Except(listToRemove) 并且这将在 O(n) 中。 但不幸的是我做不到。

链接列表也有问题,因为我需要在列表中找到对象。

有人有更好的建议吗?

【问题讨论】:

  • 这都是理论上的,还是实际上遇到了问题? 1000 个对象并不是那么大,所以我很惊讶听到这种大小的性能问题。我的意思是,您是否真的分析并发现这是瓶颈?
  • @Oded 二次处理 1000 个对象大约是 500k 次操作。这不再是微不足道的成本。
  • 是理论上的,但不仅如此,写这么低效的代码感觉不对。

标签: c# list generics


【解决方案1】:

HashSet 呢?它支持O(1) 插入和删除。如果您需要排序,请使用树形数据结构或LinkedList 加上Dictionary,以便您快速找到节点。

BCL 有一个SortedList 和一个SortedSet 和一个SortedDictionary。除了一个都非常慢,但我永远不记得哪一个是“好”的。它在内部是基于树的。

【讨论】:

  • 该死,打败我吧,但请记住,HashSet 中不能有重复的项目
【解决方案2】:

如果您正在搜索,那么最好的办法是使用平均情况为 O(1) 和最坏情况为 O(n) 的 Dictionary(当您散列到同一个存储桶时)。

如果你需要保持顺序,你可以使用平衡二叉搜索树的任何实现,你的性能将是 O(logn)。

在 .NET 中,这简单地归结为

Dictionary - 插入/移除 O(1)(平均情况)

SortedDictionary - 保留有序操作的顺序,插入/删除 O(logn)

【讨论】:

    【解决方案3】:

    因此,理想情况下,您会希望使用具有 O(1)O(log n) 删除和插入的数据结构。字典类型的数据结构可能是理想的,因为它们具有恒定的平均情况插入和删除时间复杂度。我建议在您的游戏对象基类中使用 HashSetoverriding GetHashCode()

    这里是关于所有不同字典/哈希表数据结构的更多详细信息。

    时间复杂度

    以下是所有“类字典”数据结构及其时间复杂度:

    Type              Find by key  Remove      Add
    HashSet           O(1)*        O(1)*     O(1)**
    Dictionary        O(1)*        O(1)*     O(1)**
    SortedList        O(log n)     O(n)      O(n)
    SortedDictionary  O(log n)     O(log n)  O(log n)
    

    * O(n) 有碰撞
    ** O(n) 发生冲突或添加超出数组的容量。

    HashSet 与字典

    HashSetDictionary 之间的区别在于,字典适用于 KeyValuePair,而 HashSet 的关键是对象本身(它的 GetHashCode() 方法)。

    SortedList vs SortedDictionary

    只有在需要维持订单时才应考虑这些。区别在于SortedDictionary 使用红黑树,SortedList 使用排序数组作为其键和值。

    参考

    【讨论】:

    • 只是一个评论:如果 OP 不需要保持秩序,他可以使用一个简单的 Dictionary 类。
    【解决方案4】:

    在性能方面,您可能会看到最好的结果,只需不从任何类型的列表中插入或删除任何内容。分配一个足够大的数组并标记所有对象是否应该渲染。

    但是,鉴于您的要求,这可能都是过早的优化;您可以每秒 30 次重新创建 1000 个元素的整个列表,而不会看到任何性能下降。

    我建议阅读 Braid 的创建者提供的关于在独立视频游戏中使用正确数据结构的演示文稿的幻灯片:http://the-witness.net/news/2011/06/how-to-program-independent-games/(tl;博士只是对所有内容都使用数组)。

    【讨论】:

      猜你喜欢
      • 2018-10-13
      • 1970-01-01
      • 2013-03-16
      • 1970-01-01
      • 1970-01-01
      • 2010-10-16
      • 2022-12-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多