【问题标题】:Searching for the right data structure (add head, swap, remove,...)搜索正确的数据结构(添加头、交换、删除……)
【发布时间】:2013-01-05 00:22:51
【问题描述】:

我正在寻找一种数据结构,它提供:

  1. 在前面添加一个元素
  2. 交换两个元素
  3. 移除元素
  4. 当我添加一个元素(不是在最后一个位置)时,其他元素应该向后滑动(就像在队列中一样)
  5. 访问每个元素
  6. 通用会很好,但不是必需的

我在 MSDN 上找到的数据结构不能满足我的要求

  • ListLinkedList 不提供交换方法
  • 我可以使用 ArrayList 来做到这一点,但我想当我在前面位置添加一个元素时它的效率非常低(因为必须复制和读取后面的所有元素)
  • HashTable 不提供订单
  • QueueStack 不提供交换、随机访问,...

我可以编写自己的数据结构,但我不想重新发明轮子,因为 .NET 库太大了。

编辑:

我需要一个数据结构来提供类似的东西,比如进程优先级调度程序。第一个条目的优先级最高,最后一个条目的优先级最低。有时我必须更改元素的优先级(交换)或完全删除元素(删除)。我最近添加的元素应该具有最高优先级(这就是我将它添加到最前面的原因)

【问题讨论】:

  • 我怀疑是否有一种结构提供了交换方法......它很容易实现......
  • “重新发明轮子的好处是你可以得到一个轮子。” - 道格拉斯·克罗克福德

标签: c# data-structures


【解决方案1】:

您确实需要弄清楚您将执行这些操作的频率,因为您列出了其中的极端数量。

以下是我对您的想法的看法:

  • 如果您已对 get/set 进行索引,则实现交换方法是微不足道的。
  • 如果您担心复制时间,请反转您的列表,这样您就可以在前面插入便宜的插入,您需要重写一些逻辑来将其关闭,但这不会停止使用数组作为后面结束。

最后一点,您确定不需要某种自动排序,因为这样会大大简化此操作。

【讨论】:

  • +1。实际上,您可以为 IList 编写一个扩展方法来做到这一点。
  • 我需要一个数据结构来提供类似的东西,比如进程优先级调度程序。第一个条目的优先级最高,最后一个条目的优先级最低。有时我必须更改元素的优先级(交换)或完全删除元素(删除)。我最近添加的元素应该具有最高优先级(这就是我将它添加到最前面的原因)
  • @user1826831:从原始数据结构的角度来看,堆可能是您最好的选择,尽管实现您所需的所有功能可能需要一些工作,但它们都应该是高性能的。我保留我的答案,因为它回答了你原来的问题。如果您在查看堆结构后需要更多帮助,请随时发布另一个。
  • 感谢您花时间回答我的问题。如果可以,我会接受这两个答案。但是 CLandry 的分数比你得到的要少。接受 CLandry 的回答可能更能激励他 ;)
  • @user1826831:他的回答更正确,因为他包含了正在寻找的数据结构。我只是按原样保留我的答案,这样如果其他人出现并想要类似的结果,即使他们没有进行优先级队列,他们也会得到一些提示。
【解决方案2】:

听起来你正在寻找的是一个堆。

Wikipedia: Heap

堆通常用于管理优先级,可以将最高优先级的项放在队列顶部,并根据从堆中添加或删除的具有不同优先级的项重新排列。

这是一个通用集合库,它实现了区间堆:

http://www.itu.dk/research/c5/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-16
    • 2015-11-10
    • 2021-12-26
    • 1970-01-01
    • 2014-06-23
    相关资源
    最近更新 更多