我想知道最好的算法,我可以创建一个" sort"基于密钥的列表(范围从0到2的功率32)并在嵌入式设备中需要时按排序顺序遍历它们。我知道可能的选择,即
已排序的链接列表 随着链表中节点数的增加,在列表中搜索正确的节点以进行插入/更新操作需要更多时间O(n)
哈希 除非我们没有与散列逻辑冲突,否则可能是当前最佳选择
2号电源表32 浪费空间
是否有适合在嵌入式设备中使用的其他最佳替代方案?
答案 0 :(得分:0)
有许多设计选择需要权衡。
<强>普通强>
由于您正在使用嵌入式设备,因此可以合理地假设您的内存有限。在这种情况下,您可能希望在高性能数据结构上选择内存紧凑的数据结构。
链接列表倾向于以一种可以使访问速度变慢的方式将内容分散到内存中,尽管这在某种程度上取决于您的体系结构。
您建议的选项
已排序的链接列表。此结构访问速度很慢( O(n)),构造缓慢( O(N²) ),并且移动速度慢(因为链接列表会分散内存,这会降低预取的能力)。
哈希表:这是一种快速结构( O(1)访问, O(N)构造)。但是有两个问题。如果使用开放式寻址,则表格必须不超过约70%,否则性能会降低。这意味着你会浪费一些记忆。或者,您可以使用链接列表存储桶,但这会对遍历产生性能影响。我有一个答案here,它显示链表列表设计和哈希表的开放寻址之间的遍历性能的数量级差异。更有问题的是,哈希表通过跨内存空间“随机”分布数据来工作。从中获取有序遍历将需要某种额外的数据结构。
2号电源表32 。这个解决方案有很大的空间浪费。但是,由于我预计这个表的大部分条目都是空的,但是它们都必须遍历。
另类
使用前排序
如果您不需要对列表进行排序,我建议在数组中添加新条目,然后在遍历之前进行排序。这使您可以严格控制内存布局,这是连续的,因此您将获得良好的内存性能。插入很快:只需将新数据放在数组的开头或结尾。遍历,当它发生时,将是快速的,因为你只是沿着阵列走。唯一可能有点慢的是排序。
您有多种排序选项。您需要记住,您的数组要么主要是排序(遍历之间只有少量插入),要么大多数未排序(遍历之间的许多插入)。在大多数情况下,insertion sort是一个不错的选择。在大多数未分类的情况下,[quicksort](https://en.wikipedia.org/wiki/Quicksort]是稳固的。两者都有就地的好处,这可以减少内存消耗。Timsort平衡这些策略。