数据结构:
双链表 (DLL) 是一个链接到两个方向的节点列表。当底层结构是 DLL 时, 迭代器的操作、对两端的访问、节点的添加或删除都具有 O (1) 的开销。因此, 它为栈和队列提供了一个合适的实现。
堆是遵循堆属性的树状结构: 每个节点都大于或等于其子级, 使用对堆全局的已实现的比较方法进行比较。
数组是以连续方式存储数据的结构, 可通过索引进行访问。不要将它们与 php 数组混淆: php 数组实际上是按照有序的列表实现的。
映射是一个数据拥有键值对。PHP 数组可以被看作是从整数/字符串到值的映射。SPL 提供了从对象到数据的映射。此映射也可用作对象集。
基本的算法:冒泡排序,快速排序,二分查找,顺序查找(需要能够手写)
下文摘自:http://www.jb51.net/article/89047.htm
冒泡排序:
<?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 )); ?>二分查找:
<?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; } } ?>