【问题标题】:How to most efficently find the index of an item in an array with only two types of items 0, 1 in javascript如何最有效地在javascript中只有两种类型的项目0、1的数组中找到项目的索引
【发布时间】:2015-06-19 22:08:45
【问题描述】:

比如说你有

var arr = [0,0,0,1,0,1,1,0,0,0,1];

而你想找到第一个 1 相对于第一个 0 的位置。 arr.indexOf 会直接解决问题,但我不确定它是否会线性比较数组中的每个项目?二进制搜索不起作用,因为如果您排序然后查找元素,您会丢失索引...任何其他方法可以到达第一个 1 并说啊哈!索引 3,一次不去一个元素?

【问题讨论】:

  • “参照第一个0”是什么意思?
  • 您不能比线性搜索做得更好,因为必须检查第一个 1 之前的每个元素。相反,二分搜索起作用的原因是因为列表是排序的并且每个元素中都包含信息(即任何给定元素之前的所有元素都小于或等于它)。你的情况没有这样的结构。
  • @user2357112 参考第一个 0 我的意思是参考 arr[0];因此,例如,第一个 1 相对于第一个 0 的索引为 3。如果它参考第二个 0,它将具有索引 2
  • “参照”是什么意思?
  • ...您也可以将更改表示为当前数字重复次数的列表,因此以0 开头,您可以使用[4,3,1,3,2,4]。或者你可以用两种方式表示它,并使用在给定时间有意义的任何列表。

标签: javascript arrays algorithm


【解决方案1】:

它从数组的开头迭代搜索。

规范的相关部分:

重复,而k < len

  • k Present 是调用O[[HasProperty]] 内部方法的结果,参数为ToString(k)
  • 如果k Present 为真,那么
    • 设 elementK 为使用参数 ToString(k) 调用 O 的 [[Get]] 内部方法的结果。
    • 同样是对searchElementelementK应用严格等式比较算法的结果。
    • 如果相同,则返回k
  • k 增加 1。

来源:http://es5.github.io/#x15.4.4.14

是的,只要不保证数组结构 - 没有什么比线性搜索更有效的了。

我不确定如何为缺少某物做出正式证明。

【讨论】:

  • 这不能回答问题。如果您对为什么线性搜索最快(我认为可能是)有一些理由,那么您可以将其包含在您的答案中。
  • @Quirliom 我刚刚添加了最后一句话。感谢 -1
【解决方案2】:

我有一个有效的方法。

你有的例子

var arr = [0,0,0,1,0,1,1,0,0,0,1];

然后创建一个新数组 sum = {sum[i] = ∑(arr[j],j

var sum = [0,0,0,1,1,2,3,3,3,3,4];

所以,你可以使用二分搜索找到第一个 sum[j]==1

但是如果我们更新 arr 的元素,我们将再次用 O(n)计算和

有一些数据结构,如段树(https://en.wikipedia.org/wiki/Segment_tree)和二叉索引树(BIT https://www.topcoder.com/community/data-science/data-science-tutorials/binary-indexed-trees/)can)解决了这个问题,它允许查询和更新一个范围的总和与 O(logn)

因此,你可以用 O(logn)*O(logn) 来解决这个问题

【讨论】:

  • 通过创建新数组,您已经在循环第一个数组以添加先前的值,因此您已经通过了您正在寻找的 1。
  • 使用segment tree或BIT,不需要计算数组的和。因为它可以计算一个范围的和,O(logn)
【解决方案3】:

您可以迭代地遍历数组,但一旦找到第一个 1 就停止。例如,您可以使用以下代码:

boolean found = false;
int arr = {0,0,0,1,0,1,1,0,0,0,1};

for (int i = 0; found != true && i <arr.length; i++){
    if(arr[i] == '1'){
    found = true;
    }

【讨论】:

  • 您(大部分)正在重新发明break 声明。加上i 将被1 关闭。而且你的语法是错误的。
  • @chunkyturtle 这将是一个线性搜索,寻找比这更快的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-08
  • 1970-01-01
  • 2013-07-10
  • 2011-04-24
  • 1970-01-01
  • 1970-01-01
  • 2020-12-02
相关资源
最近更新 更多