《数据结构与抽象:Java语言描述(原书第4版)》一2.2.1 可变大小数组

2.2.1 可变大小数组

策略。当教室满了时,能容纳更多学生的一种办法是移到一间更大的教室。用类似的方式,当数组满了时,可以将它的内容移到一个更大的数组中。这个过程称为调整(resizing)数组大小。图2-7显示两个数组:一个是有5个连续内存单元的原始数组,另一个数组(两倍于原始数组大小)在计算机的另一块内存中。如果将数据从原始的小数组中复制到新的大数组的开头部分,得到的结果像是扩展了原来的数组一样。这种机制的唯一不足是新数组的名字:你想让它与原始数组同名。马上就会看到如何完成这个工作。

细节。假定已有myArray指向的数组,如图2-8a所示。我们先定义一个别名oldArray,它也指向这个数组,如图2-8b所示。下一步是创建一个比原始数组更大的新数组,让myArray指向这个新数组。如图2-8c所示,一般地新数组要两倍于原始数组的大小。最后一步是将原始数组的内容复制到新数组中(见图2-8d),然后丢弃原始数组(见图2-8e)。下列伪代码概括了这些步骤:

图2-8 a)一个数组;b)指向同一数组的两个引用;c)原始数组变量现在指向新的更大的数组;d)原始数组中的项复制到新数组中;e)丢弃原始数组

注:当数组不再被引用时,它的内存在垃圾回收时被收回,就像是对其他对象发生的那样。
代码。将前面的伪代码转换为Java时,可以使用Java类库中的方法Arrays.copyOf (sourceArray, newLength)来做很多事情。例如,对如下的简单整数数组进行操作:

此时,myArray指向一个数组,如图2-9a所示。接下来,调用Arrays.copyOf。将变量myArray中的引用赋给这个方法的第一个参数sourceArray,如图2-9b所示。接下来,方法创建一个新的更大的数组,并将参数数组中的项复制给它(见图2-9c)。最后,方法返回指向新数组的一个引用(见图2-9d),我们将这个引用赋给myArray(见图2-9e)。下面的语句执行这些步骤:

图2-9 语句myArray = Arrays.copyOf(myArray, 2 * myArray.length);的效果。a)参数数组;
b)指向参数数组的参数;c)获得参数数组内容的新的更大的数组;d)指向新数组的返回值;
e)将返回值赋给参数变量

注:图2-9中的数组含有整数。这些整数是基本类型值,且像这样占据数组中的位置。与之相对,例如图2-6中的数组,含有指向对象的引用而不是对象本身。

调整数组的大小或许没有第一眼看上去这样有吸引力。每次扩展数组的大小时,必须复制它的内容。如果每次需要数组外的一个额外空间而让数组增大一个元素,则这个过程将耗时过大。例如,如果含50个元素的数组满了,为了容纳另一个项,需要将数组复制到有51个元素的数组中。再添加一项时又会要求你将含有51个元素的数组复制到含有52个元素的数组中,以此类推。每次添加都会导致复制数组。如果在原含有50个项的数组中添加100项,则要复制100次数组。
另一种做法是将数组扩展m个元素,将复制开销分摊在m次添加上而不是集中在一次上。每次当数组满时倍增它的大小,这是一种典型的方法。
例如,当在含有50个项的满数组中添加一项时,在进行添加前先将50个元素的数组复制到100个元素的数组中。那么接下来的49次添加都可以快速完成而不需要复制数组。所以数组复制只需一次。

程序设计技巧:当增大数组时,将它的项复制到更大的数组中。应该充分地扩展数组,以减少复制代价的影响。常用的办法是倍增数组大小。
注:说“调整数组的大小”实际上是用词不当,因为数组的长度不会改变。调整数组大小的过程是创建了一个含有原始数组项的全新数组。给新数组与原始数组一样的名字——换句话说,指向新数组的引用赋给指向原始数组引用的变量。然后丢弃原始数组。
注:引入一个类

若一个类使用了Java类库中的类,则它的定义前必须有import语句。例如,要使用类Arrays,应该将下面的语句写在你的类定义和描述性注释之前:

有些程序员将这条语句中的Arrays替换为星号,目的是在程序中可以使用包java.util中的所有类。

自测题18 考虑下列语句定义的字符串数组:

为数组text增大5个元素的容量且不改变当前内容的Java语句是什么?

自测题19 考虑字符串数组text。如果放到这个数组中的字符串的个数小于它的长度(容量),你如何减少数组的长度而不改变它的当前内容?假定字符串的个数保存在变量size中。

时间: 2024-11-03 21:18:22

《数据结构与抽象:Java语言描述(原书第4版)》一2.2.1 可变大小数组的相关文章

《机器学习与R语言(原书第2版)》一2.3 探索和理解数据

本节书摘来自华章出版社<机器学习与R语言(原书第2版)>一书中的第2章,第2.3节,美] 布雷特·兰茨(Brett Lantz) 著,李洪成 许金炜 李舰 译更多章节内容可以访问"华章计算机"公众号查看. 2.3 探索和理解数据 在收集数据并把它们载入R数据结构以后,机器学习的下一个步骤是仔细检查数据.在这个步骤中,你将开始探索数据的特征和案例,并且找到数据的独特之处.你对数据的理解越深刻,你将会更好地让机器学习模型匹配你的学习问题. 理解数据探索的最好方法就是通过例子.在

《机器学习与R语言(原书第2版)》一第3章 懒惰学习——使用近邻分类

本节书摘来自华章出版社<机器学习与R语言(原书第2版)>一书中的第3章,第3.1节,美] 布雷特·兰茨(Brett Lantz) 著,李洪成 许金炜 李舰 译更多章节内容可以访问"华章计算机"公众号查看. 第3章 懒惰学习--使用近邻分类 一种新型有趣的餐饮体验已经出现在世界各地的城市中,顾客在一个完全黑暗的餐厅里接受服务,而服务员在仅凭触觉和听觉记忆的路上小心地移动.这些餐厅的魅力在于这样的信仰:去掉一个人的视觉感官输入将会增强他的味觉和嗅觉,从而可以使他以一种全新的方式

《机器学习与R语言(原书第2版)》一1.3 机器如何学习

本节书摘来自华章出版社<机器学习与R语言(原书第2版)>一书中的第1章,第1.3节,美] 布雷特·兰茨(Brett Lantz) 著,李洪成 许金炜 李舰 译更多章节内容可以访问"华章计算机"公众号查看. 1.3 机器如何学习 机器学习的一个正式定义是由计算机科学家Tom M. Mitchell提出的:如果机器能够获取经验并且能利用它们,在以后的类似经验中能够提高它的表现,这就称为机器学习.尽管这个定义是直观的,但是它完全忽略了经验如何转换成未来行动的过程,当然学习总是说起

《机器学习与R语言(原书第2版)》一1.6 总结

本节书摘来自华章出版社<机器学习与R语言(原书第2版)>一书中的第1章,第1.6节,美] 布雷特·兰茨(Brett Lantz) 著,李洪成 许金炜 李舰 译更多章节内容可以访问"华章计算机"公众号查看. 1.6 总结 机器学习起源于统计学.数据库科学和计算机科学的交叉.它是一个强大的工具,能够在大量的数据中找到可行动的洞察.然而,人们仍需持谨慎的态度,避免现实生活中机器学习的普遍滥用. 从概念上讲,机器学习涉及把数据抽象为结构化表示,并把这个结构化表示进行一般化从而推广到

《机器学习与R语言(原书第2版)》一1.5 使用R进行机器学习

本节书摘来自华章出版社<机器学习与R语言(原书第2版)>一书中的第1章,第1.5节,美] 布雷特·兰茨(Brett Lantz) 著,李洪成 许金炜 李舰 译更多章节内容可以访问"华章计算机"公众号查看. 1.5 使用R进行机器学习 机器学习所需要的很多算法都没有包含在R的基本安装中.但一个很大社区的专家免费分享他们的机器学习成果,机器学习所需要的算法就是通过这种方式得到.这些必须通过手动方式安装在R基础安装包之上.多亏R是免费的开源软件,没有为这种功能额外收费.那些能在用

《机器学习与R语言(原书第2版)》一 第2章 数据的管理和理解

本节书摘来自华章出版社<机器学习与R语言(原书第2版)>一书中的第2章,第2.1节,美] 布雷特·兰茨(Brett Lantz) 著,李洪成 许金炜 李舰 译更多章节内容可以访问"华章计算机"公众号查看. 第2章 数据的管理和理解 任何机器学习项目初期的核心部分都是与管理和理解所收集的数据有关的.尽管你可能发现这些工作不像建立和部署模型那样令人有成就感(建立和部署模型阶段就开始看到了劳动的成果),但是忽视这些重要的准备工作是不明智的.任何学习算法的好坏取决于输入数据的好坏.

机器学习与R语言(原书第2版)》一1.4 实践中的机器学习

本节书摘来自华章出版社<机器学习与R语言(原书第2版)>一书中的第1章,第1.4节,美] 布雷特·兰茨(Brett Lantz) 著,李洪成 许金炜 李舰 译更多章节内容可以访问"华章计算机"公众号查看. 1.4 实践中的机器学习 到目前为止,我们已经讲述了理论上机器学习是如何工作的.为了把机器学习应用到真实世界的任务中,我们将采用由5个步骤构成的过程.不管你手头是何种任务,任何机器学习算法都能由下面这些步骤来实施:1)数据收集:数据收集步骤包括收集算法用来生成可行动知识的

《机器学习与R语言(原书第2版)》一2.2 用R管理数据

本节书摘来自华章出版社<机器学习与R语言(原书第2版)>一书中的第2章,第2.2节,美] 布雷特·兰茨(Brett Lantz) 著,李洪成 许金炜 李舰 译更多章节内容可以访问"华章计算机"公众号查看. 2.2 用R管理数据 当处理大量数据集时,面临的挑战包括收集.准备和管理来自各种不同来源的数据.尽管通过学习后面章节中的真实世界的机器学习任务,我们会深入地涉及数据准备.数据清理和数据管理,但本节重点讲述基本的R数据导入和导出功能. 2.2.1 保存.载入和移除R数据结构

《机器学习与R语言(原书第2版)》一 第1章 机器学习简介

本节书摘来自华章出版社<机器学习与R语言(原书第2版)>一书中的第1章,第1.1节,美] 布雷特·兰茨(Brett Lantz) 著,李洪成 许金炜 李舰 译更多章节内容可以访问"华章计算机"公众号查看. 第1章 机器学习简介 如果科幻故事是可信的,那么人工智能的发明将会不可避免地导致机器和其制造者之间的末日战争.在计算机使用的早期,计算机被教会玩井字棋和国际象棋这样一些简单的游戏.后来,机器被用来控制交通信号灯和通信,随后用来控制军用无人机和导弹.一旦计算机有感知力并且知

《机器学习与R语言(原书第2版)》一2.4 总结

本节书摘来自华章出版社<机器学习与R语言(原书第2版)>一书中的第2章,第2.4节,美] 布雷特·兰茨(Brett Lantz) 著,李洪成 许金炜 李舰 译更多章节内容可以访问"华章计算机"公众号查看. 2.4 总结 在本章中,我们学习了在R中管理数据的基础.从深入剖析用来存储不同类型数据的数据结构开始.R数据的基本结构是向量,它扩展和组合成更复杂的数据结构,比如,列表和数据框.数据框是与数据集概念相联系的R数据结构,数据框内同时有特征和案例.R提供了从电子表格类的数据文