自调整列表和常规链表之间的主要区别

Key Differences between Self-Adjusting Lists and Regular Linked List

本文关键字:区别 之间 链表 列表 常规 自调整      更新时间:2023-10-16

我正在上数据结构课(基于C++),我必须诚实地说,我的老师没有教我们太多关于自我调整列表的知识。尽管如此,我还是被分配了一个需要实现这样一个类的项目。

我的导师为这个项目留下的关于自我调整列表的唯一注释是:

自调整列表与常规列表类似,不同之处在于所有插入都在前面执行,当搜索访问元素时,它会移动到列表的前面,而不会更改其他项目的相对顺序。访问概率最高的元素预计将靠近前面。

我不明白的是为什么所有插入都必须在列表的前面执行。考虑到正在插入的数据已被零次访问,在末尾插入不是更好吗?

另外,我应该注意其他关键差异吗?我似乎无法在网上找到一个深入探讨这个话题的好资源。

我不明白的是为什么必须执行所有插入 在列表的前面。在最后插入不是更好吗 考虑到正在插入的数据已被零次访问?

通常,最近添加的项目更有可能成为访问的候选项。此外,在开始时插入是恒定时间操作。

例如,如果您购买书籍并将最新书籍放在顶部,以便最容易地访问它。如果你从一堆书中搜索和阅读一本旧书,它就会被放在顶部。

当然,你想把最新买的书放在上面,尽管你从来没有读过它。

另外,我应该注意其他关键差异吗?我 似乎无法在网上找到一个深入探讨这个问题的好来源 主题

虽然这种列表的平均和最差访问时间在理论上与正常列表(随机节点)相同,但在实践中,平均访问/搜索时间要快得多。


如果节点数量增长到非常大的数量,自平衡BST(例如红黑树)或哈希将提供更好的访问时间。

还有许多其他方案用于保持列表的自我调整:例如:

  • 最近用于头部(如您所说)
  • 保持列表按访问计数排序(最近访问的节点可能不一定排在前面)
  • 当访问非头节点的节点时,将其与前一个节点交换。

策略的确切选择取决于您的需求,目标环境中的分析是选择其中一种的最佳方式。