我应该选择哪种数据结构以及为什么

时间:2011-05-31 12:51:12

标签: c data-structures

我在C中写了计时器经理,其中涉及:

  • 创建新计时器
  • 删除计时器
  • 删除死计时器
  • 冻结计时器
  • 以及我还没有想过的所有其他东西。

关键是 - 内存量应尽可能小。 起初我想到链表,但如果我删除一些中间部分,我应该重建列表,这可能需要一些时间。典型的动态数组是相同的 - 我应该小心指点,不要错过其中的一些,当我反叛那个结构时。

有什么想法吗?

所有答案的答案

5 个答案:

答案 0 :(得分:3)

从链接列表中删除时,您无需重建任何内容。这是一个O(1)操作。无论你选择什么结构,你都可能需要小心指针。

答案 1 :(得分:1)

通常,阵列使用最少的内存。单个块,因此分配开销较少,并且没有像链接列表中的下一个/上一个指针那样的管理开销。

当然,从一个足够大的数组的开始/中间删除它比从链表中删除一个给定节点的时间效率要低,并且任何指向数组的指针/索引都将不再引用一旦你完成了同样的元素,所以你必须要小心你给定时器API的用户提供的处理以及如何找到特定句柄的计时器数据。但如果内存使用确实是唯一重要的问题,那么阵列就会赢。

我以前做过这样的事情,而且我个人会从一个链表开始,除非它显然会失败一些特殊的约束。指向“timerdata”结构的指针数组也可能正常工作,前提是您可以阻止活动计时器列表变得太大。

答案 2 :(得分:0)

如果内存量必须尽可能小,我会选择一个数组,使用数组的唯一缺点是调整数组的大小是很昂贵的(很多cpu周期),但是如果你可以设置一个限制定时器的数量然后使用大小到这个最大值的单个阵列将是有效的。如果定时器的数量非常动态,则列表(矢量集合)是可行的方法。

答案 3 :(得分:0)

您可以使用堆/优先级队列。这与阵列具有相同的内存要求,但插入和删除是O(lg n)操作。队列中的项目可以通过每个计时器对象的时间 - 左触发来排序。当真正的计时器触发时,您必须调整列表中每个其他计时器的触发时间。因此,如果timer1设置为在1秒后关闭,并且timer2设置为在1.5秒后关闭,则当timer1触发时,您必须在0.5秒后调整timer2以关闭。这样的事可能吗?

答案 4 :(得分:0)

什么是计时器元素?里面是什么?它只是一个值被一些定时器中断或一些复杂的类不断倒计数,可能有自己的线程来计时吗?

最常进行哪些操作? - 优先考虑优先访问。

在订购清单时是否有任何优势,例如。以递增的到期时间顺序,以便下一个定时器超时总是在列表的开头(即delta-queue)。

RGDS, 马丁