当前位置: 首页 > 科技观察

JS基本搜索算法实现与170万条数据下的性能测试

时间:2023-03-23 01:57:52 科技观察

170万条数据性能下JS基本搜索算法的实现和性能测试,进而发现for循环、forEach、while的性能差异,同时我们也会学习如何使用webworkers做算法sharding,大大提高算法的性能。1.for循环查找的基本思想:通过for循环遍历数组,在数组中找出待查找值的索引,并将其压入新数组。代码实现如下:constgetFnRunTime=require('./getRuntime');/***常用算法-for循环版本*@param{*}arr*耗时:7-9ms*/functionsearchBy(arr,value){letresult=[];for(leti=0,len=arr.length;i{if(item===value){result.push(i);}})returnresult}耗时21-24毫秒,可见性能不如for循环(暂且这么说吧,本质是一样的)。3.while循环代码如下:/***普通算法-while循环版本*@param{*}arr*耗时:11ms*/functionsearchByWhile(arr,value){leti=arr.length,结果=[];while(i){if(arr[i]===value){result.push(i);}我-;}returnresult}可见while和for循环的性能差不多,都是优秀的,但不代表forEach的性能不好,所以不用。与for循环相比,foreach减少了代码,但是foreach依赖于IEnumerable。在运行时比for循环效率低。但是在处理循环次数不确定的循环,或者需要计算循环次数的时候,用foreach更方便。而且foreach的代码经过编译系统的代码优化后,类似于for循环的循环。4、二分查找二分查找更多的应用场景是在一个数组中,数组中的值是唯一且有序的,所以这里就不比较它和for/while/forEach的性能了。基本思想:从序列中间开始比较,如果当前位置值等于要查找的值,则查找成功;如果要查找的值小于当前位置值,则在序列的前半部分查找;如果要查找的值大于当前位置值,则继续在序列的后半部分查找,直到找到为止。代码如下:/***二元算法*@param{*}arr*@param{*}value*/functionbinarySearch(arr,value){letmin=0;让max=arr.length-1;while(min<=max){constmid=Math.floor((min+max)/2);if(arr[mid]===value){returnmid;}elseif(arr[mid]>value){max=mid-1;}else{最小值=中值+1;}}返回“未找到”;}在数据量很大的场景下,二分法的效率很高,但是不稳定,这也是它在大数据查询中的一个小缺点。5.哈希表查找哈希表查找也称为哈希表查找。通过查找关键字,无需比对就可以得到记录的存储位置。它在记录的存储位置与其关键字之间建立确定性。对应关系f,使得每个关键字key对应一个存储位置f(key)。哈希表查找使用场景:哈希表最适合解决的问题是找到等于给定值的记录。哈希查找不适用于同一个键对应多条记录的情况。不适合范围搜索,比如搜索18-22岁的学生。这里我先给出一个简化版的hashTable,让大家更容易理解hash://哈希函数varloseloseHashCode=function(key){varhash=0;for(vari=0;i