【发布时间】:2021-10-17 21:44:41
【问题描述】:
我在 bash 中有一个动态生成的索引数组,想知道它是 sparse 还是 dense。
如果在最后一个条目之前存在未设置的索引,则数组是稀疏的。否则数组是密集的。
检查应该适用于所有情况,即使是空数组、非常大的数组(展开时超过 ARG_MAX),当然还有具有任意条目的数组(例如空条目或包含 *、\、空格的条目和换行符)。后者应该相当简单,因为您可能不想扩展数组的值。
理想情况下,检查应该是高效且可移植的。
这里有一些用于检查您的解决方案的基本测试用例。
您的检查可以使用硬编码的全局变量名称 a 以与旧 bash 版本兼容。对于 bash 4.3 及更高版本,您可能需要改用 local -n isDense_array="$1",以便您可以指定要检查的数组。
isDense() {
# INSERT YOUR CHECK HERE
# if array `a` is dense, return 0 (success)
# if array `a` is sparse, return any of 1-255 (failure)
}
test() {
isDense && result=dense || result=sparse
[[ "$result" = "$expected" ]] ||
echo "Test in line $BASH_LINENO failed: $expected array considered $result"
}
expected=dense
a=(); test
a=(''); test
a=(x x x); test
expected=sparse
a=([1]=x); test
a=([1]=); test
a=([0]=x [2]=x); test
a=([4]=x [5]=x [6]=x); test
a=([0]=x [3]=x [4]=x [13]=x); test
要对您的检查进行基准测试,您可以使用
a=($(seq 9999999))
time {
isDense
unset 'a[0]'; isDense
a[0]=1; unset 'a[9999998]'; isDense
a=([0]=x [9999999999]=x); isDense
}
【问题讨论】:
标签: arrays bash sparse-matrix