【问题标题】:Array Based Implementation of a Vector向量的基于数组的实现
【发布时间】:2013-06-13 16:05:28
【问题描述】:

家庭作业帮助

描述一个向量的基于数组的实现,这样插入和 在向量的开头和结尾删除可以在恒定时间内完成。争论 令人信服。

显然,这对于直列数组是不可能的。如果从前面移除,将会有一个需要填充的孔,以保持矢量属性。当然,如果我们抓取下一个元素,我们将需要这样做 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++;
}

要删除,只需减少正面或背面。那么在访问数组时,只允许显示前后的值。

首先,这是否符合向量的要求?其次,在移除时,我在弄清楚如何越过那个特殊的中心点时遇到了一些重大问题。假设您想从前面删除整个数组,而从后面添加所有内容。

感谢您的帮助。

【问题讨论】:

    标签: arrays vector


    【解决方案1】:

    秘诀是使用两个数组。第一个数组的末尾是“前”。第二个数组的结尾是“back”。

    【讨论】:

      【解决方案2】:

      我不明白您要对偶数和奇数索引做什么。但是有一个开始索引和一个结束索引基本上是要走的路——在前面留空,这样你就可以在那里添加元素,如果你删除一个元素,则再次增加开始索引。

      【讨论】:

        【解决方案3】:

        另一种选择是使用圆形数组,让您可以有效地在前面和结尾添加/删除。

        还有其他可以应用的变体:您是否还可以找到一种实现,使得在开头、结尾和(恰好)中间插入/删除是有效的并且有 O(1) 时间?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-10-08
          • 2020-01-15
          • 2022-01-20
          • 1970-01-01
          相关资源
          最近更新 更多