是否存在支持BigInt作为非唯一键的O(1)查找类对象?
解决BigInt非唯一键的快速查找问题
要处理非唯一BigInt键的高效查找,最直接的方案是用Map存储分组数据,或者用普通对象配合字符串化的BigInt键,两种方式都能实现近似O(1)的查找效率:
方法一:使用Map(推荐)
Map原生支持BigInt作为键,我们可以让每个键对应一个数组,把相同hash的对象都存入对应数组:
// 构建索引 const hashGroupMap = new Map(); for (const item of items) { if (!hashGroupMap.has(item.hash)) { hashGroupMap.set(item.hash, []); } hashGroupMap.get(item.hash).push(item); } // 查找指定hash的所有对象 const targetHash = 12345n; const matchedItems = hashGroupMap.get(targetHash) || [];
构建索引时只需遍历一次所有对象(O(n)时间),后续查找时能直接定位到目标hash对应的数组(O(1)时间),如果需要遍历数组内的元素,时间复杂度为O(k)(k为该hash对应的对象数量,远小于总数量50000),整体效率远高于array.filter()的O(n)每次查找。
方法二:使用普通对象配合字符串化BigInt
如果不想用Map,也可以将BigInt转换为字符串作为普通对象的键,同样用数组存储同hash的对象:
// 构建索引 const hashGroupObj = {}; for (const item of items) { const key = item.hash.toString(); if (!hashGroupObj[key]) { hashGroupObj[key] = []; } hashGroupObj[key].push(item); } // 查找指定hash的所有对象 const targetHash = 12345n; const matchedItems = hashGroupObj[targetHash.toString()] || [];
这种方式本质和Map类似,但需要手动处理BigInt到字符串的转换,不如Map直观,且存在极个别BigInt字符串冲突的潜在风险(概率极低),因此优先推荐使用Map方案。
内容的提问来源于stack exchange,提问作者Kurt
相关产品推荐
相关产品推荐

