【问题标题】:Vector in scheme方案中的向量
【发布时间】:2021-06-09 21:38:40
【问题描述】:

来自 Racket 中equals? 的文档:

相等?递归比较对、向量和字符串的内容,应用 eqv?在其他对象上,例如数字和符号。一个经验法则是对象通常是相等的?如果他们打印相同。平等的?如果其参数是循环数据结构,则可能无法终止。

(equal? 'a 'a)                          ===>  #t`
(equal? '(a) '(a))                      ===>  #t`

scheme 中的向量到底是什么?例如,(1. 2) 是向量吗? (1 2) 是向量吗? (1 2 3 4) 是向量吗?等等

文档列出了向量和vector? 等的提及,但我想知道他们是否只是使用向量来表示“列表”或其他内容:https://people.csail.mit.edu/jaffer/r5rs/Disjointness-of-types.html#Disjointness-of-types

【问题讨论】:

  • 仅供参考,他们在 SICP 中几乎没有提到向量,直到后面的章节你才会听说它们。单链表是 Scheme 中首选的数据结构。
  • 顺便说一句,如果你在做 SICP,他们使用 MIT 方案,该方案也有在线文档。如果您使用的是不同的版本,阅读它的内容可能仍然是一个好主意:web.mit.edu/scheme_v9.2/doc/mit-scheme-ref/index.html

标签: scheme lisp racket


【解决方案1】:

向量是一个vector。它是一种不同的数据结构,类似于我们在其他编程语言中通常所说的“数组”。它有两种风格,可变的和不可变的 - 例如:

(vector 1 2 3) ; creates a mutable vector via a procedure call
=> '#(1 2 3)

'#(1 2 3) ; an immutable vector literal
=> '#(1 2 3)

(vector-length '#(1 2 3))
=> 3

(vector-ref '#(1 2 3) 1)
=> 2

(define vec (vector 1 2 3))
(vector-set! vec 1 'x)
vec
=> '#(1 x 3)

您可能会问自己,与旧列表相比,向量有哪些优势。好吧,可变向量可以就地修改它,并且在给定索引的情况下访问一个元素是一个常数 O(1) 操作,而在列表中相同的操作是 O(n)。同样对于长度操作。缺点是你不能在创建向量后增加它的大小(与 Python 列表不同);如果您需要添加更多元素,则必须创建一个新向量。

有许多特定于向量的操作反映了可用于列表的过程;我们有vector-mapvector-filter 等等,但我们也有像vector-map! 这样的东西,它们可以就地修改向量,而不创建新向量。更多详情请查看documentation

【讨论】:

  • SRFI-214 定义可调整大小的向量,fwiw。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-16
  • 2012-11-19
  • 1970-01-01
相关资源
最近更新 更多