1:数据结构的基本概念
1:数据:描述客观事物的符号,文本图片,视频等
数据元素:组成数据的,有一定意义的基本单位
数据项:一个数据元素可以由若干个数据项组成
数据对象:性质相同的数据元素的集合
数据结构:数据结构是计算机用来组织和存储数据的方式!具体意义:数据结构是指相互之间存在着一种或者多种关系的数据元素的集合和该集合中数据元素之间的关系组成
2:算法和算法的时间复杂度
时间复杂度:
最高阶的执行次数
常见的时间复杂度:常数阶O(1),线性阶O(n),平方阶,对数阶,nlogn阶,立方阶,指数阶
把最高阶的常数拿掉,剩下的就是时间复杂度的值
3:常见的数据结构:线性表,队列,堆栈,树
线性表的特点:
定义:零个或多个数据元素的有限序列
除掉首尾外,均只有一个直接的前驱和直接的后继
一个数据元素可以有若干个数据项组成
线性表有顺序存储和链式存储两种存储结构
堆栈,队列,串,数组等都是线性表
单链表:
struct_singlelink.php(单链表),findking.php(环形链表,猴子选大王),
用php实现单链表
(见附表)
双向链表:(暂时没有用php实现的代码,不过原理跟php实现单链表相似)
循环单链表:
循环单链表是从单链表发展而来,与单链表不同的是,其末尾节点的next域指向的head,此时就形成了一个循环的一个圆
用php实现循环单链表的代码:(见附表)
队列:先进先出
它是一种只允许在一端进行插入,在另一端进行删除的运算受限的线性表
(1)允许删除的一端是队头(Front)
(2)允许插入的一端为队尾(Rear)
(3)当队列中没有元素时称为空队列
原理图如下:
用php实现队列的增删改查代码(见附表)
堆栈:通常只是指栈信息,先进后出
用php实现堆栈 (见附表)
树:(php实现二叉树)tree search_tree
无序树:树中任意节点的子节点之间没有顺序关系,这种树称为无序树,也称为自由树;
有序树:树中任意节点的子节点之间有顺序关系,这种树称为有序树;
二叉树:每个节点最多含有两个子树的树称为二叉树;
完全二叉树:对于一颗二叉树,假设其深度为d(d>1)。除了第d层外,其它各层的节点数目均已达最大值,且第d层所有节点从左向右连续地紧密排列,这样的二叉树被称为完全二叉树;
满二叉树:对于上述的完全二叉树,如果去掉其第d层的所有节点,那么剩下的部分就构成一个满二叉树(此时该满二叉树的深度为d-1);
二叉树:每个节点最多含有两个子树的树称为二叉树;
完全二叉树:对于一颗二叉树,假设其深度为d(d>1)。除了第d层外,其它各层的节点数目均已达最大值,且第d层所有节点从左向右连续地紧密排列,这样的二叉树被称为完全二叉树;
满二叉树:对于上述的完全二叉树,如果去掉其第d层的所有节点,那么剩下的部分就构成一个满二叉树(此时该满二叉树的深度为d-1);
遍历二叉树:
用php实现二叉树(见附表)
二叉查找(排序)树:
特点:(1)若左子树不空,则左子树上所有的节点的值均小于它的根节点的值
(2)若右子树不空,则右子树上所有的节点的值均大于它的根节点的值
(3)左右子树也分别是二叉查找(排序)树
用php实现二叉查找树(见附表)
4:递归和循环的相互转换
递归:recursion就是自调用,使用递归必须要有明确的递归结束条件
实例:1:1+2+3+........+n
$n=1000;
countn($n);
echo $value/$n;
function countn ($n){
global $value;
if($n>0){
$value = $value + $n;
countn($n-1);
}
}
兔子繁殖问题:
<?php
function rabbit($num,$m,$n = 1){ 参数1:本月的总数;参数2:总共多少个月 参数3:上个月总数
global $result;
$result = $num + $n;
$m = $m-1;
if($m>=1){
rabbit($result,$m,$num);
}
}
rabbit(1,12);
echo $result;
递归和循环的对比:
5:常见的查找和排序算法
二叉平衡查找:(需要自己查)
LL当插入的节点是往左子树的左子节点插入时需要右旋
RR当插入的节点是往右子树的右子节点插入时需要左旋
LR:左子树的右节点上添加时 先左后右旋转
RL:先右后左
算法:
二分查找:(数组必须是有序的,从小到大,或者从大到小)
插值查找:
排序:
什么叫排序:
内排序和外排序:在内存中进行排序的叫内排序(其余的就是外排序)
什么是稳定的排序算法:
正序和逆序的排序比较次数是一样的
评价排序算法的标准有:执行时间和所需的辅助空间,其次是算法的稳定性
冒泡排序:每次循环都做数值的交换
快速排序:对数组进行遍历,一般选取第一个作为标准,大的放一组,小的放一组,最后进行递归,再合并数组
简单选择排序:
每次循环都取出最小值,记住其下标,最后统一调换到数组的最前面
直接插入排序:(这个不太理解)
6: 需要问的问题
:
堆排序
二叉查找树代码分析