数组增删查时间复杂度

无序数组的插入:常数

      无序数组的插入是我们到现在为止所见过的算法中唯一一个与数组中的数据项个数无关的算法。新数据项总是被放在下一个有空的地方,无论nElems如何增加,无论数组中的数据项个数N有多大,一个插入总是用相同的时间,我们可以说向一个无序数组中插入一个数据项的时间T是一个常数K:即 T=K  
    在现实情况中,插入所需的实际时间与以下这些因素有关,微处理器,编译程序生成程序代码的效率,等等,上面等式中的常数K包含了所有这些因素,在现实情况中得到K的值,需要测量一次插入所花费的时间,K就等于这个时间。

线性查找:与N成正比

      在数组数据项的线性查找中,我们已经发现特定数据项所需的比较次数平均为数据总数的一半,因此设N为数据项总是,搜索时间T与N的一半成正比:T=K*N/2
      同插入一样若要得到方程中K的值,首先需要对某个N值(有可能很大)的查找进行计时,然后用T来计算K。当得到K后便可以对任意N的值来计算T。
      将2并入K可以得到一个更加方便的公式。新K值等于原先的K除以2,新公式为:T=K*N
      这个方程说明平均线性查找时间与数组的大小成正比,即如果一个数组增大两倍,所花费的查找时间也会相应的增长为两倍。

二分查找:与log(N)成正比

      同样我们可以为二分查找制定一个与T和N有关的公式:T=K*log2(N)(log以2为底N的对数)和前面所说的,时间T与以2为底N的对数成正比。实际上由于所有的对数都和其他对数成比例(从底数位2转换到底数位10需乘以3.332),我们可以将这个为常数的底数也并入K。由此不必指定底数:T=K*log(N)

不要常数

      大O表示法同上面的公式比较类似,但他省去了常数K。当比较算法时,并不在乎具体的微处理器芯片或编译器,真正需要比较的是对应不同的N值,T如何变化的,而不是具体的数字,因此不需要常数。
      大O表示法使用大写字母O,可以认为其含义是“order of”(大约是)。我们可以使用大O表示法来描述线性查找使用了O(N)级时间,二分查找使用了O(logN)级时间。向一个无序数组中的插入使用了O(1),或常数级时间。

用大O法表示运行时间

      - 线性查找            O(N)
      - 二分查找            O(logN)
      - 无序数组的插入        O(1)
      - 有序数组的插入        O(N)
      - 无序数组的删除        O(N)
      - 有序数组的删除        O(N)
      表中的O(1)表示优秀,O(logN)是良好,O(N)是还可以,O(N2)则差一些,大O表示法的实质并不是对运行时间给出实际值,而是表达了运行时间是如何受数据项个数影响的,除了实际安装后真正去测量一次算法的运行时间外,着可能是对算法进行比较的最有意义的方法了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 数组和链表都是常见的数据结构,它们的区别如下: 1. 数组元素在内存中是一块连续的空间,而链表的元素在内存中可以是不连续的。 2. 对于数组,我们可以通过下标直接访问元素,而对于链表,我们需要从头开始遍历整个链表才能找到对应元素。 3. 对于数组插入或删除一个元素可能需要移动其他元素,导致时间复杂度为O(n),而链表插入或删除一个元素只需要改变指针,时间复杂度为O(1)。 4. 对于数组询某个元素时间复杂度为O(1),而对于链表,由于需要遍历,时间复杂度为O(n)。 因此,对于需要频繁进行插入和删除操作的场景,使用链表会更加高效;对于需要频繁进行询操作的场景,使用数组会更加高效。 ### 回答2: 数据结构是计算机中用来组织和存储数据的方式,数组和链表是两种常见的数据结构。 数组是一种线性数据结构,它是由一系列按照顺序排列的元素组成的,可以通过索引访问数组中的元素数组的特点是随机访问速度快,可以在O(1)的时间复杂度内访问任意位置的元素。但是数组的缺点是插入和删除元素的操作比较耗时,需要移动其他元素。 链表是一种非线性数据结构,它由一系列的结点组成,每个结点包括一个数据项和一个指向下一个结点的指针。链表的特点是插入和删除元素的操作比较高效,只需要改变指针的指向即可,不需要移动其他元素。但是链表的访问速度相对较慢,需要遍历链表来找到特定位置的元素。 对于数组和链表的增删操作的时间复杂度如下: - 数组插入和删除操作的时间复杂度为O(n),因为需要移动其他元素来保持顺序。 - 链表的插入和删除操作的时间复杂度为O(1),只需要改变指针的指向。 - 数组找操作的时间复杂度为O(1),可以通过索引直接访问元素。 - 链表的找操作的时间复杂度为O(n),需要遍历链表来找到特定位置的元素。 需要注意的是,以上时间复杂度是指在最坏情况下的时间开销。具体情况还需要根据数据规模和具体实现方式来综合考虑。 ### 回答3: 数据结构是计算机存储、组织数据的方式,数组和链表都是常用的数据结构。数组是一种连续存储结构,而链表是一种离散存储结构。 1. 数组和链表的区别: - 数组元素在内存中是连续存储的,通过索引可以直接访问任意位置元素,随机访问效率高,但插入和删除操作需要移动其他元素,效率较低。 - 链表:元素在内存中是通过指针连接的,每个元素包含一个指向下一个元素的指针,插入和删除操作只需要改变相邻元素的指针,效率较高,但随机访问元素需要遍历链表。 2. 增删时间复杂度: - 数组: - 增加:插入元素数组末尾,时间复杂度为O(1),但如果需要在中间或开头插入元素,需要将后面的元素依次后移,时间复杂度为O(n)。 - 删除:删除数组中的元素时间复杂度为O(n),因为删除后需要将后面的元素依次前移。 - 修改:修改已知索引的元素时间复杂度为O(1)。 - 找:根据索引元素时间复杂度为O(1)。 - 链表: - 增加:插入元素到链表中,时间复杂度为O(1),只需要改变相邻元素的指针。 - 删除:删除链表中的元素时间复杂度为O(1),只需要改变相邻元素的指针。 - 修改:需要先找到要修改的元素的位置,时间复杂度为O(n),然后再修改元素值。 - 找:需要从头节点开始遍历链表直到找到指定元素时间复杂度为O(n)。 综上所述,数组适用于对频繁访问元素插入和删除操作较少的场景;链表适用于对频繁插入和删除元素而随机访问较少的场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值