arrays - 数组中值和索引之间的高效一对一映射
问题描述
我需要获取数组中值的索引(即位置),我想知道是否有比使用find
命令更快的方法,通过构建某种包含数组之间映射的映射或查找表值和索引。
以这个数组为例:
th = [0 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90];
现在,假设我有一个值为
angle = 55
我想知道这个值在数组中的位置(正确答案是idx = 12
)。现在,我当然可以使用find
:
idx = find(th==angle)
但是我的问题是,在我的代码中,我需要进行此查找,以获取 inth
值的索引,数(百万)次,并且不断调用该函数angle
似乎有点浪费资源find
,我猜这是循环th
并进行某种比较。
相反,我希望有某种方法可以设置一对一映射或查找表,我可以在其中立即获取与我在 中的值相对应的索引angle
。(注意:我知道我拥有的值angle
将始终与 中的值之一完全对应th
。)所以只要有一些功能
idx = angle2i(angle)
执行此映射:
0 -> 1
5 -> 2
10 -> 3
15 -> 4
20 -> 5
25 -> 6
等等
但我没有看到我应该如何实现这样的查找(嗯,我有几个非常不优雅的想法,我希望并猜测必须有一些聪明的方法)。还是我在这里浪费时间,我应该只使用find
命令吗?
解决方案
您正在寻找containers.Map
.
你可以这样做:
th = [0 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90];
angle2i = containers.Map(th,1:numel(th));
index = angle2i(55)
这是一个通用的解决方案,只需要th
包含唯一元素。它们不需要排序,也不需要是整数(尽管在比较浮点值时必须小心!)。这个解决方案应该比大型数组快得多find
,因为这个解决方案是 O(log n) 而find
解决方案是 O(n)。但是对于非常小的数组,使用的开销containers.Map
就会显现出来。
如果th
保证已排序,那么其他问题的解决方案也可能有用。
当然,如果存在简单的数学关系(如 example 的情况,那么 @mattesyo计算索引th
的 O(1) 解决方案将无法被击败。
推荐阅读
- typescript - 打字稿类型在传播后丢失
- java - 在 javaFX 中使用 arrayList 实现多个按钮
- java - 如何理解用户输入的类型
- vba - 在 Access 中按月份更改图表的比例
- json - 基于 MongoDB 字段中的单位转换字符串
- mysql - 使用 Group By 时重复值
- wikipedia - commons.wikimedia 上文件的附加链接:是否可以使用 SPARQL 或 API 查询它们?
- ios - 在 iOS (swift4.2) 中使用 life-ray 上传图片
- html - Popover Bootstrap 通过延迟显示和隐藏 HTML 属性的值
- javascript - Javascript按钮滚动顶部并打印