在方案中使用位向量

时间:2014-11-23 21:16:40

标签: vector functional-programming scheme

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

2 个答案:

答案 0 :(得分:1)

如您所述,我们可以使用vector数据结构来表示Scheme中的位向量,请参阅解释器的documentation。首先,使用您期望的最大元素数创建一个新的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

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

(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解释器,我们可以根据迭代和理解来编写一个惯用的解决方案。例如,在Racket中:

(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)

答案 1 :(得分:0)

如果是这样的话,我会假设你想要一个二进制数的向量:

(let ((vec (make-vector n 0)))
  (vector-set! vec x 1)
  vec)

如果你需要一个位向量,我只在guile& chiken scheme,界面不同。