【问题标题】:C Array Insertion/DeletionC 数组插入/删除
【发布时间】:2021-06-06 20:13:51
【问题描述】:

对于array,表示插入和删除是0(n)

与此相关的两个问题:

  • 什么是“插入”或“删除”操作?例如,下面会是插入吗?

    int numbers[10];
    numbers[4] = 12; // this would be 0(1) though (?)
    
  • 这是指一个动态数组,其中插入/删除意味着列表中涉及一些调整大小?也就是说,如果我们有一个 10 位数的数组并且我们想要删除元素 4,而不是执行 numbers[3] = 0,这意味着我们想要获得一个大小为 9 的数组,其中前一个条目是第五个位置的项目?例如:

    int numbers2[9];
    memcpy(numbers2, numbers, sizeof(int) * 3);
    memcpy(numbers2+3, numbers+4, sizeof(int) * 6);
    

【问题讨论】:

  • 您的示例不是插入新元素,而是覆盖现有元素。
  • 小心不要把这些复杂性看得太重——它们是正确的,按照传统的定义,但有些是苹果,有些是橘子。例如,插入数组定义为在索引处插入,但插入链表定义为插入光标后。如果您必须在索引处插入到链表中,并且您还没有光标到插入位置,则必须首先搜索它,即 Θ(n)。这就是为什么重要的是要了解如何计算它们以及它们来自哪里,而不是仅仅记住一个公式表。

标签: c algorithm data-structures big-o


【解决方案1】:

在数组中添加或删除元素意味着您需要向上或向下移动现有元素以考虑添加或删除的元素。

例如:

// assumes the array has capacity to add a member
void add_array(int *arr, int len, int index, int value)
{
    int i;
    for (i=len-1; i>index; i--) {
        arr[i+1] =  arr[i];
    }
    arry[index] = value;
}

void remove_array(int *arr, int len, int index)
{
    int i;
    for (i=index; i<len-1; i++) {
        arr[i] =  arr[i+1];
    }
}

这是 O(n),因为平均而言,它需要 n 次迭代来执行必要的移位。

【讨论】:

    猜你喜欢
    • 2017-07-17
    • 2012-08-03
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    相关资源
    最近更新 更多