数据结构与算法之PHP查找算法(顺序查找)
对于查找数据来说,最简单的方法就是从列表的第一个元素开始对列表元素逐个进行判断,直到找到了想要的结果,或者直到列表结尾也没有找到,这种方法称为顺序查找。
// 顺序查找
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; //

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;
}
对于未排序的数组来说,当被查找的数据位于数组的起始位置时,查找是最快、最成功的。通过将成功找到的元素置于数据集的起始位置,可以保证在以后的操作中该元素能被更快地查找到。该策略背后的理论是:通过将频繁查找到的元素置于数组的起始位置来最小化查找次数。比如,一个元素经常被访问,可以把这个元素放在数组的最前面,经过多次查找后,查找最频繁的元素会从原来的位置移动到数组的起始位置。这就是数据的自组织——数据的位置并非由程序员在程序执行之前组织好的,而是在程序运行过程中由程序自动组织的。
// 包含自组织方式的 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
这种技巧可以保证已经在数组前面的元素不会被越移越远。
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查找算法(顺序查找)的更多相关文章
- 各种查找算法的选用分析(顺序查找、二分查找、二叉平衡树、B树、红黑树、B+树)
目录 顺序查找 二分查找 二叉平衡树 B树 红黑树 B+树 参考文档 顺序查找 给你一组数,最自然的效率最低的查找算法是顺序查找--从头到尾挨个挨个遍历查找,它的时间复杂度为O(n). 二分查找 而另 ...
- PHP算法之二分查找和顺序查找
一.二分查找 (数组里查找某个元素) /** * 二分查找 (数组里查找某个元素) * $k为要查找的关键字(注:待查找的数组元素为奇数个)$low为查找范围的最小键值,$high为查找范围的最大键值 ...
- 查找->静态查找表->顺序查找(顺序表)
文字描述 顺序查找的查找过程为:从表中最后一个记录开始,逐个进行记录的关键字和给定值的比较,若某个记录的关键字和给定值比较相等,则查找成功,找到所查记录:反之,若直至第一个记录,其关键字和给定值比较都 ...
- javascript数据结构与算法---检索算法(顺序查找、最大最小值、自组织查询)
javascript数据结构与算法---检索算法(顺序查找.最大最小值.自组织查询) 一.顺序查找法 /* * 顺序查找法 * * 顺序查找法只要从列表的第一个元素开始循环,然后逐个与要查找的数据进行 ...
- 数据结构Java版之查找算法(三)
关于查找算法,这里只进行两个算法的说明.包括 顺序查找 和 折半查找. 顺序查找: 顺序查找常用于未排序的数据中.查找速度较慢,只能应用于较小的数据量. public int sequentialSe ...
- [Data Structure & Algorithm] 七大查找算法
查找是在大量的信息中寻找一个特定的信息元素,在计算机应用中,查找是常用的基本运算,例如编译程序中符号表的查找.本文简单概括性的介绍了常见的七种查找算法,说是七种,其实二分查找.插值查找以及斐波那契查找 ...
- 七大查找算法(附C语言代码实现)
来自:Poll的笔记 - 博客园 链接:http://www.cnblogs.com/maybe2030/p/4715035.html 阅读目录 1.顺序查找 2.二分查找 3.插值查找 4.斐波那契 ...
- 七大查找算法(Python)
查找算法 -- 简介 查找(Searching)就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素. 查找表(Search Table):由同一类型的数据元素构成的集合 ...
- 查找算法(5)--Tree table lookup--树表查找
1.树表查找 (1) 最简单的树表查找算法——二叉树查找算法. [1]基本思想:二叉查找树是先对待查找的数据进行生成树,确保树的左分支的值小于右分支的值,然后在就行和每个节点的父节点比较大小,查找最适 ...
- JS-七大查找算法
顺序查找 二分查找 插值查找 斐波那契查找 树表查找 分块查找 哈希查找 查找定义:根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录).查找算法分类:1)静态查找和动态查找:注 ...
随机推荐
- 获取IP及判断IP是否在区间
/// <summary> /// 获取客户端IP /// </summary> /// <returns></returns> public stat ...
- EDCheckPrefabRef
using UnityEngine;using System.Collections;using UnityEditor;using UnityEngine.UI;using System.Refle ...
- 蚂蚁金服 Service Mesh 渐进式迁移方案|Service Mesh Meetup 实录
小蚂蚁说: 本文是基于在 Service Mesher Meetup 上海站的主题分享<蚂蚁金服 Service Mesh 渐进式迁移方案>内容整理,完整的分享 PPT 获取方式见文章底部 ...
- P2512 [HAOI2008]糖果传递
题目描述 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. 输入输出格式 输入格式: 小朋友个数n 下面n行 ai 输出格式: 求使所有人获得均等糖果 ...
- Mysql 强行Kill 连接
BEGIN ; ; ; DO KILL @Temp; ; END WHILE ; END
- 服务器不能设置内容类型HTTP头信息后发送
昨天一个用户反映,导出excel失败,我测试了一下,数据量小没有问题,数据量稍微大就会出现这个问题.咨询度娘也没有找到合适的解决方法,突然想到系统中,其他模块有下载excel附件的功能,但是从没有出现 ...
- 排序——选择排序(java描述)
百度百科的描述如下:选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元 ...
- 30秒了解Excel的前世今生
JS 大家日常工作离不开的Excel,实际上脱胎于1979年问世的Apple II电脑上的一款杀手级应用VisiCalc. VisiCalc在问世后的6年间,以100美金一份的价格卖出了超过70万份, ...
- 力扣(LeetCode) 104. 二叉树的最大深度
给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. 示例: 给定二叉树 [3,9,20,null,null,15,7], ...
- 《剑指offer》第五十一题(数组中的逆序对)
// 面试题51:数组中的逆序对 // 题目:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组 // 成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. #include &l ...