月度归档:2014 年十一月

PHP实现BF算法

BF算法(Brute Force)

从字符串主S中查找到字符串T的位置。每次一个字符串的对比,若相等,则继续查找后面的字符串。不相等,则从S的下一个字符串继续查找。最后找不到,则返回了-1,否则返回T在S中的开发位置。

下面是PHP的实现:

<?php
 function index($str, $reg, $startPos = 0) {
    $strArr = str_split($str);
    $regArr = str_split($reg);

    if ($startPos >= count($strArr)) {
        return -1;
    }

    $i = $startPos;
    $j = 0;

     while($i < count($strArr) && $j < count($regArr)) {
         if ($strArr[$i] == $regArr[$j]) {
             $i++;
             $j++;
         } else {
             $i = $i - $j + 1;
             $j = 0;
         }

         if ($j >= count($regArr))
         {
             return $i - count($regArr);
         }
     }

     return -1;
 }

 $str = "abdsfasjdkfl";
 $reg = "dkfl";
 print_r(index($str, $reg, 9));

 

php 快速排序

之前写冒泡,选择排序的算法。今天就抽空看看快速排序,快速排序先选择一个基数,将数组中的数据分别与这个基数对比。小于基数的放在一组,大于基数的放在一组。最后在递归对这两个数组继续排序。最后merge返回就是排序好的数据了。

function quick_sort(array $arr) {
    $length = count($arr);

    if ($length <= 1) return $arr;

    $leftArr = $rightArr = array();
    $baseValue = $arr[0];

    for ($i = 1; $i <= $length - 1; $i++) {
        if ($arr[$i] <= $baseValue)
            $leftArr[] = $arr[$i];
        else
            $rightArr[] = $arr[$i];
    }

    return array_merge(quick_sort($leftArr), array($baseValue), quick_sort($rightArr));
}

print_r(quick_sort(array(1,5,3,6,7,2)));

 

 

php Invalid photo dimension

刚才线上的项目,图片旋转的功能,不能使用了。奇怪的是这功能,很久没有变动了。突然就失灵了。后来在本地服务器上测试,正常使用。估计很有可能跟服务器的配置有关。于是把服务器的log下载下来,看了看。硬盘满载了。。原因是因为getimagesize的函数报了一个warning:Invalid photo dimension。估计这个方法,在计算图片的高宽的时候,将远程服务器的地址下载下来了。本地没有空间造成的。

list($width, $height) = getimagesize($url);

 

php二分查找

二分查找法,每次查找的数据,都是上一次的一半。所以速度很快。不过需要建立在已经排序好的数组上。

<?php
function binarySearch(array $arr, $target) {
    $low = 0;
    $max = count($arr) - 1;

    while($low <= $max) {
        $mid = (int)(($max + $low) / 2);

        if ($arr[$mid] > $target) $max = $mid - 1;

        if ($arr[$mid] < $target) $low = $mid + 1;

        if ($arr[$mid] == $target) return $mid;
    }

    return false;
}

echo binarySearch(array(1,2,3,4,5,6,7,8,9,10), 3);

 

php 选择排序

选择排序的算法也很简单。第二层循环,每次就是找出最小的数,然后交换。很简单,但是效率不是很高。

function select_sort(array $arr) {
    $length = count($arr);

    if ($length <= 1) {
        return $arr;
    }

    for ($i = 0; $i < $length; $i++) {      
        for ($j = $i; $j < $length; $j++) {
            if ($arr[$i] > $arr[$j]) {
                $tmp = $arr[$i];
                $arr[$i] = $arr[$j];
                $arr[$j] = $tmp;
            }
        }
    }

    return $arr;
}

$arr = array(1,4,6,2,100,10,9);
print_r(select_sort($arr));

 

PHP冒泡排序

网上关于冒泡的排序的算法,已经很多了。这个算法也很简单。下面是两种冒泡的方式,一个是每次筛选出最大的数,放到最后面。一个是每次找到最小的数,放到最前面。

<?php
$arr = array(10,6,3,8,1,9,33,22,0,-1);

function bubble_sort_one(array $arr) {
    $length = count($arr);

    if ($length <= 1) {
        return $arr;
    }

    for ($i = 0; $i < $length - 1; $i++) {
        for ($j = 0; $j < $length - 1 - $i; $j++) {
            if ($arr[$j] > $arr[$j + 1]) {
                $tmp = $arr[$j];
                $arr[$j] = $arr[$j+1];
                $arr[$j + 1] = $tmp;
            }
        }
    }

    return $arr;
}

function bubble_sort_two(array $arr) {
    $length = count($arr);

    if ($length <= 1) {
        return $arr;
    }

    for ($i = 0; $i < $length - 1; $i++) {
        for ($j = $length - 1; $j > $i; $j--) {
            if ($arr[$j] < $arr[$j - 1]) {
                $tmp = $arr[$j];
                $arr[$j] = $arr[$j - 1];
                $arr[$j - 1] = $tmp;
            }
        }
    }

    return $arr;
}

print_r(bubble_sort_one($arr));
echo "<br/>";
print_r(bubble_sort_two($arr));