gpt4 book ai didi

common-lisp - 如何 (zerop #*000) 在普通 lisp 中?

转载 作者:行者123 更新时间:2023-12-03 14:15:12 25 4
gpt4 key购买 nike

有没有一种有效的方法来检查位向量是否全为零? (我在 Linux 上使用 SBCL。)我浏览了文档,但找不到合适的函数。到目前为止我想出的最好的是:

(defun bit-zerop (array)
(equal array (make-array (length array) :element-type 'bit)))

(bit-zerop #*000)

我也试过

(defun bit-zerop (array)
(dotimes (i (length array))
(if (eql (sbit array i) 1)
(return-from bit-zerop nil)))
t)

但它在较大的位向量上比第一个版本慢大约 100 倍。 (这是预期的,因为每个 64 位字被读取 64 次,我猜,而不是一次)。当然,第一个版本是次优的,它必须分配一个新数组。

编辑:上述解决方案的时间安排。

编辑 2:带有类型声明的时间。

(defun bit-zerop-1 (array)
;; (declare (simple-bit-vector array))
(equal array (make-array (length array) :element-type 'bit)))

(defun bit-zerop-2 (array)
;; (declare (simple-bit-vector array))
(every #'zerop array))

(defun bit-zerop-3 (array)
;; (declare (simple-bit-vector array))
(loop
for bit across array
never (= bit 1)))

(defun bit-zerop-4 (array)
;; (declare (simple-bit-vector array))
(not (find 1 array)))

(dolist (func '(bit-zerop-1 bit-zerop-2 bit-zerop-3 bit-zerop-4))
(dolist (size '(10 100 1000))
(let ((x (make-array size :element-type 'bit)))
(format t "Testing ~a on ~a elements~%" func size)
(time
(dotimes (i 1000000)
(funcall func x))))))



================================================
方法 大小 10 大小 100 大小 1000
------------------- 无类型 -------------------
位零 1 0.030 秒 0.030 秒 0.058 秒
位零 2 0.112 秒 1.000 秒 9.324 秒
bit-zerop-3 0.111 s 0.935 s 8.742 s
位零 4 0.047 秒 0.047 秒 0.063 秒
-------------------- 输入--------------------
位零 1 0.025 秒 0.023 秒 0.040 秒
位零 2 0.036 秒 0.315 秒 3.005 秒
bit-zerop-3 0.041 s 0.348 s 3.346 s
位zerop-4 0.010 s 0.012 s 0.026 s
================================================

最佳答案

这是一个选项:

(defun bit-vector-zerop (bit-vector)
(not (find 1 bit-vector)))

这不是缺点,并且在 SBCL 上非常有效。如果您可以将参数声明为位向量,则速度会更快。

关于common-lisp - 如何 (zerop #*000) 在普通 lisp 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61372322/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com