所以我想在方案中生成一个位向量。然后在哈希函数h(v)= X之后取一个somes值。然后将位向量中的位置设置为0到1。关于如何创建位向量然后操纵向量中的特定位置的任何想法?谢谢
如您所述,我们可以使用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] 删除。
我来说两句