检查 bash 中的索引数组是稀疏还是密集

2024-03-22

我在 bash 中有一个动态生成的索引数组,想知道它是否是sparse or 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
}

Approach

非空密集数组的索引来自0 to ${#a[*]}-1。由于鸽巢原理,last稀疏数组的索引必须大于或等于${#a[@]}.

bash脚本

为了获得最后一个索引,我们假设索引列表${!a[@]}是按升序排列的。 Bash 的手册没有指定任何顺序,但是(至少对于 bash 5 及以下版本)实现保证了这个顺序(在源代码文件中array.c搜索array_keys_to_word_list).

isDense() {
  [[ "${#a[*]}" = 0 || " ${!a[*]}" == *" $((${#a[*]}-1))" ]]
}

对于小型阵列,这非常有效。对于巨大的数组,检查有点慢,因为${!a[*]}。该问题的基准测试耗时 9.8 秒。

内置可加载 Bash

这个答案中的方法只需要last指数。但bash只允许提取all索引使用${!a[*]}这是不必要的慢。在内部,bash 知道最后一个索引是什么。因此,如果您愿意,您可以编写一个可加载的内置函数来访问 bash 的内部数据结构。

当然,这不是一个真正实用的解决方案。如果性能真的那么重要,那么您就不应该使用 bash 脚本。尽管如此,我还是为了好玩而编写了这样一个内置函数。

可加载的 bash 内置 https://github.com/schaetzc/bash-loadable-is-array-dense

上述内置函数的空间和时间复杂度与数组的大小和结构无关。检查isdense a应该像这样快b=1.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检查 bash 中的索引数组是稀疏还是密集 的相关文章

  • 从 MySQL 列创建 PHP 数组

    mysql fetch array会给我一个获取行的数组 从一列中所有行的值生成数组的最佳方法是什么 您可以循环遍历数组并创建一个新数组 如下所示 column array while row mysql fetch array info
  • 循环遍历多维数组

    我有一个与此类似的 JSON 文件 Pages Name Home Page index php admin Name Admin Page admin index php Template admin MobileTemplate adm
  • 在C中更改函数内的数组

    我正在学习 C 并且很困惑为什么在 main 中创建的数组不会在函数内部更改 我假设传递的数组是一个指针 并且更改指针应该更改数组 对吧 有人可以解释这种情况下发生了什么吗 谢谢你的帮助 int main int i length 10 i
  • 对常量数组的未定义引用

    a cpp const unsigned char whatever 123 a h extern const unsigned char whatever 123 b cpp include a h unsigned char x wha
  • 在Java中将浮点数组写入文件

    我正在读取 NetCDF 文件 我想将每个数组作为浮点数组读取 然后将浮点数组写入新文件 如果我读取浮点数组 然后迭代数组中的每个元素 使用 DataOutputStream 我可以使其工作 但这非常非常慢 我的 NetCDF 文件超过 1
  • xdotool 类型需要很长时间并导致整个桌面冻结

    我一直在使用xdotool type过去只能在快捷方式上输入耸肩xdotool type 这可行 但总是需要相当长的时间 并导致整个桌面冻结 完全冻结 而不仅仅是输入 几秒钟 不过并没有太打扰我 现在我需要一种方法来从文件中读取内容 对其进
  • 使用 sed 将 old-link-url 替换为 new-link-url

    我正在 bash 中编写一个脚本 将 old link url 替换为 new link url 我的问题是 sed 由于斜杠而无法替换 url 如果我只输入一些文字就可以了 my code sed e s old link new lin
  • 在 Ubuntu 上纯粹通过 bash 脚本安装 mysql 5.7

    我想要一个无需任何手动输入即可安装 MySQL 5 7 实例的 bash 脚本 我正在关注数字海洋教程 https www digitalocean com community tutorials how to install mysql
  • 将 stdout 作为命令行 util 的文件名传递?

    我正在使用一个命令行实用程序 该实用程序需要传递文件名以将输出写入 例如 foo o output txt 它唯一写入的东西stdout是一条消息 表明它运行成功 我希望能够通过管道传输写入的所有内容output txt到另一个命令行实用程
  • 特征密集稀疏矩阵乘积是线程化的吗?

    我知道稀疏密集产品是根据文档进行线程化的 https eigen tuxfamily org dox TopicMultiThreading html https eigen tuxfamily org dox TopicMultiThre
  • Crystal Report:如何计算一个公式中的多个 IF 语句?

    背景 我正在尝试对报告的详细信息行进行一些美观的验证 我有几个名为 Assert 语句的公式 如果测试失败则返回 false 如果通过则返回 true Goal 我想创建一个存储 违反规则 的数组 然后将它们显示在行末尾的字段中 标题为 违
  • JavaScript 数组中的负索引是否会影响数组长度?

    在javascript中我定义了一个像这样的数组 var arr 1 2 3 我也可以做 arr 1 4 现在如果我这样做 arr undefined 我也失去了对值的引用arr 1 所以对我来说 从逻辑上来说 arr 1 也是arr 但是
  • 如何“缩放”numpy 数组?

    我想将形状 h w 的数组缩放 n 倍 从而得到形状 h n w n 的数组 其中 假设我有一个 2x2 数组 array 1 1 0 1 我想将数组缩放为 4x4 array 1 1 1 1 1 1 1 1 0 0 1 1 0 0 1 1
  • 访问 bash 命令行参数 $@ 与 $*

    在许多 SO 问题和 bash 教程中 我发现可以通过两种方式访问 bash 脚本中的命令行参数 gt cat testargs sh bin bash echo you passed me echo you passed me 结果是 g
  • ANSI 转义码在行尾有奇怪的行为

    重现步骤 考虑以下 shell 命令 echo e e 41mTest nTest2 e 0mTest3 它打印Test并在下一行中Test2具有红色背景 使用 ANSI 转义码 Test2后面直接是Test3这是无色的 行为 第一次执行此
  • IFS 分隔一个字符串,如“Hello”,“World”,“this”,“is,一个无聊”,“line”

    我正在尝试解析 csv 文件 但 IFS 遇到一些问题 该文件包含如下行 Hello World this is a boring line 各列用逗号分隔 因此我尝试使用以下代码分解该行 IFS read r a tempArr lt l
  • 为什么 Rust 在运行时检查数组边界,而(大多数)其他检查发生在编译时?

    正在阅读基本介绍 http doc rust lang org book arrays vectors and slices html 如果您尝试使用不在数组中的下标 您将收到错误 数组访问在运行时进行边界检查 为什么 Rust 在运行时检
  • 如何有条件地组合两个相同形状的 numpy 数组

    这听起来很简单 但我想我把它想得太复杂了 我想创建一个数组 其元素是从两个形状相同的源数组生成的 具体取决于源数组中哪个元素更大 为了显示 import numpy as np array1 np array 2 3 0 array2 np
  • Javascript:打乱数组中的对象组

    我有一个对象数组 我已按键排序 group如下 使得所有具有相同值的对象group在索引中彼此相邻data 例如 var data foo cat group house foo cat group house foo cat group
  • Android 中的字符串加密

    我正在使用代码进行加密和加密 它没有给出字符串结果 字节数组未转换为字符串 我几乎尝试了所有方法将字节数组转换为字符 但没有给出结果 public class EncryptionTest extends Activity EditText

随机推荐

  • 如何在 Windows Azure 中为 Blob 存储配置 CORS 设置

    我在天蓝色存储中创建了几个容器 并将一些文件上传到这些容器中 现在我需要授予对容器 blob 的域级别访问权限 所以我从代码级别进行了尝试 如下所示 CloudStorageAccount storageAccount CloudStora
  • 如何在具有美丽汤的div中选择一个div类?

    我在 div 标签内有一堆 div 标签 div class foo div class bar I want this div div class unwanted Not this div div div class bar Don t
  • 如何在 Python 中获取输出的大小(以字节为单位)

    首先 我要感谢所有帮助过我的人 环境 我在 Windows 8 操作系统中使用 Python v2 7 我正在使用 COM4 通过在 Python 代码中发送一些命令来与机器人对话 我发送命令getversion到机器人并假设获得一堆数据
  • 验证 OpenSSL 中证书的域

    我需要使用 C land OpenSSL 验证 X509 证书的域 我的理解是 该库不会为我执行此操作 并且我必须大致实现以下算法 如果 subjectAlternativeName 扩展的 dnsName 字段存在 则设置name到那个值
  • 如何强制关闭新行上的 HTML 标签?

    在 VS Code 中 我广泛使用 Beautify 但让我感到不安的是 关闭标签总是与 浮动 文本或自关闭标签位于同一行 例如 在 Beautify 之前 div class wrap img src wp content uploads
  • 以编程方式缩小网页

    我们构建了一个在 19 英寸屏幕上完美运行的 Web 应用程序 在 Firefox 上作为 KIOSK 运行 它包含大量图像和围绕这些图像放置的内容文本 在我们将设备更改为 18 5 英寸屏幕之前 它运行得很好 现在 它周围有滚动条 内容和
  • python distutils:访问已编译扩展的名称

    我使用 distutils 编译一个基于 swig 的扩展模块 python setup py build ext产生文件 my module ext cpython 32m so 来自一个 c and a i文件 这个名称似乎取决于所使用
  • 在 JavaScript 中使用全局变量

    我该怎么做呢 我的代码是这样的 var number null function playSong artist title song id alert old number was number var number 10 alert n
  • 如何在grails shiro中使用缓存权限

    每次我打电话subject isPermitted 它向数据库发送一条sql 我怎样才能缓存它 有什么例子吗 谢谢 我阅读了 shiro grails 插件的文档 但无法解决它 数据源 hibernate cache use second
  • 删除 Ruby 中的换行符

    我在删除时遇到问题 n and r标签 当我使用双引号时 它工作正常 否则它会离开 With gsub 如果没有双引号 它根本不起作用 为什么 Remove n delete n result Remove Remove n delete
  • 调用 MVC4 Razor DisplayTemplate,生成 HTML,但未渲染到浏览器

    我有一个迭代集合并调用的视图DisplayFor 对于集合中的每个元素 我需要手动迭代 而不是将集合传递给 DisplayFor 以便告诉模板是否应该在列表中绘制中断 列表中的项目只有两种类型 按它们排序 因此我只需要显示此中断一次 我的模
  • 具有高级混合索引的 Numpy 子数组分配

    原问题 当我尝试分配数组的某些元素时 我收到一条非常奇怪的错误消息 我使用切片和一组索引的组合 请参阅以下简单示例 import scipy as sp a sp zeros 3 4 5 b sp ones 4 5 I sp array 0
  • 本地主机和带有 Auth0 的 CORS 不允许我登录

    我正在制作一个 React 应用程序并尝试使用 Auth0 进行身份验证 尝试登录后 它返回 XMLHttpRequest 无法加载https my domain auth0 com 用户名密码 登录 https my domain aut
  • 了解 matplotlib:plt、figure、ax(arr)?

    我并不是很陌生matplotlib我非常羞愧地承认我一直使用它作为尽可能快速 轻松地获得解决方案的工具 所以我知道如何获得基本的情节 子情节和东西 并且有相当多的代码可以不时地重用 但我没有 深入的 呃 知识 matplotlib 最近我想
  • R 中的 Reduce() 对相似变量名导致错误

    我有 19 个由 lapply 和 split 操作生成的嵌套列表 这些列表的形式如下 list1 Var col1 col2 col3 A 2 3 4 B 3 4 5 list2 Var col1 col2 col3 A 5 6 7 B
  • MYSQL 选择一列中的两个值

    我需要从 mysql 表中选择一行 该表中有两行具有相同的值 TABLE articleId keywordId 现在我需要选择一篇文章 其关键字 Id 1 以及关键字 Id 12 每个关键字的链接都有自己的记录 如何执行一个选择查询来知道
  • tomcat 7.0.42 上的 403 访问被拒绝

    我有错误tomcat 7 0 42 上的 403 访问被拒绝访问 Tomcat Manager 应用程序时 这就是我所拥有的tomcat 用户 xml文件 我曾多次尝试更换角色 但没有成功 注意 我从 NetBeans 7 3 1 启动 停
  • 获取 icloud Web 服务端点以获取数据

    我的问题可能看起来很愚蠢 但我在谷歌上进行了太多搜索后才问这个问题 但没有任何线索 我正在使用 iCloud 网络服务 为此 我已将此 Python 代码转换为 PHP https github com picklepete pyiclou
  • ASP.NET Identity 的 IUserSecurityStampStore 接口是什么?

    查看 ASP NET Identity ASP NET 中的新成员身份实现 我在实现自己的接口时遇到了这个接口UserStore Microsoft AspNet Identity Core dll namespace Microsoft
  • 检查 bash 中的索引数组是稀疏还是密集

    我在 bash 中有一个动态生成的索引数组 想知道它是否是sparse or dense 如果在最后一个条目之前有未设置的索引 则数组是稀疏的 否则数组是密集的 该检查应该在每种情况下都有效 即使是空数组 非常大的数组 扩展时超过 ARG