JavaScript:快速搜索数组中的间隔

JavaScript:快速搜索数组中的间隔,javascript,binary-search,Javascript,Binary Search,给出了数字的排序数组 其思想是,对于任何给定的数字,代码需要在数组中找到两个封闭索引,以便: array[a] <= query <= array[b] 数组[a] 我用一个简单的O(n)循环和两个二进制搜索变体做了一个小测试,令人惊讶的是,对于低n(~0-100?)的情况,循环速度要快得多。可在此处访问测试: 首先,这就是big-O的工作原理。在二进制搜索中,有许多操作;顺序阵列访问相对较少 但这并不完全是这里发生的事情。你的基准并不像他们所说的那样 例如,在标记为“O(n),n

给出了数字的排序数组

其思想是,对于任何给定的数字,代码需要在数组中找到两个封闭索引,以便:

array[a] <= query <= array[b]
数组[a]
我用一个简单的O(n)循环和两个二进制搜索变体做了一个小测试,令人惊讶的是,对于低n(~0-100?)的情况,循环速度要快得多。可在此处访问测试:

首先,这就是big-O的工作原理。在二进制搜索中,有许多操作;顺序阵列访问相对较少

但这并不完全是这里发生的事情。你的基准并不像他们所说的那样

例如,在标记为“O(n),n=50”的基准测试中,n仍然是最坏情况下的1000。你只进行了50次搜索。但是,由于数组的第十个元素是50,因此它只能进行50次比较。下面的二进制搜索不是这样的;它们都从元素500开始。简直不公平

制作一些数组

我用一个简单的O(n)循环和两个二进制搜索变体做了一个小测试,令人惊讶的是,对于低n(~0-100?)的情况,循环速度要快得多。可在此处访问测试:

当然,与直接迭代中更小的循环体相比,二进制搜索有更大的开销

描述“当参数趋向于特定值或无穷大时函数的限制行为[上限]”,并且没有提供任何证据来比较两次特定实现

然而,@minitech注意到,您的测试用例是有缺陷的,即使在n=50时,二进制搜索也比线性搜索快,它还测试n=5(其中线性搜索确实更快),并很好地描述了图中预期的
O(n)
vs
O(logn)
差异(尽管随着测试数据的指数增长(5*10n),图是指数vs线性的)

有没有比二进制搜索更优化的方法

你可以看看

此函数每秒运行数千次和上万次


为什么?您甚至可以更好地构建一个值的查找表。

比那些二进制搜索更优化的东西
为什么您需要每秒运行数千次和数万次二进制搜索功能
?当然有不同的方法吗?javascript的开销相当大。O(n)在任何情况下都会因为低n而获胜。对于低n,您必须以线性方式执行搜索,即使对于高n,您也必须以线性方式执行搜索的最新步骤(例如,就像快速排序一样,在遇到8大小的分区时停止递归以使用另一种排序,即使在asm中进行编码)。不同的方法是将状态保持在此函数之外(例如,上次的指数是多少,以及是否通过了直接检查),但我更希望在该函数之外没有状态。我曾考虑过构建一个查找表,但我不太喜欢可能需要的内存使用量。我有很多这样的时间线数组。通常情况下,性能与内存使用量总是成正比的。但是,请更具体地描述您的实际用例,可能会更好解决方案,而不是每秒运行几十次搜索…例如,您可以在一次循环中同时执行少量搜索,而不是每次用于3D动画时都执行完全搜索。搜索会从给定的时间线中查找要使用的正确关键帧。每一次搜索实际上都使用不同的时间线,并且时间线不一定具有相同的关键点(时间线基本上是一组时间=>数据映射,用于保存平移/旋转/缩放数据,以防与3D场景无关)但是对于动画,你根本不需要搜索,你只是在时间和数组中运行线性?如果有多个时间线处于活动状态,那么它们中的每一个都应该有自己的数组(最简单)或者在大数组中查找自己的索引。@minitech我认为使用相同大小的数组更具代表性,而是以一组随机选择的数字作为目标查找x索引。因此,在一组5000个数字中查找50个索引,然后再查找500个索引等。您应该随机化这些索引,因为否则您基本上就是brute force总结了这些情况下的所有概率,而不是实际的平均情况,然后突然间二进制搜索速度快了10倍以上。实际上,测试不同大小的数组非常有意义,因为整个O(n)这个想法是基于数据的大小。但是你不应该对从0到n的每个索引的结果进行汇总。这不是一个现实的结果。虽然对于一般情况来说这可能不是一个很好的测试,但实际上我的代码就是这样做的。每次我查询数组时,都有一个从0到n的计时器。