【发布时间】:2014-06-23 09:57:02
【问题描述】:
我有一个按字母顺序排列的 109582 个字符串数组。我的 Web 应用程序将对给定字符串是否包含在数组中进行大量快速检查。显然我可以创建一个哈希表或二叉树的包装类,但有没有可以使用的原生 JavaScript 数据结构?
【问题讨论】:
-
可能是二分搜索?
标签: javascript
我有一个按字母顺序排列的 109582 个字符串数组。我的 Web 应用程序将对给定字符串是否包含在数组中进行大量快速检查。显然我可以创建一个哈希表或二叉树的包装类,但有没有可以使用的原生 JavaScript 数据结构?
【问题讨论】:
标签: javascript
当然。制作一个字典对象
dict = {
string1: 1,
string2: 1,
etc
保证提供 O(1) 查找时间。
【讨论】:
O(1) 的查找时间。诚然,大多数实现确实对对象使用哈希映射,但它们也可以选择其他任何东西。
有各种合适的结构和方法,见下文。
大批for循环for 循环(反向)array.includes(target)set.has(target)obj.hasOwnProperty(target)target in obj
obj[target]
map.has(target)
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迁移过来的
【讨论】: