对于查找数据来说,最简单的方法就是从列表的第一个元素开始对列表元素逐个进行判断,直到找到了想要的结果,或者直到列表结尾也没有找到,这种方法称为顺序查找

一、基本写法
顺序查找的实现很简单。只要从列表的第一个元素开始循环,然后逐个与要查找的数据进 行比较。如果匹配到了,则结束查找。如果到了列表的结尾也没有匹配到,那么这个数据 就不存在于这个列表中。
// 顺序查找
function sequenceSearch($arr, $search) {
for ($i = 0; $i < count($arr); $i++) {
if ($arr[$i] == $search) {
return $i; // 如果在数组中找到了参数search,返回该值的下标。
}
}
return -1; // 如果没有找到要查找的数据,则返回-1。
} // 测试
$arr = array(1, 2, 4, 11, 25, 39, 78);
$res1 = sequenceSearch($arr, 333);
echo $res1;  // -1
$res2 = sequenceSearch($arr, 11);
echo $res2;  //
 
二、自组织方式的查找
如果在未排序的数组中查找最小值,思路如下:
(1) 将数组第一个元素赋值给一个变量,把这个变量作为最小值。
(2) 开始遍历数组,从第二个元素开始依次同当前最小值进行比较。
(3) 如果当前元素数值小于当前最小值,则将当前元素设为新的最小值。
(4) 移动到下一个元素,并且重复步骤 3。
(5) 当程序结束时,这个变量中存储的就是最小值。
下图演示了该算法的运行过程:
查找最大值算法的思路与查找最小值算法类似,先将数组的第一个元素设为最大值,然后循环对数组剩下的每个元素与当前最大值进行比较。
如果当前元素的值大于当前的最大值,则将该元素的值赋值给最大值变量。代码如下:
function findMin($arr) {
$min = $arr[0];
for ($i = 1; $i < count($arr); $i++) {
if ($arr[$i] < $min) {
$min = $arr[$i];
}
}
return $min;
} function findMax($arr) {
$max = $arr[0];
for ($i = 1; $i < count($arr); $i++) {
if ($arr[$i] > $max) {
$max = $arr[$i];
}
}
return $max;
}

对于未排序的数组来说,当被查找的数据位于数组的起始位置时,查找是最快、最成功的。通过将成功找到的元素置于数据集的起始位置,可以保证在以后的操作中该元素能被更快地查找到。该策略背后的理论是:通过将频繁查找到的元素置于数组的起始位置来最小化查找次数。比如,一个元素经常被访问,可以把这个元素放在数组的最前面,经过多次查找后,查找最频繁的元素会从原来的位置移动到数组的起始位置。这就是数据的自组织——数据的位置并非由程序员在程序执行之前组织好的,而是在程序运行过程中由程序自动组织的。

 
这种对数据的查找遵循“80-20 原则”,即对某一数据集执行的 80% 的查找操作都是对其中 20% 的数据元素进行查找。自组织的方式最终会把这 20% 的数据置于数据集的起始位置,这样便可以通过一个简单的顺序查找快速找到它们。
// 包含自组织方式的 seqSearch() 函数
function seqSearch(&$arr, $data) {
for ($i = 0; $i < count($arr); $i++) {
if ($arr[$i] == $data) {
if ($i > 0) {
swap($arr, $i, $i - 1);
}
return true;
}
}
return false;
} function swap(&$arr, $a, $b) {
$temp = $arr[$a];
$arr[$a] = $arr[$b];
$arr[$b] = $temp;
return $arr;
} // 观察 66 被连续查找 3 次之后是如何冒泡到列表前面去的
$arr = array(1, 78, 4, 66, 25, 39, 3);
for ($i = 1; $i <= 3; $i++) {
seqSearch($arr, 66);
print_r($arr);
echo '<br>';
}
// 输出结果如下:
// 1, 78, 66, 4, 25, 39, 3
// 1, 66, 78, 4, 25, 39, 3
// 66, 1, 78, 4, 25, 39, 3

这种技巧可以保证已经在数组前面的元素不会被越移越远。

 
另外一种给顺序查找算法添加自组织数据的方法是:将找到的元素移动到数据集的起始位置,如果这个元素已经很接近起始位置,就不会对它的位置进行交换。要实现这个目标,只需对距离数组起始位置一定范围外的元素进行交换即可——定义哪些是离数组起始位置足够近的元素,通过这个来决定是否需要将元素移动到接近数组的起始位置。再次参照“80-20原则”,我们可以确定以下原则:仅当数据位于数据集的前20%元素之外时,该数据才需要被重新移动到数据集的起始位置。
function seqSearch(&$arr, $data) {
$len = count($arr);
for ($i = 0; $i < $len; $i++) {
if ($arr[$i] == $data && $i > $len * 0.2) {
swap($arr, $i, 0);
return true;
} elseif ($arr[$i] == $data) {
return true;
}
}
return false;
}
function swap(&$arr, $a, $b) {
$temp = $arr[$a];
$arr[$a] = $arr[$b];
$arr[$b] = $temp;
return $arr;
}
// test
$arr = [4, 5, 1, 8, 10, 1, 3, 0, 1];
$res = seqSearch($arr, 3);
var_dump($res);
print_r($arr);
// 输出结果如下:
// true
// 3, 5, 1, 8, 10, 1, 4, 0, 1

如果要查找的目标数据位置在数组中很靠前,比如查找5,则可以观察到数组没有发生变化,这是因为被查找的元素很接近数组的起始位置,函数没有改变它的位置。

数据结构与算法之PHP查找算法(顺序查找)的更多相关文章

  1. 各种查找算法的选用分析(顺序查找、二分查找、二叉平衡树、B树、红黑树、B+树)

    目录 顺序查找 二分查找 二叉平衡树 B树 红黑树 B+树 参考文档 顺序查找 给你一组数,最自然的效率最低的查找算法是顺序查找--从头到尾挨个挨个遍历查找,它的时间复杂度为O(n). 二分查找 而另 ...

  2. PHP算法之二分查找和顺序查找

    一.二分查找 (数组里查找某个元素) /** * 二分查找 (数组里查找某个元素) * $k为要查找的关键字(注:待查找的数组元素为奇数个)$low为查找范围的最小键值,$high为查找范围的最大键值 ...

  3. 查找->静态查找表->顺序查找(顺序表)

    文字描述 顺序查找的查找过程为:从表中最后一个记录开始,逐个进行记录的关键字和给定值的比较,若某个记录的关键字和给定值比较相等,则查找成功,找到所查记录:反之,若直至第一个记录,其关键字和给定值比较都 ...

  4. javascript数据结构与算法---检索算法(顺序查找、最大最小值、自组织查询)

    javascript数据结构与算法---检索算法(顺序查找.最大最小值.自组织查询) 一.顺序查找法 /* * 顺序查找法 * * 顺序查找法只要从列表的第一个元素开始循环,然后逐个与要查找的数据进行 ...

  5. 数据结构Java版之查找算法(三)

    关于查找算法,这里只进行两个算法的说明.包括 顺序查找 和 折半查找. 顺序查找: 顺序查找常用于未排序的数据中.查找速度较慢,只能应用于较小的数据量. public int sequentialSe ...

  6. [Data Structure & Algorithm] 七大查找算法

    查找是在大量的信息中寻找一个特定的信息元素,在计算机应用中,查找是常用的基本运算,例如编译程序中符号表的查找.本文简单概括性的介绍了常见的七种查找算法,说是七种,其实二分查找.插值查找以及斐波那契查找 ...

  7. 七大查找算法(附C语言代码实现)

    来自:Poll的笔记 - 博客园 链接:http://www.cnblogs.com/maybe2030/p/4715035.html 阅读目录 1.顺序查找 2.二分查找 3.插值查找 4.斐波那契 ...

  8. 七大查找算法(Python)

    查找算法 -- 简介 查找(Searching)就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素.    查找表(Search Table):由同一类型的数据元素构成的集合    ...

  9. 查找算法(5)--Tree table lookup--树表查找

    1.树表查找 (1) 最简单的树表查找算法——二叉树查找算法. [1]基本思想:二叉查找树是先对待查找的数据进行生成树,确保树的左分支的值小于右分支的值,然后在就行和每个节点的父节点比较大小,查找最适 ...

  10. JS-七大查找算法

    顺序查找 二分查找 插值查找 斐波那契查找 树表查找 分块查找 哈希查找 查找定义:根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录).查找算法分类:1)静态查找和动态查找:注 ...

随机推荐

  1. Nuget EPPlus的使用

    EPPlus:网站 Supported Functions Excel Merge Operate public class ExcelMergeOperate { private static Lo ...

  2. CAS 单点登录4.24版本 登录调用其它系统并且返回客户端用其它的用户信息改造

    1.登录调用其它系统.修改deployerConfigContext.xml <?xml version="1.0" encoding="UTF-8"?& ...

  3. 51nod 1405 树的距离之和(dfs)

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1405 题意: 思路: 先求出所有点到根节点的距离,需要维护每棵子树的大小 ...

  4. 原生js总结

    数据类型 基本类型值包括: undefined,null,Boolean,Number和String,这些类型分别在内存中占有固定的大小空间,它们的值保存在栈空间,我们通过按值来访问的. 引用类型包括 ...

  5. 1. Mysql在java中的使用步骤

    -1.配置数据库:http://www.cnblogs.com/sshoub/p/4321640.html 2.创建可以远程的登录用户:http://www.cnblogs.com/xyzdw/arc ...

  6. Excel 导出通用类

    public class ExportToExcelHelper { public static void ExportExcel(DataTable dt) { try { //创建一个工作簿 IW ...

  7. 获得WebBrowser中的图片数据

    /// <summary> /// 获取WebBrowser指定的图片 /// </summary> /// <param name="webBrowser&q ...

  8. mark mem

    韦达定理 http://baike.baidu.com/link?url=M45ozZEnQ4BtKD7l22WWgQuGnmDYV7TFynQcPEO2Tt8leYGhyEa1flt-RM34NG4 ...

  9. 【二】jquery之基础概念与jquery对象与dom对象的区别及混合使用

    一:jquery基本概念 1.jquery是一个javascript框架,它是一个轻量级的js库 2.当下流行的js库有: jquery MooTools Prototype 3.$(ducoment ...

  10. C#连接数据库open函数失败

    错误信息:在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误.未找到或无法访问服务器.请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接. (provider ...