Vector 在方案中使用位向量

Vector 在方案中使用位向量,vector,functional-programming,scheme,Vector,Functional Programming,Scheme,所以我想在scheme中生成一个位向量。然后在散列函数h(v)=X之后取一个somethings值。然后将位向量中的位置从0设置为1。关于如何创建位向量,然后操纵向量中的特定位置,有什么想法吗?谢谢我假设您需要一个二进制数的向量,如果是这样的话: (let ((vec (make-vector n 0))) (vector-set! vec x 1) vec) 在您需要位向量的情况下,我只在&中看到了它们,接口不同。如您所述,我们可以使用向量数据结构在Scheme中表示位向量,请参阅您

所以我想在scheme中生成一个位向量。然后在散列函数h(v)=X之后取一个somethings值。然后将位向量中的位置从0设置为1。关于如何创建位向量,然后操纵向量中的特定位置,有什么想法吗?谢谢

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

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

在您需要位向量的情况下,我只在&中看到了它们,接口不同。

如您所述,我们可以使用
向量
数据结构在Scheme中表示位向量,请参阅您的解释器。作为第一步,创建一个新的
向量
,其中包含预期的最大元素数,并用零初始化它。例如,要创建大小为
10
的向量,请执行以下操作:

(define bit-vector (make-vector 10 0))
bit-vector
=> '#(0 0 0 0 0 0 0 0 0 0)
要在给定值中设置索引,请使用
向量集。假设我们想将索引
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)

我使用使向量大小。创建位向量。现在我想返回真的索引值,例如01='(24)来获得真值的索引,比如:(filter(lambda(x)(>=x0))(map(lambda(e,I)(if(eq)e1)I-1))(vector->list vec)(范围内(vector lenght vec)))