【CS61B】LEC6 ALists, Resizing, vs. SLists
ALists, Resizing, vs. SLists
列表与数组 我们的 DLList
有一个缺点。获得第i
个项目很慢;我们必须从头到尾扫描列表中的每个项目,直到到达第 i
个项目为止。但是,对于名为 A
的数组,我们可以使用方括号表示法 A[i]
快速访问第i
个项目。因此,我们的目标是实现带有数组的列表。
AList AList
将具有与 DLList
相同的API,这意味着它将具有与 DLList
相同的方法(addLast()
, getLast()
, removeLast()
, and get(int i)
)。 AList也将具有一个跟踪其大小的大小变量。
AList不变式 AList
有一些不变式。
addLast
:我们要添加的下一个项目将进入size
位置。getLast
:我们要返回的项目位置为size-1
。size
:列表中的项目数应为size
。
实现AList 每个 AList
都有一个int[]
叫做 item
。
- 对于
addLast
,我们将项目放置在items[size]
中。 - 对于
getLast
,我们只返回items[size-1]
。 - 对于
removeLast
,我们只是减小size
(我们不需要更改items
)。因此,如果调用addLast
,则由于size
减小了,因此只会覆盖旧值。但是,最好将对象删除后将其清空,因为这样可以节省内存。注意这些方法与不变量有多紧密的联系。
抽象 本课程的一个关键思想是可以将实现细节隐藏在用户面前。例如,用户可能想使用列表,但是作为实现者,我们可以为他们提供列表的任何实现,只要该列表符合其规范即可。用户不应该了解我们列表的内部工作原理。
调整数组大小Array Resizing 当数组满时,我们可以调整数组大小。但是,我们了解到数组大小无法更改。相反,解决方案是创建一个更大的新数组,然后将我们的旧数组值复制到新数组中。现在,我们拥有所有旧值,但是我们有更多空间来添加项目。
调整速度Resizing Speed 在讲座视频中,每次达到数组大小限制时,我们便开始将数组调整大小再增加一个额外框。事实证明这非常慢,因为将数组复制到新数组意味着我们必须对每个项目执行复制操作。最糟糕的部分是,由于我们仅调整了一个额外的框的大小,因此,如果我们选择添加另一项,则每次添加到数组时都必须再次执行此操作。
提高Resizing性能 而不是添加一个额外的框,我们可以创建一个新数组,其大小为 size * FACTOR
项,其中 FACTOR
可以是任何数字,例如2。我们将在本课程的稍后部分讨论为什么这样做很快。
减小数组大小 如果我们拥有一百万个长度的数组,但是我们删除了990,000个元素,该怎么办?好吧,类似地,例如,如果我们达到250,000个元素,则可以通过创建一半大小的数组来缩小数组的大小。同样,我们将在本课程的后面部分对此进行更严格的讨论。
另外:分解代码 有时,我们编写大型方法来完成多项任务。更好的方法是将我们的大型方法分解为许多较小的方法。这样的好处之一是我们可以分部分地测试我们的代码。
泛型AList
上一次,我们讨论了如何制作泛型 DLList
。 我们可以为 AList
做类似的事情。 但是我们发现我们在创建数组时出错了。 我们的问题是Java中不允许使用通用数组。 相反,我们将更改以下行:
items = new Item[100];
改为:
items = (Item[]) new Object[100];
这叫做 cast
,我们将在以后学习。
- 原文作者:jchen
- 原文链接:http://jchenTech.github.io/post/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E5%92%8C%E7%AE%97%E6%B3%95/CS61BLEC6/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。