数据结构与算法之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)静态查找和动态查找:注 ...
随机推荐
- Python 编码规范 PEP8
1 Introduction Guido 的核心思想是:对于代码而言,相比于写,它更多是被用来读的.这个指导旨在使Python代码更易读,且具有更强的协调性. 2 A Foolish Consiste ...
- 【Python】【函数式编程】
#[练习] 请定义一个函数quadratic(a, b, c),接收3个参数,返回一元二次方程: ax2 + bx + c = 0 的两个解. 提示:计算平方根可以调用math.sqrt()函数: & ...
- 理解 Redis(8) - Ordered set 值
ordered set 是根据 score值有序排列的数据集合. 首先还是清空数据, 并清屏, 此步骤省略~~~~ 新建一条 ordered set 数据 myset1, 并存入4个字符串, scor ...
- bzoj 1036: [ZJOI2008]树的统计Count 树链剖分+线段树
1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 16294 Solved: 6645[Submit ...
- python tcp .demo
client: # -*- coding: utf- -*- import socket s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.co ...
- Java一次性读取文件的内容
我们做文本处理的时候的最常用的就是读写文件了,尤其是读取文件,不论是什么文件,我都倾向于一次性将文本的原始内容直接读取到内存中再做处理,当然,这需要你有一台大内存的机器,内存不够者……可以一次读取少部 ...
- ASP.NET中Page_Load()与Page_Init()的区别
Page_Init()事件:aspx初始化时触发,只执行一次,常用于页面初始化,并且执行在page_load之前,如果在aspx的程序中需要使用该方法,那么该方法的类需要继承 System.Web.U ...
- java 常用异常及作用
先看看图, Exception就明白了 关于异常 大体分为 不可查异常 可查异常 runtimeException三类~异常都继承throwable这个类~ 下面有error和Exception两大类 ...
- JDBC的通用查询的方法
PreparedStatement 1.Why 1):使用Statement需要进行拼写SQL语句,很辛苦,而且容易出错. 2):使用Statement可以发生SQL注入. SQl注入: SQL注入是 ...
- PostCSS以及cssnext语法
什么是postcss postcss 一种对css编译的工具,类似babel对js的处理,常见的功能如: 1 . 使用下一代css语法 2 . 自动补全浏览器前缀 3 . 自动把px代为转换成 rem ...