【问题标题】:Calculating Time Complexity of a Dynamic Array计算动态数组的时间复杂度
【发布时间】:2015-01-18 20:34:52
【问题描述】:

计算基于动态数组的时间复杂度。

在我正在阅读的文本中,它提到了两种动态增加数组的方法。

动态数组方法 1

第一种方法表明您可以构造一个大小为 1 的数组,并在每次将新数据推送到数组时动态增加它。例如,如果您推送新数据,那么您创建一个新数组,该数组的旧大小加 1,并将旧数组中的所有元素复制到新数组,然后添加新数据。文本表明这种方法的时间复杂度为 0(N^2)。我不确定如何?我认为时间复杂度是 O(N),因为您正在为每个可以拥有 N 个新元素的新元素创建一个新数组,并且您正在复制再次近似为 N 的旧元素。因此我认为复杂性是O(N)。

动态数组方法 2

第二种方法建议我们可以通过在每次阵列满时将其容量加倍来降低时间复杂度。例如,如果我们有一个初始容量大小为 4 的数组并且我们将其填满,那么当尝试添加新数据时,我们将创建一个大小为 8 的新数组并将所有旧元素复制到这个新数组中,然后添加新数据。

文中进一步指出,这种方法的时间复杂度为 O(N)。

有人可以澄清一下该方法的时间复杂度如何也是 O(N) 吗?

【问题讨论】:

    标签: arrays algorithm


    【解决方案1】:

    想象一个从一个数组开始,其中包含 1 个元素,然后我们继续追加 N 个元素,一次添加 1 个元素。第一次我们必须将 1 个项目复制到更大的空间,第二次我们必须复制 2 个项目,依此类推。在添加第 N 个项目之前,我们需要复制 N-1 个现有项目,所以总的来说我们已经完成了

    1 + 2 + 3 + ... N-1 = N(N-1)/2
    

    复制,所以这是 O(N^2)

    使用第二种方法,我们复制的频率要低得多:第一次和第二次复制在我们添加这些项目时发生,但是下一次复制在大小为 4 的缓冲区已满时才会发生,之后的复制在大小为 8 时发生缓冲区已满。

    如果 k 满足 2^(k-1)

    1 + 2 + 4 + 8 + ... 2^(k-1) = 2^k - 1 
    

    Copies ,即这是 O(N)

    【讨论】:

      【解决方案2】:

      如果数组元素存储位置已经存在于内存中,则时间仅为内存写入的时间。

      当它不存在时,需要为数组分配更多内存。

      增加的时间因素是例程中用于读取现有数组、追加新元素然后将数组写回内存而不是仅将新元素写入现有内存位置的指令周期数。使用所描述的重新分配方法执行此操作的频率越低。

      如果存储的每个数组元素的大小相同,则公式会很简单。

      【讨论】:

      • 我不太确定你是否理解这个问题....我不是在寻求更好的方法来分配内存存储我是在问如何计算时间复杂度....对于建议的方法1.
      • @user2733436 使用我在这个主题上的回复:stackoverflow.com/questions/21923993/cost-of-array-lists/… 并尝试让你的场景适应它
      猜你喜欢
      • 2014-05-01
      • 2021-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-13
      相关资源
      最近更新 更多