【问题标题】:JavaScript fast lookup data structure?JavaScript 快速查找数据结构?
【发布时间】:2014-06-23 09:57:02
【问题描述】:

我有一个按字母顺序排列的 109582 个字符串数组。我的 Web 应用程序将对给定字符串是否包含在数组中进行大量快速检查。显然我可以创建一个哈希表或二叉树的包装类,但有没有可以使用的原生 JavaScript 数据结构?

【问题讨论】:

  • 可能是二分搜索?

标签: javascript


【解决方案1】:

当然。制作一个字典对象

dict = {
  string1: 1,
  string2: 1,
etc

保证提供 O(1) 查找时间。

【讨论】:

  • 这绝对是最快的。 if (dict[string])
  • 大 O 符号并不是唯一的问题。挂壁时间测量很重要。我建议测试使用一个哈希/对象是否更好的 OP 时间,或者他是否应该至少为每个第一个字母创建一个哈希。
  • 实际上并不能保证O(1) 的查找时间。诚然,大多数实现确实对对象使用哈希映射,但它们也可以选择其他任何东西。
  • 这会比使用数组更快吗?
【解决方案2】:

有各种合适的结构和方法,见下文。

大批
  • for循环
  • for 循环(反向)
  • array.includes(target)
  • set.has(target)
目的
  • obj.hasOwnProperty(target)
  • target in obj
  • obj[target]
地图
  • map.has(target)
2021 年 1 月,Chrome 87 的结果

JSBench 测试https://jsbench.me/3pkjlwzhbr/1

// https://jsbench.me/3pkjlwzhbr/1
// https://docs.google.com/spreadsheets/d/1WucECh5uHlKGCCGYvEKn6ORrQ_9RS6BubO208nXkozk/edit?usp=sharing
// JSBench forked from https://jsbench.me/irkhdxnoqa/2

var theArr = Array.from({ length: 10000 }, (_, el) => el)
var theSet = new Set(theArr)
var theObject = Object.assign({}, ...theArr.map(num => ({ [num]: true })))
var theMap = new Map(theArr.map(num => [num, true]))

var theTarget = 9000


// Array

function isTargetThereFor(arr, target) {
  const len = arr.length
  for (let i = 0; i < len; i++) {
    if (arr[i] === target) {
      return true
    }
  }
  return false
}
function isTargetThereForReverse(arr, target) {
  const len = arr.length
  for (let i = len; i > 0; i--) {
    if (arr[i] === target) {
      return true
    }
  }
  return false
}

function isTargetThereIncludes(arr, target) {
  return arr.includes(target)
}

// Set

function isTargetThereSet(numberSet, target) {
  return numberSet.has(target)
}

// Object 

function isTargetThereHasOwnProperty(obj, target) {
  return obj.hasOwnProperty(target)
}
function isTargetThereIn(obj, target) {
  return target in obj
}
function isTargetThereSelectKey(obj, target) {
  return obj[target]
}

// Map

function isTargetThereMap(numberMap, target) {
  return numberMap.has(target)
}

这个答案是从https://stackoverflow.com/a/65604244/985454迁移过来的

【讨论】:

    猜你喜欢
    • 2011-04-09
    • 1970-01-01
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 2010-12-02
    • 1970-01-01
    相关资源
    最近更新 更多