一直在写代码学习,写代码学习,……………..
直到10年后的有一天,才真正意义上的思考算法、速度大O、效率等的问题。
当遇到任何的一个需求时,考虑算法,我的脑子里总会有如下这些算法思想或者说要准备的条件,也或者说依据等等值得考虑的内容。
问题:抽象考虑,解决问题,函数,类等。
0,分析这个数据是什么结构(内存,数组,数据表例如线性表之类等)
内存 0 1 2 3 4 5 6 7 8
顺序 0 1 2 3 4 5 6 7 8
线性表 a1 a2 a3 a4 a5 a6 a7 a8 a9
1,数据的结构是什么?
2,是循环,还是判断来解决。
3,是比较吗?
4,什么样的算法效率更高。O(n) 或 O(log n)
5,基点或者说开始,我还会考虑数据结构的结束。(开始也或者说基准)
6,要不重新组装数据结构。
7,返回的结果是什么
8,是函数,是类,还是api的调用
9,是自已写,还是拿来用,百度找
10,排序啊,递归啊,快排啊,考虑散列表啊,广度优先搜索,狄克斯特拉算法,贪婪算法,动态的规划,K最近等等。
最后的学习还是回归数据的本身结构和有趣的数据算法。
<?php
/**
* 数据算法,之二分查找
* 要求是数据为索引,查找从索引中间位置进行二分查询查找。
* @ arr $list 数组
* @ string $item 数值
* @ 开源达人 2023-8-20
*/
function bs($list,$item){
$low = 0; //数组索引从0 索引开始的位置
$high = count($list)-1; // 索引最后的位置
while($low <= $high){
$mid = ($low + $high) / 2; //二分查找 从数据的中间索引进行
$guess = $list[$mid]; //中间索引的数值
if($guess == $item){ // 如果这个索的 数值 等于 查找的值
return $mid; //返回 索引
}
if($guess > $item){ //如果 索引的数值 大于 查找的值
return $mid - 1; //返回 索引值 减去 1
}else{
$low = $mid -1; //开始的索引 减去 1
}
}
return null; //返回 空
}
$mylist = [1,3,4,5,6,7,9];
echo count($mylist);
echo "///////////";
echo bs($mylist,3);