问:链表和数组各有自己的优越性,那么分别在什么情况下使用更适合?
当我们期望进行频繁的插入和删除时,链表比数组更有优势。然而,如果当我们期望进行随机访问的次数高于插入和删除操作的次数时,数组就显得更有优势了。随机访问时数组的强项,因为他们的元素在内存中是连续排列的。哲宗连续的排列方式使得数组中的任何元素能够在O(1)的时间内通过其索引访问。回顾一下访问链表中元素的方法,我们必须的有一个指向元素的指针,如果我们对访问元素的方法不是很了解的话,那么要获取一个指向特定元素的指针的代价就非常高。在实际中,对于许多的应用程序来说,我们必须要遍历链表的一部分。如果存储数据的总量是一定的,那么数组会有一定的优势,数组不需要额外的指针是他们的元素链接起来,也不需要动态的申请空间。
问:关于链表的插入、删除、记忆访问元素的操作和数组相比有何差异?
回顾一下各种形式的链表,除了销毁链表的操作外,其他的操作都是O(1)的空间复杂度。确实,这种表现似乎很难控制。然而,在分析过程中我们会发现有一点并没有说明,那就是对于许多的链表来说,想得到指向链表中的特定元素的指针,其操作还还很复杂的。在最坏的情况下,可能要遍历完真个链表。此时的复杂度可能就是O(n)了,这里n代表元素的个数。另外,在一个设计得当的应用中,不如前面介绍的例子页帧的管理,则对此就不会有任何性能上额外开销。因此,观察应用的特点也是很重的。相对于数组来说,插入和删除都是O(n)级别的复杂度操作,因此在最坏的情况下,插入和删除索引为0的元素需要将其他的所有元素都移动一个位置俩调整整个数组的布局。如果我们知道索引数值,则访问数组中的元素就是O(1)的复杂度操作。
所以数组和链表的操作的使用,很大程度上取决于我们所需要的功能。去合理的选择需要的操作!