第四节:特殊数据结构.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第四章:特殊数据结构 在之前的章节⾥,我们讨论了列表,Lisp 最多功能的数据结构。本章将演⽰如何使 Lisp 其它的数据结构:数组 (包含向量与字符串),结构以及哈希表。它们或许不像 列表这么灵活,但存取速度更快并使 了更少空间。 Common Lisp 还有另⼀种数据结构:实例 (instance )。实例将在 11 章讨论,讲述 CLOS 。 4 .1 数组 (Array) 4 .2 ⽰例:⼆叉搜索 (Example: Binary Search) 4 .3 字符与字符串 (Strin s and Characters) 4 .4 序列 (Sequences) 4 .5 ⽰例:解析⽇期 (Example: Parsin Dates) 4 .6 结构 (Structures) 4 .7 ⽰例:⼆叉搜索树 (Example: Binary Search Tree) 4 .8 哈希表 (Hash Table) Chapter 4 总结 (Summary) Chapter 4 习题 (Exercises) 4.1 数组 (Array) 在 Common Lisp ⾥,你可以调 make-array 来构造⼀个数组,第⼀个实参为⼀个 指定数组维度的列表。要构造⼀个 2 x 3 的数组,我们可以: (setf arr (make-array (2 3) :initial-element nil)) #Simple-Array T (2 3) BFC FE Common Lisp 的数组⾄少可以达到七个维度,每个维度⾄少可以容纳 1023 个元素。 :initial-element 实参是选择性的。如果有提供这个实参,整个数组会 这个值 作为初始值。若试著取出未初始化的数组内的元素,其结果为未定义 (undefined )。 aref 取出数组内的元素。与 Common Lisp 的存取函数⼀样, aref 是零索引的 (zero-indexed ): (aref arr 0 0) NIL 要替换数组的某个元素,我们使 setf 与 aref : (setf (aref arr 0 0) b) B (aref arr 0 0) B 要表⽰字⾯常量的数组 (literal array ),使 #na 语法,其中 n 是数组的维度。举例 来说,我们可以这样表⽰ arr 这个数组: #2a((b nil nil) (nil nil nil)) 如果全局变量 *print-array* 为真,则数组会 以下形式来显⽰: (setf *print-array* t) T arr #2A((B NIL NIL) (NIL NIL NIL)) 如果我们只想要⼀维的数组,你可以给 make-array 第⼀个实参传⼀个整数,⽽不 是⼀个列表: (setf vec (make-array :initial-element nil)) #(NIL NIL NIL NIL) ⼀维数组又称为向量 (vector )。你可以通过调 vector 来⼀步骤构造及填满向 量,向量的元素可以是任何类型: (vector a b 3) #(a b 3) 字⾯常量的数组可以表⽰成 #na ,字⾯常量的向量也可以 这种语法表达。 可以 aref 来存取向量,但有⼀个更快的函数叫做 svref ,专门 来存取向量。 (svref vec 0) NIL 在 svref 内的 “sv” 代表“简单向量” (“simple vector” ),所有的向量缺省是简单向 量。 [1] 4.2 ⽰例:⼆叉搜索 (Example: Binary Search) 作为⼀个⽰例,这⼩节演⽰如何写⼀个在排序好的向量⾥搜索对象的函数。如果我们 知道⼀个向量是排序好的,我们可以⽐ (65页)find 做的更好, find 必须依序检 查每⼀个元素。我们可以直接跳到向量中间开始找。如果中间的元素是我们要找的对 象,搜索完毕。要不然我们持续往左半部或往右半部搜索,取决于对象是⼩于或⼤于 中间的元素。 图 4 .1 包含了⼀个这么⼯作的函数。其实这两个函数: bin-search 设置初始范围及 发送控制信号给 finder , finder 寻找向量 vec内 obj 是否介于 start 及 en

文档评论(0)

kehan123 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档