|
|
|
|
移动端

3.2.1 表的简单数组实现

《数据结构与算法分析:Java语言描述(原书第3版)》第3章表、栈和队列,本章讨论最简单和最基本的三种数据结构。实际上, 每一个有意义的程序都将显式地至少使用一种这样的数据结构, 而栈则在程序中总是要被间接地用到, 不管我们在程序中是否做了声明。本节为大家介绍表的简单数组实现。

作者:冯舜玺/陈越 译来源:机械工业出版社|2016-04-13 11:54

【新品产上线啦】51CTO播客,随时随地,碎片化学习

3.2.1 表的简单数组实现

对表的所有这些操作都可以通过使用数组来实现。虽然数组是由固定容量创建的, 但在需要的时候可以用双倍的容量创建一个不同的数组。它解决由于使用数组而产生的最严重的问题, 即从历史上看为了使用一个数组, 需要对表的大小进行估计。而这种估计在Java或任何现代编程语言中都是不需要的。下列程序段解释一个数组arr在必要的时候如何被扩展(其初始长度为10):

数组的实现可以使得printList以线性时间被执行, 而findKth操作则花费常数时间, 这正是我们所能够预期的。不过, 插入和删除的花费却潜藏着昂贵的开销, 这要看插入和删除发生在什么地方。最坏的情形下, 在位置0的插入(即在表的前端插入)首先需要将整个数组后移一个位置以空出空间来, 而删除第一个元素则需要将表中的所有元素前移一个位置, 因此这两种操作的最坏情况为O(N)。平均来看, 这两种操作都需要移动表的一半的元素, 因此仍然需要线性时间。另一方面, 如果所有的操作都发生在表的高端, 那就没有元素需要移动, 而添加和删除则只花费O(1)时间。

存在许多情形, 在这些情形下的表是通过在高端进行插入操作建成的, 其后只发生对数组的访问(即只有findKth操作)。在这种情况下, 数组是表的一种恰当的实现。然而, 如果发生对表的一些插入和删除操作, 特别是对表的前端进行, 那么数组就不是一种好的选择。下一节处理另一种数据结构: 链表(linked list)。

喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:342347198

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

程序设计实践双语版

程序设计实践并不只是写代码。程序员必须评论各种折衷方案,在许多可能性之中做出选择、排除错误、做测试和改进程序性能,还要维护自己或其...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊