本文介绍JavaScript中的顺序查找(线性查找)算法,并探讨两种自组织优化策略。通过普通遍历、高频元素前移以及基于80-20原则的后80%元素置顶,优化未排序数据集的查找效率。
顺序查找基础实现
本文通过具体示例展示如何在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%的数据元素上。因此,可以将位于后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程序设计有所助益。