【问题标题】:Best algorithm for sequential access of nodes节点顺序访问的最佳算法
【发布时间】:2018-02-13 18:06:47
【问题描述】:

我想知道最好的算法,在该算法中,我可以根据键(范围从 0 到 2 次方 32)创建“排序”列表,并在嵌入式设备中需要时按排序顺序遍历它们。我知道可能的选择,即

  1. 排序的链接列表 随着链表中节点数量的增加,在链表中搜索正确节点以进行插入/更新操作需要更多时间 O(n)

  2. 哈希 可能是当前的最佳选择,除非我们没有与散列逻辑发生冲突

  3. 尺寸 2 幂 32 的表 浪费空间

还有其他适合在嵌入式设备中使用的最佳替代方案吗?

【问题讨论】:

  • 能不能在收集完所有条目后进行排序,还是需要在每个条目添加后对集合进行排序?
  • 答案是:视情况而定。立即想到的是,您只需将所有内容存储在一个数组中(节省空间),然后在遍历之前进行排序(对于整数,O(N))。
  • 它还取决于集合的预期(最大)大小。真的能增长到 20 亿吗?
  • 这个问题似乎已经死了。我的回答有帮助吗?

标签: algorithm hash linked-list


【解决方案1】:

有许多设计选择需要权衡。

一般性

由于您使用的是嵌入式设备,因此可以合理地假设您的内存有限。在这种情况下,您可能希望选择内存紧凑型数据结构而不是高性能数据结构。

链接列表倾向于将其内容分散在内存中,这会导致访问速度变慢,但这在一定程度上取决于您的架构。

您提出的选项

  1. 已排序的链表。 这种结构的访问速度已经很慢 (O(n)),构建起来也很慢 (O(N²) ),并且遍历速度很慢(因为链表会分散内存,这会降低您的预取能力)。

  2. 哈希表:这是一种快速结构(O(1) 访问,O(N) 构造)。但是,有两个问题。如果您使用开放寻址,则表必须不超过 70% 左右,否则性能会下降。这意味着你会浪费一些内存。或者,您可以使用链表存储桶,但这对遍历有性能影响。我有一个答案here,它显示了链表存储桶设计和哈希表的开放寻址之间遍历性能的数量级差异。更有问题的是,哈希表通过“随机”在内存空间中分布数据来工作。从中获得有序遍历将需要某种额外的数据结构。

  3. 大小为 2 次方 32 的表。这种解决方案会浪费大量空间。但性能也很差,因为我预计这个表的大部分条目都是空的,但它们都必须被遍历。

另一种选择

使用前排序

如果您不需要始终对列表进行排序,我建议将新条目添加到数组中,然后在遍历之前进行排序。这使您可以严格控制连续的内存布局,因此您将获得良好的内存性能。插入很快:只需将新数据放在数组的开头或结尾即可。遍历,当它发生时,会很快,因为你只是沿着数组走。唯一可能较慢的是排序。

您有多个排序选项。您需要记住,您的数组要么大部分是排序的(遍历之间只有少数插入),要么大部分是未排序的(遍历之间有很多插入)。在大多数排序的情况下,insertion sort 是一个不错的选择。在大多数未排序的情况下,[quicksort](https://en.wikipedia.org/wiki/Quicksort] 是可靠的。两者都有就地的好处,这减少了内存消耗。Timsort 平衡了这些策略。

【讨论】:

    猜你喜欢
    • 2018-03-27
    • 2016-03-31
    • 2017-08-03
    • 1970-01-01
    • 2017-03-09
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多