[英]Array Based Implementation of a Vector
作业协助
描述向量的基于数组的实现,以便可以在恒定时间内完成向量开头和结尾的插入和删除操作。 令人信服地争论。
显然,这对于直接阵列是不可能的。 如果从前面移开,将需要填充一个孔以保持vector属性。 当然,如果我们抓住下一个元素,则需要执行n次,因此运行时将是线性的,而不是恒定的。
另一种方法是获取最后一个元素并将其粘贴在前面,但是扰乱数据的数据结构有什么用呢?
到目前为止,我所做的就是创建一个数组。 奇数索引位于数组中某个点的后面(出于大小的考虑,最好位于中间,但可以在任何位置),然后偶数索引位于该点之前。 如果那个特殊点不是中心点,那么它将占用一整堆内存并有很多空槽。 最坏的情况是2n。 但是,它的作用就像没有孔,因为它将始终填充下一个元素。
插入:
private int front = 0;
private int back = 0;
public void insertAtFront(int element)
{
(front+1));
dataArray[2*(front + 1) + 1] = element;
front++;
}
public void insertAtBack(int element)
{
dataArray[2*(back+1)] = element;
back++;
}
要移除,只需减小正面或背面。 然后,在访问数组时,仅允许显示正反之间的值。
首先,这是否满足向量的要求? 其次,在删除时,我遇到了一些主要问题,以解决如何越过该特殊中心点的问题。 假设您要从背面添加所有内容时,要从正面移除整个阵列。
感谢您的协助。
秘诀是使用两个数组。 第一个数组的末尾是“ front”。 第二个数组的末尾是“ back”。
我不明白您要使用偶数和奇数索引做什么。 但是基本上要有一个开始索引和一个结束索引-在前面保留空白,以便您可以在此处添加元素,如果删除元素,则可以再次增加开始索引。
另一种选择是使用圆形数组,使您可以在前端和后端高效地添加/删除。
还可以应用其他变体:您是否还能找到一种实现方式,使得在开始,结尾和中间(准确地)插入/删除是高效的,并且具有O(1)时间?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.