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

时间:2015-03-12 07:27:28

标签: c++ list data-structures linked-list

我在一个数据结构类(基于C ++)中,我必须诚实地说我的导师没有教过我们很多关于自我调整列表的内容。尽管如此,我还是被指派了一个需要实施这样一个课程的项目。

我的导师留给这个关于自我调整列表的项目的唯一注意事项是:

  

自调整列表就像一个常规列表,除了所有插入都在前面执行,当一个元素被搜索访问时,它被移动到列表的前面,而不改变相对的顺序。其他项目。具有最高访问概率的元素预计将接近前面。

我没有得到这个是为什么所有插入都必须在列表的前面执行。考虑到插入的数据已被访问过零次,最终插入是不是更好?

此外,我还应该注意哪些关键差异?我似乎无法找到一个关于这个主题的深入在线资料。

1 个答案:

答案 0 :(得分:3)

  

我没有得到这个是为什么必须执行所有插入   在列表的前面。最后插入不会更好   考虑到插入的数据已被访问过零次?

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

例如,如果您购买书籍并将最新的书保存在最顶层,以便最容易访问。如果您从堆中搜索并阅读旧书,它将被置于顶部。

当然,你想把最新买的书保留在最顶层,虽然你从未读过它。

  

此外,我还应该注意哪些关键差异?一世   似乎无法找到一个深入了解这一点的在线资源   主题

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


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

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

  • 最近用于头上(正如你所说)
  • 保持列表按访问次数排序(最近访问的节点可能不会出现在前面)
  • 当访问非头节点的节点时,将其与前一节点交换。

战略的精确选择取决于您的要求,目标环境中的分析是选择一个而非另一个的最佳方式。