【问题标题】:Quickest way to check if a number is in a set?检查数字是否在集合中的最快方法?
【发布时间】:2013-08-12 06:55:52
【问题描述】:

在 Javascript 中检查数字是否在列表中的最快方法是什么?

我知道 indexOf >= 但对我来说似乎相当慢。

我必须每秒执行数百万次检查,而且列表相当短(最多约 10 个条目)

【问题讨论】:

  • 由于基线开销的差异,对 10 个项目的 O(n) 搜索实际上可能比恒定时间查找更快
  • 每秒数百万次检查?真的吗?
  • 所有检查都针对同一个列表吗?
  • 取值范围有多大?
  • 如果数据不经常变化,可以排序,然后对它们进行二分查找。也就是说,如果实际上您有数百万条记录。因为@MattBall 的原因。否则使用对象(其他语言的字典或哈希表)

标签: javascript list hash numbers find


【解决方案1】:

好吧,最好使用indexof()

在您的情况下不受欢迎的替代方法是使用Enumerable#include

您可以使用Enumerable#include,但我怀疑它是否比indexof() 更快类似:-

[1, 2, '3', '4', '5'].include(3);

【讨论】:

  • 你是在建议他为此加载prototypejs库?而且这将是最快的解决方案?
  • 我刚刚给了他另一种选择。我已经提到它并不快,但 OP 不想使用 indexof()。
  • 这就是-1的原因。 OP 并不是在寻找随机的替代方案,如果为一个方法包含一个大型库,而该方法与他目前正在做的事情基本相同,那将是愚蠢的。
  • @RahulTripathi 不,但是将数组中的短(记住,不超过十个项目)列表转换为作为对象的列表是微不足道的。
  • 如果 OP 真的需要每秒数百万次的查找(这听起来有点可疑,IMO),那么他将需要所有可以找到的优化。在这种情况下,通常需要用短代码来换取优化代码。我认为我们中的任何人都没有真正了解实际情况,无法提供最佳解决方案。
【解决方案2】:

jsperf 尝试一下,但我怀疑使用对象并将数字设置为属性会比数组搜索更快。

var theList = { 1: true, 2000: true, 253: true, -12077: true, ... };

if (theList[ someNumber ]) { // see if some number is in the list

现在,也就是说,您将无法在每秒数百万次的网络浏览器中使用 JavaScript 执行任何有用的操作,除非在极高端的机器上没有做太多其他事情。

【讨论】:

    【解决方案3】:

    如果您正在寻找理解速度,请使用array.includes

    [-1, 1, 2].includes(0)  // false
    [-1, 1, 2].includes(-1) // true
    [-1, 1, 2].includes(-2) // false
    [-1, 1, 2].includes(2)  // true
    [-1, 1, 2].includes(3)  // false
    

    【讨论】:

      猜你喜欢
      • 2023-03-22
      • 1970-01-01
      • 2018-05-04
      • 1970-01-01
      • 2013-07-06
      • 2023-02-04
      • 2020-03-19
      • 2021-04-27
      相关资源
      最近更新 更多