检查 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 中的索引数组是稀疏还是密集 的相关文章

随机推荐

  • 如何在 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