本文实例讲述了基于JavaScript实现的顺序查找算法。分享给大家供大家参考,具体如下:
对于查找数据来说,最简单的方法就是从列表的第一个元素开始对列表元素逐个进行判断,直到找到了想要的结果。这个方法叫做顺序查找,有时候也被叫做线性查找。它属于暴力查找技巧的一种。
顺序查找实现起来非常简单,代码如下:
function generalSearch(arr,data){//普通的顺序查找,就是遍历一遍看是否找到 for(var i=0;i<arr.length;i++){ if(arr[i]==data){ return true; } } return false; }
那么这样会不会效率很低呢?对于未排序的数据集来说,当被查到的数据位于数据集的起始位置时,查找是最快、最成功的。通过将成功找到的元素置于数据集的起始位置,可以保证在以后的操作中元素能被更快的查找到,代码如下:
function betterSearch(arr,data){//自组织查找,将查找率高的依次往前移 for(var i=0;i<arr.length;i++){ if(arr[i]==data){ if(i>0){ swap(arr,i,i-1);//如果找到则将查找的值和前一个值交换位置 } return true; } } return false; } function swap(arr,i,j){//交换位置 temp=arr[i]; arr[i]=arr[j]; arr[j]=temp; }
那有没有更加好的方法呢?在查找的世界中,有一个“80-20原则”,指的是对某一数据集执行的80%的查找操作都是对其中20%的数据元素进行查找。所以我们可以将查找到且处于后80%的元素放在起始位置,而前20%则不需要改变,代码如下:
function bestSearch(arr,data){//更好的自组织查找,将排名后80%的查找结果调到第一位 for(var i=0;i<arr.length;i++){ if(arr[i]==data&&i>(arr.length*0.2)){//如果是后80% swap(arr,i,0); return true; }else if(arr[i]==data){ return true;//前20%就不移动了 } } return false; }
三种查找的实验代码如下:
//进行试验 var nums=[3,1,4,6,2,9,8,0,5,7]; //普通查找 var bool=generalSearch(nums,3); document.write(bool+'<br>');//true var bool=generalSearch(nums,11); document.write(bool+'<br>');//false //自组织查找 showNums(nums);//3 1 4 6 2 9 8 0 5 7 betterSearch(nums,2); showNums(nums);//3 1 4 2 6 9 8 0 5 7 betterSearch(nums,2); showNums(nums);//3 1 2 4 6 9 8 0 5 7 betterSearch(nums,2); showNums(nums);//3 2 1 4 6 9 8 0 5 7 //更好的自组织查找 document.write("更好的自组织查找<br>"); bestSearch(nums,5); showNums(nums);//5 2 1 4 6 9 8 0 3 7 bestSearch(nums,2); showNums(nums);//5 2 1 4 6 9 8 0 3 7
顺序查找的完整代码:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> <script type="text/javascript"> function generalSearch(arr,data){//普通的顺序查找,就是遍历一遍看是否找到 for(var i=0;i<arr.length;i++){ if(arr[i]==data){ return true; } } return false; } function betterSearch(arr,data){//自组织查找,将查找率高的依次往前移 for(var i=0;i<arr.length;i++){ if(arr[i]==data){ if(i>0){ swap(arr,i,i-1);//如果找到则将查找的值和前一个值交换位置 } return true; } } return false; } function swap(arr,i,j){//交换位置 temp=arr[i]; arr[i]=arr[j]; arr[j]=temp; } function bestSearch(arr,data){//更好的自组织查找,将排名后80%的查找结果调到第一位 for(var i=0;i<arr.length;i++){ if(arr[i]==data&&i>(arr.length*0.2)){//如果是后80% swap(arr,i,0); return true; }else if(arr[i]==data){ return true;//前20%就不移动了 } } return false; } function showNums(arr){ for(var i=0;i<arr.length;i++){ document.write(arr[i]+' '); } document.write("<br>"); } //进行试验 var nums=[3,1,4,6,2,9,8,0,5,7]; //普通查找 var bool=generalSearch(nums,3); document.write(bool+'<br>');//true var bool=generalSearch(nums,11); document.write(bool+'<br>');//false //自组织查找 showNums(nums);//3 1 4 6 2 9 8 0 5 7 betterSearch(nums,2); showNums(nums);//3 1 4 2 6 9 8 0 5 7 betterSearch(nums,2); showNums(nums);//3 1 2 4 6 9 8 0 5 7 betterSearch(nums,2); showNums(nums);//3 2 1 4 6 9 8 0 5 7 //更好的自组织查找 document.write("更好的自组织查找<br>"); bestSearch(nums,5); showNums(nums);//5 2 1 4 6 9 8 0 3 7 bestSearch(nums,2); showNums(nums);//5 2 1 4 6 9 8 0 3 7 </script> </body> </html>
运行效果如下图:
更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《JavaScript数据结构与算法技巧总结》、《JavaScript数学运算用法总结》、《JavaScript排序算法总结》、《JavaScript遍历算法与技巧总结》、《JavaScript查找算法技巧总结》及《JavaScript错误与调试技巧总结》
希望本文所述对大家JavaScript程序设计有所帮助。
P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。