精华内容
下载资源
问答
  • php算法精选

    2012-02-04 11:18:18
    php算法精选,讲述了PHP常用的算法,面试,工作必备
  • │ ├── Kmp.php 算法导论-KMP算法 │ ├── DijkstraQuery.php 迪克斯特拉算法 │ │ └── QulickQuery.php 快速查找 │ │ │ ├── Structure 数据结构 │ │ ├── StackExample.php 堆栈 先进后出 LIFO...
  • 到此这篇关于50个优秀经典PHP算法大集合 附源码的文章就介绍到这了,更多相关PHP算法大集合内容请搜索软件开发网以前的文章或继续浏览下面的相关文章希望大家以后多多支持软件开发网! 您可能感兴趣的文章:PHP实现的...
  • php 算法 爬楼梯有多少种方法
  • PHP算法面试题

    万次阅读 2018-05-27 11:59:29
    冒泡排序算法 基本思想: 对需要排序的数组从后往前(逆序)进行多遍的扫描,当发现相邻的两个数值的次序与排序要求的规则不一致时,就将这两个数值进行交换。这样比较小(大)的数值就将逐渐从后面向前面移动。...

    码字不易,转载请附原链,搬砖繁忙回复不及时见谅,技术交流请加QQ群:909211071

    冒泡排序算法

    基本思想:对需要排序的数组从后往前(逆序)进行多遍的扫描,当发现相邻的两个数值的次序与排序要求的规则不一致时,就将这两个数值进行交换。这样比较小(大)的数值就将逐渐从后面向前面移动。

    <?php
    
      function mysort($arr)
      {
        for($i = 0; $i < count($arr); $i++)
        {
          $isSort = false;
          for ($j=0; $j< count($arr) - $i - 1; $j++) 
          {
            if($arr[$j] < $arr[$j+1])
            {
              $isSort = true;
              $temp = $arr[$j];
              $arr[$j] = $arr[$j+1];
              $arr[$j+1] = $temp ;
            }
          }
          if(!$isSort)
          {
            break;
          }
        }
        return $arr;
      }
    
      $arr = array(3,1,2);
      var_dump(mysort($arr));
    ?>

     

    快速排序

    基本思想:在数组中挑出一个元素(多为第一个)作为标尺,扫描一遍数组将比标尺小的元素排在标尺之前,将所有比标尺大的元素排在标尺之后,通过递归将各子序列分别划分为更小的序列直到所有的序列顺序一致。

    <?php
      //快速排序
        function quick_sort($arr) 
        {
          //先判断是否需要继续进行
          $length = count($arr);
          if($length <= 1) 
          {
            return $arr;
          }
    
          $base_num = $arr[0];//选择一个标尺 选择第一个元素
    
          //初始化两个数组
          $left_array = array();//小于标尺的
          $right_array = array();//大于标尺的
          for($i=1; $i<$length; $i++) 
          {      //遍历 除了标尺外的所有元素,按照大小关系放入两个数组内
            if($base_num > $arr[$i]) 
            {
              //放入左边数组
              $left_array[] = $arr[$i];
            } 
            else
            {
              //放入右边
              $right_array[] = $arr[$i];
            }
          }
          //再分别对 左边 和 右边的数组进行相同的排序处理方式
          //递归调用这个函数,并记录结果
          $left_array = quick_sort($left_array);
          $right_array = quick_sort($right_array);
          //合并左边 标尺 右边
          return array_merge($left_array, array($base_num), $right_array);
        }
    
        $arr = array(3,1,2);
        var_dump(quick_sort($arr));
    
    ?>

     

    二分查找

    基本思想:假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较,如果当前位置值等于x,则查找成功;若x小于当前位置值,则在数列的前半段中查找;若x大于当前位置值则在数列的后半段中继续查找,直到找到为止。(数据量大的时候使用)

    <?php
      //二分查找
      function bin_search($arr,$low,$high,$k)
      {
        if($low <= $high)
        {
          $mid = intval(($low + $high)/2);
          if($arr[$mid] == $k)
          {
            return $mid;
          }
          else if($k < $arr[$mid])
          {
            return bin_search($arr,$low,$mid-1,$k);
          }
          else
          {
            return bin_search($arr,$mid+1,$high,$k);
          }
        }
        return -1;
      }
    
      $arr = array(1,2,3,4,5,6,7,8,9,10);
    
      print(bin_search($arr,0,9,3));
    ?>

     

    顺序查找

    基本思想:从数组的第一个元素开始一个一个向下查找,如果有和目标一致的元素,查找成功;如果到最后一个元素仍没有目标元素,则查找失败。

    <?php
      //顺序查找
      function seq_search($arr,$n,$k)
      {
        $array[$n] = $k;
        for($i = 0;$i < $n; $i++)
        {
          if($arr[$i] == $k)
          {
            break;
          }
        }
    
        if($i < $n)
        {
          return $i;
        }
        else
        {
          return -1;
        }
      }
    ?>

     

    遍历文件夹

    <?php  
      function my_scandir($dir)
      {
        $files = array();
        if($handle = opendir($dir))
        {
          while (($file = readdir($handle))!== false) 
          {
            if($file != '..' && $file != '.')
            {
              if(is_dir($dir."/".$file))
              {
                $files[$file]=my_scandir($dir."/".$file);
              }
              else
              {
                $files[] = $file;
              }
            }
          }
    
          closedir($handle);
          return $files;
        }
      }
    
      var_dump(my_scandir('../'));
    ?>

     

    写一个函数,尽可能高效的从一个标准url中取出文件的扩展名

    <?php
      function getExt($url)
      {
        $arr = parse_url($url);//parse_url解析一个 URL 并返回一个关联数组,包含在 URL 中出现的各种组成部分
        //'scheme' => string 'http' (length=4)
        //'host' => string 'www.sina.com.cn' (length=15)
        //'path' => string '/abc/de/fg.php' (length=14)
        //'query' => string 'id=1' (length=4)
        $file = basename($arr['path']);// basename函数返回路径中的文件名部分
        $ext = explode('.', $file);
        return $ext[count($ext)-1];
      }
    
      print(getExt('http://www.sina.com.cn/abc/de/fg.html.php?id=1'));
    
    ?>

     

    实现中文字符串截取无乱码的方法

    可使用mb_substr,但是需要确保在php.ini中加载了php_mbstring.dll,即确保“extension=php_mbstring.dll”这一行存在并且没有被注释掉,否则会出现未定义函 数的问题。

     

    数据结构和算法

    使对象可以像数组一样进行foreach循环,要求属性必须是私有。(Iterator模式的PHP实现,写一类实现Iterator接口)(腾讯)

    <?php
        class Test implements Iterator{
        private $item = array('id'=>1,'name'=>'php');
    
        public function rewind(){
            reset($this->item);
        }
    
        public function current(){
            return current($this->item);
        }
    
        public function key(){
            return key($this->item);
        }
    
        public function next(){
            return next($this->item);
        }
    
        public function valid(){
            return($this->current()!==false);
        }
    }
        //测试
        $t=new Test;
        foreach($t as $k=>$v){
            echo$k,'--->',$v,'<br/>';
        }
    ?>

     

    用PHP实现一个双向队列(腾讯)

    <?php
        class Deque{
        private $queue=array();
        public function addFirst($item){
            return array_unshift($this->queue,$item);
        }
    
        public function addLast($item){
            return array_push($this->queue,$item);
        }
        public function removeFirst(){
            return array_shift($this->queue);
        }
    
        public function removeLast(){
            return array_pop($this->queue);
        }
    }
    ?>

     

    (约瑟夫环)猴子选大王

    思路:一群猴子排成一圈,按1,2,...,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去...,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n,输出最后那个大王的编号。(新浪)(小米)

    <?php
        function king($n,$m){
            $mokey = range(1, $n);
            $i = 0;
     
            while (count($mokey) >1) {
                $i += 1;
                $head = array_shift($mokey);//一个个出列最前面的猴子
                if ($i % $m !=0) {
                    #如果不是m的倍数,则把猴子返回尾部,否则就抛掉,也就是出列
                    array_push($mokey,$head);
                }
            }
            return $mokey[0];
        }
        // 测试
        echo king(10,7);
    ?>

     

    二维数组排序算法函数,能够具有通用性,可以调用php内置函数。

    <?php
    
    
    function array_sort(&$arr, $order = [])
        {
            $result = [];
            if (empty($arr)) {
                return $result;
            }
     
            uasort($arr, function ($a, $b) use ($order) {
                foreach ($order as $key => $sort) {
                    array_shift($order);
                    if ($a[$key] == $b[$key]) {
                        continue;
                    }
                    if ($sort === 'DESC') {
                        return ($a[$key] > $b[$key]) ? -1 : 1;
                    } else {
                        return ($a[$key] > $b[$key]) ? 1 : -1;
                    }
                }
                return 0;
            });
            foreach ($arr as $value) {
                $result[] = $value;
            }
     
            $arr = $result;
    
        //测试
        $person = array(
            array('id'=>2,'name'=>'lhangsan','age'=>23),
            array('id'=>5,'name'=>'zisi','age'=>28),
            array('id'=>3,'name'=>'apple','age'=>17)
        );
        array_sort($person, ['name' => 'asc']);
    
    
        print_r($person);
    
    
    ?>
    

     

    顺序查找和二分查找(也叫做折半查找)算法,顺序查找必须考虑效率,对象可以是一个有序数组(小米)

    <?php
        /**
         * 顺序查找
         * @param  array $arr 数组
         * @param   $k   要查找的元素
         * @return   mixed  成功返回数组下标,失败返回-1
         */
        function seq_sch($arr,$k){
            for ($i=0,$n = count($arr); $i < $n; $i++) {
                if ($arr[$i] == $k) {
                    break;
                }
            }
            if($i < $n){
                return $i;
            }else{
                return -1;
            }
        }
    
        /**
         * 二分查找,要求数组已经排好顺序
         * @param  array $array 数组
         * @param  int $low   数组起始元素下标
         * @param  int $high  数组末尾元素下标
         * @param   $k     要查找的元素
         * @return mixed        成功时返回数组下标,失败返回-1
         */
        function bin_sch($array,$low,$high,$k){
            if ($low <= $high) {
                $mid = intval(($low + $high) / 2);
                if ($array[$mid] == $k) {
                    return $mid;
                } elseif ($k < $array[$mid]) {
                    return bin_sch($array,$low,$mid - 1,$k);
                } else{
                    return bin_sch($array,$mid + 1,$high,$k);
                }
            }
            return -1;
        }
    
        // 测试:顺序查找
        $arr1 = array(9,15,34,76,25,5,47,55);
        echo seq_sch($arr1,47);//结果为6
    
        echo "<br />";
    
        // 测试:二分查找
        $arr2 = array(5,9,15,25,34,47,55,76);
        echo bin_sch($arr2,0,7,47);//结果为5
    ?>

     

    洗牌算法

    <?php
        $card_num = 54;//牌数
        function wash_card($card_num){
            $cards = $tmp = array();
            for($i = 0;$i < $card_num;$i++){
                $tmp[$i] = $i;
            }
    
            for($i = 0;$i < $card_num;$i++){
                $index = rand(0,$card_num-$i-1);
                $cards[$i] = $tmp[$index];
                unset($tmp[$index]);
                $tmp = array_values($tmp);
            }
            return $cards;
        }
        // 测试:
        print_r(wash_card($card_num));
    ?>

     

    要学习更多原理知识,欢迎加群交流:909211071

    展开全文
  • php算法与数据结构

    2012-02-14 21:38:12
    php语言领域里比较经典的一些算法描述,值得下载
  • PHP 算法面试题

    千次阅读 2013-12-03 11:44:40
    1. 使用PHP描述冒泡排序和快速排序算法,对象可以是一个数组 2. 使用PHP描述顺序查找和二分查找(也叫做折半查找)算法,顺序查找必须考虑效率,对象可以是一个有序数组 3. 写一个二维数组排序算法函数,能够具有...
    1. 使用
    PHP描述
    冒泡排序和快速排序算法,对象可以是一个数组
    
    2. 使用PHP描述顺序查找和二分查找(也叫做折半查找)算法,顺序查找必须考虑效率,对象可以是一个有序数组

    3. 写一个二维数组排序算法函数,能够具有通用性,可以调用php内置函数

    【附答案】(以下答案不一定是最好的,只是一个简单的参考)


    一、基础题
    1. 相等 相等 不相等
    2. true true true true true false true false
    3. aaaaaa
    4. 5 0 1
    5. 5 2
    6. 1 2
    7. 使用五种以上方式获取一个文件的扩展名
    function get_ext1($file_name){
    return strrchr($file_name, ‘.’);
    }
    function get_ext2($file_name){
    return substr($file_name, strrpos($file_name, ‘.’));
    }
    function get_ext3($file_name){
    return array_pop(explode(‘.’, $file_name));
    }
    function get_ext4($file_name){
    $p = pathinfo($file_name);
    return $p['extension'];
    }
    function get_ext5($file_name){
    return strrev(substr(strrev($file_name), 0, strpos(strrev($file_name), ‘.’)));
    }

    二、算法题
    1. 使用PHP描述冒泡排序和快速排序算法,对象可以是一个数组
    //冒泡排序(数组排序)
    function bubble_sort($array)
    {
    $count = count($array);
    if ($count <= 0) return false;
    for($i=0; $i<$count; $i++){
    for($j=$count-1; $j>$i; $j–){
    if ($array[$j] < $array[$j-1]){
    $tmp = $array[$j];
    $array[$j] = $array[$j-1];
    $array[$j-1] = $tmp;
    }
    }
    }
    return $array;
    }

    //快速排序(数组排序)
    function quick_sort($array) {
    if (count($array) <= 1) return $array;
    $key = $array[0];
    $left_arr = array();
    $right_arr = array();
    for ($i=1; $i
    if ($array[$i] <= $key)
    $left_arr[] = $array[$i];
    else
    $right_arr[] = $array[$i];
    }
    $left_arr = quick_sort($left_arr);
    $right_arr = quick_sort($right_arr);
    return array_merge($left_arr, array($key), $right_arr);
    }

    2. 使用PHP描述顺序查找和二分查找(也叫做折半查找)算法,顺序查找必须考虑效率,对象可以是一个有序数组
    //二分查找(数组里查找某个元素)
    function bin_sch($array, $low, $high, $k){
    if ($low <= $high){
    $mid = intval(($low+$high)/2);
    if ($array[$mid] == $k){
    return $mid;
    }elseif ($k < $array[$mid]){
    return bin_sch($array, $low, $mid-1, $k);
    }else{
    return bin_sch($array, $mid+1, $high, $k);
    }
    }
    return -1;
    }

    //顺序查找(数组里查找某个元素)
    function seq_sch($array, $n, $k){
    $array[$n] = $k;
    for($i=0; $i<$n; $i++){
    if($array[$i]==$k){
    break;
    }
    }
    if ($i<$n){
    return $i;
    }else{
    return -1;
    }
    }

    3. 写一个二维数组排序算法函数,能够具有通用性,可以调用php内置函数
    //二维数组排序, $arr是数据,$keys是排序的健值,$order是排序规则,1是升序,0是降序
    function array_sort($arr, $keys, $order=0) {
    if (!is_array($arr)) {
    return false;
    }
    $keysvalue = array();
    foreach($arr as $key => $val) {
    $keysvalue[$key] = $val[$keys];
    }
    if($order == 0){
    asort($keysvalue);
    }else {
    arsort($keysvalue);
    }
    reset($keysvalue);
    foreach($keysvalue as $key => $vals) {
    $keysort[$key] = $key;
    }
    $new_array = array();
    foreach($keysort as $key => $val) {
    $new_array[$key] = $arr[$val];
    }
    return $new_array;
    }


    希望本文对广大php开发者有所帮助,感谢您阅读本文。如果您想要了解更多php技术问题欢迎加群探讨:304224365 ,验证码:csl,不写验证不予通过哟~

    展开全文
  • php算法之快速排序

    千次阅读 2013-07-25 12:36:57
    php快速排序算法的实现
    /**
     * 快速排序
     * 原理:
     *  快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。
     * 最差时间复杂度 O(n*n)
     * 最优时间复杂度 O(nlogn)
     * 平均时间复杂度 O(nlogn)
     */
    
    function Qsort($array) {
        if (!is_array($array) || empty($array)) {
            return array();
        }
        $len = count($array);
        if($len <= 1){
            return $array;
        }
        $key = $array[0];
        $left = array();
        $right = array();
        for($i = 1; $i < $len; $i++) {
            if ($array[$i] <= $key) {
                $left[] = $array[$i];
            } else {
                $right[] = $array[$i];
            }
        }
        $left = Qsort($left);
        $right = Qsort($right);
        return array_merge($left, array($key), $right);
    }

    展开全文
  • 本人学习php有一段时间了php在做开发时最常用的是框架请问php需要好的算法能力吗?
  • php算法 阶乘、排列、组合

    千次阅读 2016-11-14 16:37:13
    <?php /** * 阶乘 */ function factorial($n) { //array_product 计算并返回数组的乘积 //range 创建一个包含指定范围的元素的数组 return array_product(range(1, $n)); }/** * 排列数 */ function A($n, $...
    <?php 
    /**
     * 阶乘
     */
    function factorial($n) {
        //array_product 计算并返回数组的乘积
        //range 创建一个包含指定范围的元素的数组
        return array_product(range(1, $n));
    }
    
    /**
     * 排列数
     */
    function A($n, $m) {
        return factorial($n)/factorial($n-$m);
    }
    
    /**
     * 组合数
     */
    function C($n, $m) {
        return A($n, $m)/factorial($m);
    }
    
    /**
     * 排列结果
     */
    function arrangement($a, $m) {
        $r = array();
        $n = count($a);
        if ($m <= 0 || $m > $n) {
            return $r;
        }
        for ($i=0; $i<$n; $i++) {
            $b = $a;
            //从数组中移除选定的元素,并用新元素取代它。该函数也将返回包含被移除元素的数组
            $t = array_splice($b, $i, 1);
            if ($m == 1) {
                $r[] = $t;
            } else {
                $c = arrangement($b, $m-1);
                foreach ($c as $v) {
                    $r[] = array_merge($t, $v);
                }
            }
        }
    
        return $r;
    }
    
    
    /**
     * 组合结果
     */
    function combination($a, $m) {
        $r = array();
    
        $n = count($a);
        if ($m <= 0 || $m > $n) {
            return $r;
        }
    
        for ($i=0; $i<$n; $i++) {
            $t = array($a[$i]);
            if ($m == 1) {
                $r[] = $t;
            } else {
                //array_slice() 函数在数组中根据条件取出一段值,并返回。
                //array_slice(array,start,length,preserve)
                $b = array_slice($a, $i+1);
                $c = combination($b, $m-1);
                foreach ($c as $v) {
                    //array_merge() 函数把一个或多个数组合并为一个数组
                    $r[] = array_merge($t, $v);
                }
            }
        }
    
        return $r;
    }
    
    
    
    var_dump(C(5, 3));
    $res = combination(range(1, 5), 3);
    $res = var_export($res, true);
    error_log($res);
    
    ?>
    展开全文
  • php算法-输出100以内能被3整除的整数

    千次阅读 2017-01-14 10:31:06
    有多种方式可以实现上述的问题,其中最简单的一种:<?php for($i=1; $i; $i++){ echo $i, ' '; } ?>以下这种方式可以优化代码提高执行效率:<?php for($i=3; $i; $i=$1+3){ echo $i, ' '; } ?>
  • php算法----队列

    千次阅读 2010-06-05 10:26:00
    此队列算法中有两个类一个是data类,这个类是存放数据;第二个是queue也就是队列类这个就是队列的一些操作。首先队列里包含front(队列的头,也就是出队是要出去的) rear(队列的尾部在这里永远指向0) queue(存放...
  • 算法:多个属性不同的组合 /** * 風.Fox */ class test { //组合 public static $attNew=array(); //源 public static $att=array(); //个数 public static $attCount=0; /** * 格式化行 */ public ...
  • php算法分割数组,不用array_chunk();算法如下所示。 <?php function array_chunk_list($array, $size, $preserve_keys = false) { reset($array); $i = 0; foreach ($array as $key => $value) { // 是否...
  • php实现的几种基本算法

    千次阅读 2017-03-20 17:06:08
    php算法
  • php加密算法类,解密算法php_encrypt,php_decrypt
  • PHP 异或 算法

    千次阅读 2018-10-08 10:24:53
    PHP 异或 算法 /** * PHP字符串“异或”算法 * param array key * @param Request $request * @return mixed|string|void */ public function setSecretKey(Request $request){ $keyAr...
  • PHP数据结构算法大全

    2010-11-29 23:33:24
    各种PHP算法。比较全的数据结构算法,收集了很长的时间才收集到的。
  • 主要介绍了PHP Hash算法:Times33算法代码实例,本文直接给出实现代码,需要的朋友可以参考下
  • PHP常见算法合集

    万次阅读 2020-10-24 01:07:40
    PHP常见算法合集,常码字不易,出精品更难,没有特别幸运,那么请先特别努力,别因为懒惰而失败,还矫情地将原因归于自己倒霉。你必须特别努力,才能显得毫不费力。如果这篇文章能给你带来一点帮助,希望给飞兔小...
  • php数据结构算法

    2012-11-28 22:38:57
    php数据结构算法php数据结构算法php数据结构算法
  • php的hash算法介绍

    2020-12-18 22:08:59
    PHP的HashTable采用的拉链法来解决冲突, 这个自不用多说, 我今天主要关注的就是PHP的Hash算法, 和这个算法本身透露出来的一些思想。 PHP的Hash采用的是目前最为普遍的DJBX33A (Daniel J. Bernstein, Times 33 with ...
  • php中奖概率算法

    2019-04-04 17:59:28
    php 中奖概率算法 经典的概率算法,开始是从1,1000 这个概率范围内筛选第一个数是否在他的出现概率范围之内, 如果不在,则将概率空间,也就是k的值减去刚刚的那个数字的概率空间, 在本例当中就是减去100,也就是说...
  • 排序算法 PHP源码 php排序排序算法 PHP源码 php排序排序算法 PHP源码 php排序排序算法 PHP源码 php排序排序算法 PHP源码 php排序排序算法 PHP源码 php排序排序算法 PHP源码 php排序排序算法 PHP源码 php排序排序算法...
  • PHP排序算法类实例

    2020-10-24 01:57:20
    主要介绍了PHP排序算法类,实例分析了插入排序、选择排序、冒泡排序、快速排序等排序算法的原理与实现技巧,需要的朋友可以参考下
  • php版 dijkstra算法

    2013-03-19 13:59:05
    最短路径法 dijkstra算法 php实现
  • php实现kmeans算法

    2019-04-23 23:23:58
    php实现kmeans算法,在此基础上可以修改为数据库数据的聚类分析。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 172,870
精华内容 69,148
关键字:

php算法