流言终结:JS字符搜索的飞雷神之术?

温馨提示:这篇文章已超过773天没有更新,请注意相关的内容是否还可用!

作为开发者,在编程时,难免要在网上查找、参考各种资料。

近日,在用JavaScript实现一个功能时,要在海量数据中查找字符。

网上一搜,发现介绍一种称为“飞雷神之术”的超快算法,其原理是:利用树状数组完成海量数据瞬间检索,据说其效率远超indexof、正则表达式等搜索方式。

飞雷神之术:在《火影忍者》中,第二代火影千手扉间开发的超高等空间忍术,利用术式达到瞬间移动,施术者会事先在目标上留下飞雷神术式,即可使施术者对接触物进行瞬间移动。

流言终结:JS字符搜索的飞雷神之术? 第1张

据该算法介绍,上述的快速检索算法,与此描述有一定神似,同样是事先对目标数据进行预处理,处理之后便可实现瞬间检索的效果。

真有这么神奇吗?

抱着三分期待,七分疑惑。进行了本文的测试。

直接说结果:流言

给出测试数据:

一千万条数据中搜索,indexof用时128毫秒,正则用时,0.3毫秒,网传算法用时:9.7毫秒。最快的是正则匹配。

流言终结:JS字符搜索的飞雷神之术? 第2张

一万条数据中搜索,indexof用时1.1毫秒,正则用时0.2毫秒,网传算法用时2.5毫秒。正则最快、网传最慢。

流言终结:JS字符搜索的飞雷神之术? 第3张

中间,还测试了在其它不同量级的数据中搜索,结果都证明该网传算法毫无优势,实属流言。

以下,再附上该“飞雷神”算法,及本文测试时使用的代码:

function demo_init(count){
var str = "";
for(i=0; i<count; i++){
str = str + rnd_str() + ",";
}
var str_array = str.split("");
var tree_root = {};
var tree_sub = {};
var key;
for(var i=0; i<str_array.length; i++){
key = str_array[i];
//以,作为分隔标识
if(key == ','){
//遇到,则sub等于全部root树对象
tree_sub = tree_root;
continue;
}
if(key in tree_sub){
//某个子节点下的节点
tree_sub = tree_sub[key];
//console.log("已存在子节点",key,tree_sub);
}else{
tree_sub[key] = {};
//console.log("创建了新的节点",key);
}
}
//console.log("最终",JSON.stringify(tree_root));
return tree_root;
}
function rnd_str(){
var str = "";
var str_length = 4;
var rnd_word = new Array(1,2,3,4,5,6,7,8,9,'a','b','c','d','e','f','g','h','i','j','k','x','m','n','c','p','q','r','s','t','u','v','w','x','y','z');
for(var i = 0; i < str_length; i++){
var charNum = Math.floor(Math.random() * 32);
str += rnd_word[charNum];
}
return str;
}
function search(tree_root,content){
var tblCur;
var i = 0;
var n = content.length;
var p, v;
var arrMatch = [];
while(i < n){
tblCur = tree_root;
p = i;
v = 0;
for(;;){
//返回指定位置的字符
if(!(tblCur = tblCur[content.charAt(p++)])){
i++;
break;
}
//匹配到了
if(JSON.stringify(tblCur) == "{}"){
v = p;
}
}
if(v){
arrMatch.push(i-1, v);
i = v;
}
}
return arrMatch;
}
console.log("一千万条数据中搜索");
var str = "";
for(i=0; i<10000000; i++){
str = str + rnd_str() + ",";
}
console.time("indexof用时");
var indexof_result = str.indexOf("abcd");
console.log(indexof_result)
console.timeEnd("indexof用时");
console.time("regexp用时");
var test_result = /abcd/.test(str);
console.log(test_result);
console.timeEnd("regexp用时");
var tree = demo_init(10000000);
console.time("飞雷神用时");
var serach_result = search(tree,"abcd");
console.log(serach_result);
console.timeEnd("飞雷神用时");

九七分享吧所有文章来源于网络收集整理,如有侵权请联系QQ2387153712删除,如果这篇文章对你有帮助或者还不错的请给小编点个小赞(◠‿◠),小编每天整理文章不容易(ಥ_ಥ)!!!

文章版权声明:除非注明,否则均为九七分享吧原创文章,转载或复制请以超链接形式并注明出处。

相关阅读

苹果 iOS/iPadOS 15.4.1 正式版发布

哎呦,被盗哦!周杰伦无聊猿NFT疑被钓鱼,价值超300万

“蔚小理”一季度成绩单:小鹏理想均跨过三万辆门槛,蔚来垫底

最完整的人类基因组序列,今天凌晨公布了!

手机行业不景气了?国产厂商大砍单:1.7亿订单取消

快手或将受益于互联网监管

我国实现首例V频段低轨卫星测控

北京外卖封签上线首日调查:1个封签约2分钱,已大面积推广

iPhone更换微信图标教程,安卓:不就是换个主题?

豆瓣关闭私密小组,壮士断腕为时未晚

台积电将5nm产量提高到15万片/月

京东增持京东物流 为了挽救股价还是应对激烈竞争?

发表评论

表情:
评论列表 (暂无评论,344人围观)

还没有评论,来说两句吧...

取消
微信二维码
微信二维码
支付宝二维码