当前位置: 首页 > 知识库问答 >
问题:

如何有效地在排序数组中查找值的索引?

郗河
2023-03-14

我有一个排序的值数组和一个值,如下所示:

x <- c(1.0, 3.45, 5.23, 7.3, 12.5, 23.45)
v <- 6.45

我可以找到在保持排序顺序的同时将v插入到x中的值的索引:

max(which(x <= v))
[1] 3

代码很好而且紧凑,但我有一种直觉,在幕后这是非常低效的:因为which()不知道数组已排序,所以它必须检查所有值。

有没有更好的方法找到这个指数值?

注意:我对实际合并vx不感兴趣,我只想要索引值。

共有1个答案

秋光熙
2023-03-14

如果您需要更快的版本,并且不需要检查输入,您可以编写easy cpp函数

Rcpp::cppFunction(
  "int foo(double x, const Rcpp::NumericVector& v)
  {
    int min = 0;
    int max = v.size();
    while (max - min > 1)
    {
      int idx = (min + max) / 2;
      if (v[idx] > x)
      {
        max = idx; 
      }
      else
      {
        min = idx;
      }
    }
    return min + 1;
  }"
)

如果需要,您可以检查If(x

library(microbenchmark)

n = 1e6
v = sort(rnorm(n, 0, 15))
x = runif(1, -15, 15)
microbenchmark(max(which(v <= x)), sum(v <= x), findInterval(x, v), foo(x, v))

结果:

 类似资料:
  • 我有INT数组 我也在寻找类似的问题,但我只发现了java.util.stream.stream .sorted()的大O复杂性,这一点也没有帮助,因为有两个不同的答案(第一个当然是部分错误的,因为arrays.sort并不总是O(n log n))。第二个呢?我还没找到证据。

  • 问题内容: 说我有这个 这给了我 等等 JavaScript中有什么方法可以返回带有值的索引? 即我想要 200 的索引,我得到 1 。 问题答案: 您可以使用: 如果无法在数组中找到值,则将得到-1。

  • 我真的被困在代码的末尾,这是我迷路的地方。我的目标是从我制作的类(未显示)中创建一个对象数组。它存储它们的ISBN、标题和价格。该代码应该询问用户一个书名和ISBN#,如果它与数组中的任何一本书匹配,那么具有相同ISBN和书名的所有图书将从最低价格排序到最高价格,然后它们的所有价格将被改变为具有最低价格的图书的价格。我评论了我迷路的地方。多谢! books类如下所示:class books{pri

  • 求一个未排序数组的中值,我们可以对n个元素做O(nlogn)时间的min-heap,然后我们可以逐个抽取n/2个元素得到中值。但是这种方法需要O(nlogn)时间。 我们能在O(n)时间内通过某种方法做同样的事情吗?如果可以,那么请告诉或建议一些方法。

  • 问题内容: 我需要弄清楚如何在二维numpy数组中找到值的所有索引。 例如,我有以下2d数组: 我需要找到所有1和0的索引。 我试过了,但是并没有给我所有的索引: 基本上,它只给我每一行中的一个索引。 问题答案: 您可以用来返回x和y索引数组的元组,其中给定条件保存在数组中。 如果是阵列名称: 如果要列出(x,y)对,则可以使用两个数组: 或者,甚至更好的是,@ jme指出这可能是生成配对的一种更

  • 问题内容: 令我惊讶的是,以前没有提出过这个具体问题,但我的确没有在SO或文档中找到它。 假设我有一个包含整数的随机numpy数组,例如: 如果对它进行排序,则默认情况下我将获得升序: 但我希望解决方案按 降序 排序。 现在,我知道我可以永远做: 但这最后的陈述 有效 吗?它不是按升序创建副本,然后反转此副本以反转顺序获得结果吗?如果确实如此,是否有有效的选择?看起来好像不接受参数来更改排序操作中