【发布时间】:2021-01-01 13:54:48
【问题描述】:
给定二维 NxN 位数组,我正在尝试评估确定位数组是否已经在大量先前见过的位数组中的最佳方法。
一种直接的方法是将位数组放入哈希表中。但是比较数组需要一个 #'equalp :test 函数,这可能不是很有效。 (但也许 SBCL 会自动针对不同的密钥类型进行优化?)
另一个计划是将所有位数组转换为整数,并将整数放入哈希表中。那么测试可以是#'eql:
(defun bit-arr-to-int (bit-array)
(reduce (lambda (bit1 bit2)
(+ (* bit1 2) bit2))
(make-array (array-total-size bit-array)
:displaced-to bit-array)))
但不确定这是否最终会比让 SBCL 处理事情更有效,因为它仍然单独处理每个元素。也许定制的哈希表会提供效率优势?
第三种选择可能涉及将基本表示从位数组更改为简单位向量(也称为整数),因为原始位数组的维度是已知的。为了允许数组等效的元素引用,这将需要一个将隐式数组 row,col 坐标转换为显式简单位向量索引的函数。根据需要计算索引可能比为每个哈希表查找将整个位数组转换为整数更有效,如上所述。
欣赏一些经验丰富的见解。
【问题讨论】:
标签: arrays common-lisp bitarray bitvector