PHP学习心得


<ul> <li>是由n(n&gt;=1)个有限节点组成一个具有层次关系的集合。</li> <li>把它叫做 “树” 是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。</li> </ul> <h2>特点</h2> <ul> <li>每个节点有零个或多个子节点;</li> <li>没有父节点的节点称为根节点;</li> <li>每一个非根节点有且只有一个父节点;</li> <li>除了根节点外,每个子节点可以分为多个不相交的子树;</li> <li>日常应用中使用比较树种类,是二叉树。 </li> </ul> <h2>二叉树特点</h2> <ul> <li>每个结点最多有两颗子树,结点的度最大为2。 </li> <li>左子树和右子树是有顺序的,次序不能颠倒。 </li> <li> <p>即使某结点只有一个子树,也要区分左右子树。</p> </li> <li>二叉树是一种比较有用的折中方案,它添加,删除元素都很快,并且在查找方面也有很多的算法优化,</li> <li>二叉树既有链表的好处,也有数组的好处,是两者的优化方案,在处理大批量的动态数据方面非常有用。</li> <li>二叉树有很多扩展的数据结构,包括平衡二叉树、红黑树、B+树等, <ul> <li>例如mysql的数据库索引结构用的就是B+树,还有HashMap的底层源码中用到了红黑树。</li> </ul></li> </ul> <h2>树分类</h2> <ul> <li>二叉树 <ul> <li>每个结点有且只有两个分支</li> <li>每个结点是无序的</li> </ul></li> <li>BST <ul> <li>binary serach tree 二叉搜索树</li> <li>插入数据时,必须有序,左子树必须小于根节点,右子树必须大于根节点</li> <li>使用二分查询,提高查询效率</li> </ul></li> <li>AVL(平衡二叉树) <ul> <li>AVL 树得名于它的发明者 G. M. Adelson-Velsky 和 Evgenii Landis,他们在1962年的论文《An algorithm for the organization of information》中公开了这一数据结构</li> <li>如果插入数据是递增或递减顺序时,怎么办?</li> <li>退化成链表,查询复杂度为O(n)</li> <li>经过左旋或者右旋,让树平衡起来,就是平衡二叉树</li> <li>平衡二叉树要求最短子树与最长子树高度不能超过1</li> <li>为保证平衡,在插入数据时必须要旋转,通过插入性能的损失来弥补查询性能的提升</li> </ul></li> <li>红黑树 <ul> <li>基于平衡二叉树,如果读写请求一样多时,引入红黑树</li> <li>经过左旋或者右旋,让树平衡起来,还有变色行为</li> <li>最长子树高度不超过最短子树高度2倍即可</li> <li>查询性能与插入性能取得近似一致</li> </ul></li> <li>B树 <ul> <li>把有序二叉树变成有序多叉树,每一个节点可以存放多个数据值</li> <li>如果存储更多数据,需要在B树基础,继续增加节点,树的深度又会变深,I\O量就会继续增加</li> </ul></li> <li>B+树 <ul> <li>子叶节点存储数据,非子叶节点不存储数据</li> <li>mysql的B+树一般是最多3到4层,保持key的长度越小越好,存储数据量就越大</li> <li>面试问题:创建索引时,字段类型使用int好,还是使用varchar好</li> <li>取决于int和varchar取支持的长度是多少,</li> <li>如int(4),int为4字字节,varchar(5),varchar为5字节,就使用int类型,由于int的4字节小于varchar的5字节</li> </ul></li> </ul> <h2>mysql为什么要使用B+树</h2> <ul> <li>二叉树,红黑树,B树等数据结构,随着数据的插入,发现树的深度会变深,树的深度越深,意味着I\O次数越多,影响数据读取效率</li> <li>树的深度尽量小决定的,提高读取效率</li> </ul> <h2>B+树注意</h2> <ul> <li>在B+树有两个头指针。一个头指针指向根节点,一个头指针指向关键字最小叶子节点,所有叶子节点(数据节点)之间是一种链式环结构</li> <li>B+树进行两种查找运算 <ul> <li>对于主键的范围查找和分页查找</li> <li>从根节点开始,进行随机查找</li> </ul></li> </ul> <h2>磁盘块数据组成</h2> <ul> <li>key</li> <li>value,每一行完整记录</li> <li>指针,如果匹配不到,下一个磁盘块在什么地方</li> </ul> <h2>数据结构思路练习</h2> <ul> <li>数据结构可视化网站 <ul> <li><a href="https://www.cs.usfca.edu/~galles/visualization/Algorithms.html">https://www.cs.usfca.edu/~galles/visualization/Algorithms.html</a></li> </ul></li> <li> <p>选择平衡二叉树</p> <ul> <li><a href="https://www.cs.usfca.edu/~galles/visualization/AVLtree.html">AVL Trees (Balanced binary search trees)</a></li> </ul> </li> <li>选择红黑树 <ul> <li><a href="https://www.cs.usfca.edu/~galles/visualization/RedBlack.html">Red-Black Trees</a></li> </ul></li> </ul>

页面列表

ITEM_HTML