月度归档:2014 年十一月

PHP实现BF算法

BF算法(Brute Force)

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

下面是PHP的实现:

01<?php
02 function index($str, $reg, $startPos = 0) {
03    $strArr = str_split($str);
04    $regArr = str_split($reg);
05 
06    if ($startPos >= count($strArr)) {
07        return -1;
08    }
09 
10    $i = $startPos;
11    $j = 0;
12 
13     while($i < count($strArr) && $j < count($regArr)) {
14         if ($strArr[$i] == $regArr[$j]) {
15             $i++;
16             $j++;
17         } else {
18             $i = $i - $j + 1;
19             $j = 0;
20         }
21 
22         if ($j >= count($regArr))
23         {
24             return $i - count($regArr);
25         }
26     }
27 
28     return -1;
29 }
30 
31 $str = "abdsfasjdkfl";
32 $reg = "dkfl";
33 print_r(index($str, $reg, 9));

 

php 快速排序

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

01function quick_sort(array $arr) {
02    $length = count($arr);
03 
04    if ($length <= 1) return $arr;
05 
06    $leftArr = $rightArr = array();
07    $baseValue = $arr[0];
08 
09    for ($i = 1; $i <= $length - 1; $i++) {
10        if ($arr[$i] <= $baseValue)
11            $leftArr[] = $arr[$i];
12        else
13            $rightArr[] = $arr[$i];
14    }
15 
16    return array_merge(quick_sort($leftArr), array($baseValue), quick_sort($rightArr));
17}
18 
19print_r(quick_sort(array(1,5,3,6,7,2)));

 

 

php Invalid photo dimension

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

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

 

php二分查找

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

01<?php
02function binarySearch(array $arr, $target) {
03    $low = 0;
04    $max = count($arr) - 1;
05 
06    while($low <= $max) {
07        $mid = (int)(($max + $low) / 2);
08 
09        if ($arr[$mid] > $target) $max = $mid - 1;
10 
11        if ($arr[$mid] < $target) $low = $mid + 1;
12 
13        if ($arr[$mid] == $target) return $mid;
14    }
15 
16    return false;
17}
18 
19echo binarySearch(array(1,2,3,4,5,6,7,8,9,10), 3);

 

php 选择排序

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

01function select_sort(array $arr) {
02    $length = count($arr);
03 
04    if ($length <= 1) {
05        return $arr;
06    }
07 
08    for ($i = 0; $i < $length; $i++) {     
09        for ($j = $i; $j < $length; $j++) {
10            if ($arr[$i] > $arr[$j]) {
11                $tmp = $arr[$i];
12                $arr[$i] = $arr[$j];
13                $arr[$j] = $tmp;
14            }
15        }
16    }
17 
18    return $arr;
19}
20 
21$arr = array(1,4,6,2,100,10,9);
22print_r(select_sort($arr));

 

PHP冒泡排序

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

01<?php
02$arr = array(10,6,3,8,1,9,33,22,0,-1);
03 
04function bubble_sort_one(array $arr) {
05    $length = count($arr);
06 
07    if ($length <= 1) {
08        return $arr;
09    }
10 
11    for ($i = 0; $i < $length - 1; $i++) {
12        for ($j = 0; $j < $length - 1 - $i; $j++) {
13            if ($arr[$j] > $arr[$j + 1]) {
14                $tmp = $arr[$j];
15                $arr[$j] = $arr[$j+1];
16                $arr[$j + 1] = $tmp;
17            }
18        }
19    }
20 
21    return $arr;
22}
23 
24function bubble_sort_two(array $arr) {
25    $length = count($arr);
26 
27    if ($length <= 1) {
28        return $arr;
29    }
30 
31    for ($i = 0; $i < $length - 1; $i++) {
32        for ($j = $length - 1; $j > $i; $j--) {
33            if ($arr[$j] < $arr[$j - 1]) {
34                $tmp = $arr[$j];
35                $arr[$j] = $arr[$j - 1];
36                $arr[$j - 1] = $tmp;
37            }
38        }
39    }
40 
41    return $arr;
42}
43 
44print_r(bubble_sort_one($arr));
45echo "<br/>";
46print_r(bubble_sort_two($arr));