作为程序员一定要保持良好的睡眠,才能好编程

常见算法考察点及常见结构

发布时间:2019-04-08




为什么要研究算法,算法到底有什么用? 冒泡排序、插入排序、快速排序



什么是算法?算法是解决问题的操作步骤,算法每执行一步都有其确定性。

解决同一问题,有着不同的解决思路,思路不同,效率不同,空间复杂度也是不一样。


算法的概念:一个问题可以有多种算法,每种算法有不同过的效率




常见算法考点:



冒泡排序原理和实现

查找算法


    一个算法有五个特征:有穷性   确切性   输入项  输出项  可行性  

        

      选择合适的算法和改进算法  

      执行算法所需要的计算工作量。一般来说,计算机算法是问题规模n的函数

     T(n)=O(f(n))

        问题的规模n越大,算法执行的时间增长率越高。时间复杂度。

    

        



    O(1) 常数阶

    O(n) 线性阶

    O(n^2)

    


    请将一个url地址中的page去掉

    $url=$_SERVER['REQUEST_URI'];


    $params=parse_url($url);

    P($params);

    parse_str($params['query'],$http);
    P($http);

    unset($http['page']);

    $new_query=http_build_query($http);
    P($new_query);
    P($params['path']."?".$new_query);
    function P($_data){
        echo "<pre style='color:blue'>";
        print_r($_data);
        echo "</pre>";

    }




                

    时间复杂度和空间复杂度

    常见排序算法

    常见查找算法

            

        冒泡排序

        两两相邻的数进行比较,如果反序就交换,否则不交换。

        

        



        直接插入排序

        希尔排序

        选择排序

        快速排序:快

        堆排序


        归并排序:那个算法  最快


    



        请描述时间复杂度和空间复杂度的概念

         

        


        一个有序数组中,查询特定item是否存在的最优算法是什么?时间复杂度是什么?

            这个就是快速查找法   或归并排序法   二分查找法   log2n  速度最快



查找:

   分两种查找方式 1、顺序查找   2、二分查找

   二分查找的效率高于顺序查找,  前提,数据是顺序排序


二分查找时间复杂度最差是O(log2n) 对数阶,顺序查找的时间复杂度最差为O(n),所以二分查找速度更快。

在递归情况下,二分查找法更消耗内存,空间复杂度是O(log2n),迭代复杂度是O(1)





冒泡排序

$arr = array(10, 2, 36, 14, 25, 10,23, 85, 99, 45);


function bubbling($data){
	$len=count($data);
	for($i=1;$i<$len;$i++){

		for($j=0;$j<$len-$i;$j++){

			if($data[$j]>$data[$j+1]){
				$temp=$data[$j];
				$data[$j]=$data[$j+1];
				$data[$j+1]=$temp;
			}
		}
	}
	return $data;
}

$data=bubbling($arr);

print_r($data);


快速排序

时间复杂度:最差 O(n^2)  平均 O(nlog2n)

空间复杂度:最差 O(n) 平均 O(log2n)


快速排序、归并排序的理想时间复杂度是O(log2n),但是快速排序的时间复杂度并不稳定,最坏情况下复杂度为O(n^2),所以最理想的算法还是归并排序。

$arr = array(10, 2, 36, 14, 25, 10,23, 85, 99, 45);

function quickSort($data){
	if(count($data)<=1)
		return $data;

	$first=$data[0];
	$left=[];
	$right=[];
	$len=count($data);
	for($i=1;$i<$len;$i++){
		if($data[$i]<$first){
			$left[]=$data[$i];
		}else{
			$right[]=$data[$i];
		}
	}
	$left=quickSort($left);
	$right=quickSort($right);
	return array_merge($left,[$first],$right);
}

$data=quickSort($arr);

print_r($data);




插入排序

时间复杂度:最差 O(n^2)  平均 O(n^2)

空间复杂度: O(1) 

原理:每次从无序表中取出第一个元素,把它插入到有序表合适位置,使有序表仍然有序。


function insertSort($data){	
	$len=count($data);
	for ($i=1;$i<$len;$i++) { 
		$j=$i;
		while($j>0) {
			if($data[$j-1]>$data[$j]){
				$temp=$data[$j-1];
				$data[$j-1]=$data[$j];
				$data[$j]=$temp;
			}			
			$j--;
		}
	}
	return $data;
}

$data=insertSort($arr);

print_r($data);


归并排序

$arr = array(10, 2, 36, 14, 25, 10,23, 85, 99, 45);

//merge函数将指定的两个有序数组(arr1,arr2)合并并且排序
//我们可以找到第三个数组,然后依次从两个数组的开始取数据哪个数据小就先取哪个的,然后删除掉刚刚取过///的数据
function al_merge($arrA,$arrB){
    $arrC = array();
    while(count($arrA) && count($arrB)){
        //这里不断的判断哪个值小,就将小的值给到arrC,但是到最后肯定要剩下几个值,
        //不是剩下arrA里面的就是剩下arrB里面的而且这几个有序的值,肯定比arrC里面所有的值都大所以使用
        $arrC[] = $arrA['0'] < $arrB['0'] ? array_shift($arrA) : array_shift($arrB);
    }
    return array_merge($arrC, $arrA, $arrB);
}

//归并排序主程序
function al_merge_sort($arr){
    $len = count($arr);
    
    if($len <= 1)
        return $arr;
    //递归结束条件,到达这步的时候,数组就只剩下一个元素了,也就是分离了数组
    
    $mid = intval($len/2);//取数组中间
    $left_arr = array_slice($arr, 0, $mid);//拆分数组0-mid这部分给左边left_arr
    $right_arr = array_slice($arr, $mid);//拆分数组mid-末尾这部分给右边right_arr
    
    $left_arr = al_merge_sort($left_arr);//左边拆分完后开始递归合并往上走
    $right_arr = al_merge_sort($right_arr);//右边拆分完毕开始递归往上走

    $arr = al_merge($left_arr, $right_arr);//合并两个数组,继续递归
    return $arr;
}

//$arr = array(12, 5, 4, 7, 8, 3, 4, 2, 6, 4, 9);
print_r(al_merge_sort($arr));



header("Content-type:text/html;charset=utf-8");
$_data=array(1,5,2,6,7,3,9);
//请按照冒泡排序进行排序