如何在 javascript 中只有两种类型的项目 0、1 的数组中最有效地查找项目的索引
How to most efficently find the index of an item in an array with only two types of items 0, 1 in javascript
例如你有
var arr = [0,0,0,1,0,1,1,0,0,0,1];
并且您想参考前 1 找到第一个 0 的位置。 arr.indexOf
会直接解决问题,但我不确定它是否线性比较数组中的每个项目?二叉搜索是行不通的,因为如果你排序然后查找元素,你会丢失索引......任何其他方法都可以到达第一个 1 并说啊哈!索引 3,一次不去一个元素?
它从数组的开头迭代搜索。
规范的相关部分:
重复,同时k < len
- 让
k
Present 是调用带有参数ToString(k)
的O
的[[HasProperty]]
内部方法的结果。 - 如果
k
现在是真的,那么- 让elementK是调用O的[[Get]]内部方法的结果,参数为
ToString(k)
。 - 让我们同样是将严格相等比较算法应用于
searchElement
和elementK
的结果。 - 如果相同,则返回
k
。
- 让elementK是调用O的[[Get]]内部方法的结果,参数为
- 将
k
增加 1。
来源: http://es5.github.io/#x15.4.4.14
是的,一旦对数组结构没有保证 - 没有什么比线性搜索更有效的了。
我不确定如何为没有某些东西提供正式证明。
我有一个有效的方法。
您拥有的实例
var arr = [0,0,0,1,0,1,1,0,0,0,1];
然后你创建一个新的数组 sum = {sum[i] = ∑(arr[j],j<=i)}
var sum = [0,0,0,1,1,2,3,3,3,3,4];
所以,你可以使用二叉搜索来找到第一个总和[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/)可以解决这个问题,它允许使用O(logn)查询和更新范围的总和
因此,您可以使用O(logn)*O(logn)解决此问题
您可以迭代遍历数组,但一旦找到第一个 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;
}
相关文章:
- 有没有一种方法可以添加相同的项目val=“0”;4〃;到JavaScript中数组的每个对象
- 按不同项目对对象数组进行排序
- 使用JavaScript或jQuery检查单选按钮选择是否与数组中的项目匹配
- JS:从整个数组中每次得到5个项目,并得到平均值
- 使用圆中的数组更改背景颜色项目
- 编辑CSV数组中的项目-快速CSV node.js
- 我可以限制我添加到数组中的项目数量吗
- 使用javascript/jquery从现有数组中创建一个新数组,该数组保存项目存在的次数
- 什么's JavaScript数组中项目的作用域
- 将项目放入数组中
- 使用 id 和 Javascript 从数组中删除项目
- (角度.js)如何通过过滤器计算数组中有多少项目
- 如何通过迭代对象数组来删除某些项目
- Lodash 从与值数组不匹配的数组中获取项目
- 发布要形成的 n 个项目的数组
- 查找数组中项目包含子字符串的索引
- 使用节点在 JSON 数组中搜索项目(最好不迭代)
- Javascript:从数组中删除包含带有侦听器的对象的项目的最佳方法
- 更新挖空中可观察数组中项目的属性
- JavaScript:如何在 for 循环期间跳过数组中的当前项目?(继续?