自调整列表和常规链表之间的主要区别
Key Differences between Self-Adjusting Lists and Regular Linked List
我正在上数据结构课(基于C++),我必须诚实地说,我的老师没有教我们太多关于自我调整列表的知识。尽管如此,我还是被分配了一个需要实现这样一个类的项目。
我的导师为这个项目留下的关于自我调整列表的唯一注释是:
自调整列表与常规列表类似,不同之处在于所有插入都在前面执行,当搜索访问元素时,它会移动到列表的前面,而不会更改其他项目的相对顺序。访问概率最高的元素预计将靠近前面。
我不明白的是为什么所有插入都必须在列表的前面执行。考虑到正在插入的数据已被零次访问,在末尾插入不是更好吗?
另外,我应该注意其他关键差异吗?我似乎无法在网上找到一个深入探讨这个话题的好资源。
我不明白的是为什么必须执行所有插入 在列表的前面。在最后插入不是更好吗 考虑到正在插入的数据已被零次访问?
通常,最近添加的项目更有可能成为访问的候选项。此外,在开始时插入是恒定时间操作。
例如,如果您购买书籍并将最新书籍放在顶部,以便最容易地访问它。如果你从一堆书中搜索和阅读一本旧书,它就会被放在顶部。
当然,你想把最新买的书放在上面,尽管你从来没有读过它。
另外,我应该注意其他关键差异吗?我 似乎无法在网上找到一个深入探讨这个问题的好来源 主题
虽然这种列表的平均和最差访问时间在理论上与正常列表(随机节点)相同,但在实践中,平均访问/搜索时间要快得多。
如果节点数量增长到非常大的数量,自平衡BST(例如红黑树)或哈希将提供更好的访问时间。
还有许多其他方案用于保持列表的自我调整:例如:
- 最近用于头部(如您所说)
- 保持列表按访问计数排序(最近访问的节点可能不一定排在前面)
- 当访问非头节点的节点时,将其与前一个节点交换。
策略的确切选择取决于您的需求,目标环境中的分析是选择其中一种的最佳方式。
相关文章:
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- int(c) 和 c-'0' 之间的区别。C++
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 在 const 函数中通过引用和指针返回之间的区别
- 我想知道长双倍和双倍之间的区别
- 这 4 个 lambda 表达式之间有什么区别?
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- (double) 和 double() 之间的区别
- & 和 * 之间的区别
- std::is_convertible 和 std::convertible_to 之间的区别(在实践中)?
- 析构函数和'delete'之间的区别
- 在 typedef 内部使用 const 关键字和在 typedef 外部使用 const 关键字之间有区别吗?
- 从预序遍历构造 bst 的 c++ 和 python 解决方案之间的区别
- vector.back() 和 vector[vector.size() - 1] 之间的区别?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 函数签名与调用的函数不匹配,常量字符[]和字符*之间的区别?
- OpenMP #pragma omp for v/s #pragma omp parallel for 之间的区别?
- S() 与 S{} 之间的区别?