【发布时间】:2020-07-21 08:57:08
【问题描述】:
在哪里可以使用(双向链表)位置列表ADT?当开发人员想要O(n) 内存和O(1)(非摊销行为)到列表中的任意位置时?我想看一个使用位置列表的例子。与使用基于数组的序列相比,使用位置列表有什么优势?
【问题讨论】:
标签: data-structures linked-list abstract doubly-linked-list abstract-data-type
在哪里可以使用(双向链表)位置列表ADT?当开发人员想要O(n) 内存和O(1)(非摊销行为)到列表中的任意位置时?我想看一个使用位置列表的例子。与使用基于数组的序列相比,使用位置列表有什么优势?
【问题讨论】:
标签: data-structures linked-list abstract doubly-linked-list abstract-data-type
如果您的程序经常需要在数据集合中添加新元素或从数据集合中删除元素,那么列表可能是比数组更好的选择。
删除数组位置N处的元素需要对元素N之后的所有元素进行复制操作。原则上:
Arr[N] = Arr[N+1]
Arr[N+1] = Arr[N+2]
...
插入新元素时需要类似的副本,即为新元素腾出空间。
如果您的程序经常添加/删除元素,那么许多复制操作可能会影响性能。
作为这些操作的一部分,现有元素的位置会发生变化,即在位置 50 删除/添加元素后,位置 1000 的元素将位于位置 999 或 1001。
如果您的程序的某些部分已搜索特定元素并保存了其位置(例如位置 1000),则可能会出现问题。元素删除/添加操作后,保存的位置不再有效。
(双向)列表“解决”了所描述的 3 个问题。使用列表,您可以添加/删除元素,而无需将现有元素复制到新位置。因此,特定元素的位置(例如指向元素的指针)在添加/删除操作后仍然有效。
总结一下:如果您的程序(经常)添加或删除随机定位的元素,并且如果您的程序要求位置信息不受添加/删除操作的影响,那么列表可能比数组更好。
【讨论】:
O(N) time(no bueno)。一般的经验法则是,对于数据结构操作,我们希望它们运行O(1) 或O(log n)。此外,索引不擅长描述相对于其他节点的位置。validate 来验证该位置是否在链接结构中。ADT(抽象数据类型),在 Java 中,我们使用接口形式化 ADT,如下所示:public interface Position <E>{
E getElement()throws IllegalStateException;
}
private static class Node<E> implements Position<E> {
// ALL THE OTHER METHODS WOULD BE HERE
}
parse tree。你可以有一个二叉树,它实现并使用 Position 接口的所有方法,然后使用树进行解析【讨论】: