数组的随机访问

现在用一个长度为10的数组int[] a = new int[10]进行举例。在图中,计算机给a[10]分配了1000~1039这样的连续空间,首地址 base_address = 1000。

ios从数组随机选取数据 数组随机查找_数据


在计算机中,给每一个内存单元分配一个地址,通过地址来访问内存。当计算机需要随机访问数组元素,可以通过下边的公式来查询:

a[i]_address = base_address + i * data_type_size

data_type_size是每个元素占内存的大小,在这个例子中,data_type_size=4字节。“链表适合插入、删除,时间复杂度 O(1);数组适合查找,查找时间复杂度为 O(1)”,这种说法是不准确的。数组是适合查找,但即使是排好序的数据,使用二分查找,时间复杂度也是O(logn)。所以正确的表述是,数组支持随机访问,根据下标随机查找的时间复杂度是O(1)。

低效的“插入”和“删除”

数组为了保持内存中数据的连续性,导致数组插入和删除比较低效。
假设数据中有n个元素,即数组的长度为n。
如果这个数组的元素是有序的,接下来分析一下需要往第k个位置插入一个元素的时间复杂度。为了把第k个位置腾出来,那么就需要把原先k~n个元素都往后移动一位。若是在最后一位插入数据,那么就不需要移动任何数据,直接执行插入操作,所以最好情况时间复杂度为O(1)。若是需要在第一个位置插入数据,那么需要移动数组中所有元素,所以最坏情况时间复杂度T(n)=O(n)。接下来分析平均时间复杂度,需要注意的是插入数据和移动数据都需要用时间复杂度进行衡量的,参考可以用两种方式进行分析:
1.平均时间复杂度等于各种情况所需的时间求和除以所有的情况数,即往n个位置中插入1个元素,可以插入索引为0到索引为n-1的n种位置,其中插入位置为0所需搬迁元素个数为ios从数组随机选取数据 数组随机查找_数据结构_02,插入需要1下操作,所以这种情况所需的时间为ios从数组随机选取数据 数组随机查找_ios从数组随机选取数据_03;插入位置为1所需搬迁元素个数为ios从数组随机选取数据 数组随机查找_时间复杂度_04,插入需要1下操作,这种情况所需的时间为ios从数组随机选取数据 数组随机查找_数据结构_02;以此类推,插入位置为n所需搬迁元素为0,插入需要1下操作,这种情况所需的时间为1;。各种情况所需时间求和ios从数组随机选取数据 数组随机查找_时间复杂度_06,根据等差数列求和公式可得ios从数组随机选取数据 数组随机查找_数据结构_07, 情况数为n。 因此平均时间复杂度ios从数组随机选取数据 数组随机查找_时间复杂度_08,忽略常数和系数之后,平均时间复杂度ios从数组随机选取数据 数组随机查找_数组_09
2.平均时间复杂度等于每种情况的平均时间复杂度值叠加。插入任何位置的概率都是 ios从数组随机选取数据 数组随机查找_时间复杂度_10, 插入位置0,需要移动ios从数组随机选取数据 数组随机查找_数据结构_02个元素,进行一个元素的插入操作,插入其时间复杂度为ios从数组随机选取数据 数组随机查找_数组_12,插入位置1,需要移动n-2个元素,进行一个元素的插入操作,时间复杂度为 ios从数组随机选取数据 数组随机查找_数组_13…… 即所有时间复杂度和为:ios从数组随机选取数据 数组随机查找_ios从数组随机选取数据_14
如果数组是无序的,只是把它当成储存元素的一个集合,还往第k个位置插入一个元素,那么最简单的方法就是把数组第k个位置的元素移到最后位置,然后在第k个位置插入想要放入数组的元素,这样只涉及一次移动操作和一次插入操作,所以时间复杂度T(n)=O(1)。要是不明白为什么有两次操作,时间复杂度依然为O(1),可以查看《复杂度实例分析》。
和插入数据一样,删除数据需要保持数组的内存连续性,如果删除最后一个位置的数据,那么最好时间复杂度为O(1);如果删除第一个位置的数据,那么需要搬移ios从数组随机选取数据 数组随机查找_数据结构_02个数据,最坏时间复杂度为O(ios从数组随机选取数据 数组随机查找_ios从数组随机选取数据_03)。平均时间复杂度分析如下:
若是删除第n位数据,只需要删除1个数据,不移动数据,时间复杂度则为1;
若删除第(n-1)位元素,只需要删除1个数据,移动1个数据,时间复杂度则为2;
……
若删除第2位元素,只需要删除1个数据,移动(n-2)个数据,时间复杂度则为(n-1)。
若删除第1位元素,只需要删除1个数据,移动(n-1)个数据,时间复杂度则为n。
每个元素被删除的概率为1/n。故而平均时间复杂度T(n)=[1+2+…+(n-1)+n]*(1/n)=[n(1+n)/2]*(1/n)=(n+1)/2=O(n)。
——极客时间《数据结构与算法之美》学习笔记 Day 9