在方案中使用位向量

乔伊

所以我想在方案中生成一个位向量。然后在哈希函数h(v)= X之后取一个somes值。然后将位向量中的位置设置为0到1。关于如何创建位向量然后操纵向量中的特定位置的任何想法?谢谢

奥斯卡·洛佩兹(Oscar Lopez)

如您所述,我们可以使用vector数据结构表示Scheme中的位向量,请参阅您的解释器的文档第一步,创建一个vector具有所需最大元素数量的新元素,然后将其初始化为零。例如,要创建一个大小为矢量的向量,10请执行以下操作:

(define bit-vector (make-vector 10 0))
bit-vector
=> '#(0 0 0 0 0 0 0 0 0 0)

要将索引设置为给定值,请使用vector-set!假设我们要设置索引3值为1,并注意!结尾处(发音为bang!)表明此过程就地改变了向量:

(vector-set! bit-vector 3 1)
bit-vector
=> '#(0 0 0 1 0 0 0 0 0 0)

最后,要检索给定索引处的值,我们使用vector-ref

(vector-ref bit-vector 3)
=> 1

对于第二部分:如何获取值正确的索引列表?有几种方法,所有方法都涉及遍历向量,在每个位置测试值并将结果累加到列表中。例如,使用显式递归:

(define (true-indexes bit-vector)
  (let loop ([idx (sub1 (vector-length bit-vector))] [acc '()])
    (cond ((negative? idx) acc)
          ((= (vector-ref bit-vector idx) 1)
           (loop (sub1 idx) (cons idx acc)))
          (else
           (loop (sub1 idx) acc)))))

如果您幸运的话,并使用完善的Scheme解释器,我们可以根据迭代和理解来编写惯用的解决方案。例如,在球拍中:

(define (true-indexes bit-vector)
  (for/list ([(val idx) (in-indexed bit-vector)]
             #:when (= val 1))
    idx))

无论哪种方式,它都能按预期工作:

(true-indexes (vector 0 0 1 0 1))
=> '(2 4)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章