首页 > 解决方案 > 数组中值和索引之间的高效一对一映射

问题描述

我需要获取数组中值的索引(即位置),我想知道是否有比使用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命令吗?

标签: arraysmatlabindexingmapping

解决方案


您正在寻找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) 解决方案将无法被击败。


推荐阅读