《Unity3D高级编程之进阶主程》第一章 C#要点技术(六) 搜索算法

发布于:2024-06-28 ⋅ 阅读:(9) ⋅ 点赞:(0)

搜索算法

        广度优先搜索和深度优先搜索是最常见的搜索算法,如果不进行些枝剪的话效率是比较差的,直接使用不加修饰的广度和深度算法,会消耗比较多的CPU以至于整体效率比较差。

        好的搜索算法,大部分需要有数据结构的支撑,在数据结构里记录了信息的特征,前人的搜索的记录,和当前的内容环境,用于枝剪和优化。

二分查找算法

        搜索中用的最多的,也是最简单易用的,效率也比较好的搜索算法。

        前提条件:查找所用的数组必须是有序的数组。

步骤:

  1. 将数组分为三块,分别是前半部分区域,中间位元素,后半部分区域。
  2. 将要查找的值和数组的中间位进行比较,若小于中间位则在前半部分查找,若大于中间位则在后半部分查找,如果等于中值时直接返回。
  3. 继续在选择的查找范围中查找,跳入1步骤,依次进行递归过程,将当前选择的范围继续拆分成前半部分,后半部分,和中间位三部分,直到范围缩小到最小,如果还是没有找到匹配的元素,就说明元素并不在数组里面。

时间复杂度:O(logN)

不停的插入或删除元素,数组的拷贝操作成了算法中的瓶颈。

二叉树、二叉查找树、平衡二叉树、红黑树、B树

        二叉树及其衍生的所有算法都是以父节点有且只有至多两个子节点为规则。

二叉查找树

        二叉树之上建立的查找树,主要目标是快速查找。

        构造特点:左边的子节点一定比父节点小,右边的子节点一定比父节点大。

        由于原始数据的排列不同有可能导致深度很大的二叉树犹如直线连接的节点,搜索的速度由原始数据的排列方式决定,稳定性不高。

平衡二叉树

        很好的解决了查找二叉树的二叉树不平衡问题。

        规则:父节点的左右两棵树的深度差的绝对值不能超过1。

红黑树

        就是实现平衡二叉树的算法,在插入和删除节点操作时通过特定的操作保持二叉查找树的平衡,从而使二叉查找时获得较高的查找效率。

        在实践中是高效的,它能够在O(logN)时间复杂度内做查找,插入和删除操作,这里的N为二叉树中元素的数目。

        数据结构特点:各节点上多了一个颜色值,颜色为红色或黑色。通过对任何一条从根到叶子的路径上各个节点着色方式的限制,红黑树确保没有一条路径会比其他路径长出两倍,因而是接近平衡的。

实际项目中运用较少:

  • 它通常会封装在自定义的底层容器算法中
  • 它的算法复杂度高
  • 可以用“快速排序”+“二分查找”代替,效率稍差一些但简单实用,使用优化后的快速排序效率在查找效率上会优于红黑树,如果逻辑中查找的次数远远大于插入与删除的次数,则可以考虑用“快速排序”+“二分查找”代替这种方式进行替代。

B树

        主要是为磁盘存储设备而设计的一种平衡查找树。

它与红黑树主要区别:

  • B树是建立在查找树之上的多叉树,一个节点上有多个值且父节点可以拥有2个以上的节点
  • 同时还必须保持平衡树的层次结构,即树的深度值不得超过logN的深度(N为节点个数)
  • 比较方式由单一值比较改为了多值比较
  • 在B树结构里一个节点里的信息是个数组,它们是有序的,因此可用二分查找法查找数据,若没有找到准确值,则继续往下搜索子节点的数据。

        它在文件信息存储结构上能发挥巨大作用,这也是它被开发出来的原因之一,其他包括B+和B*树都是从B树衍生而来。

四叉树搜索算法

        四叉树的最重要的理念是空间划分,把一个二维空间划分成多个块来存放,它的数据结构也与二叉树一样只是扩展了子节点的个数。

        相当于是个完美二叉树的变形即完美四叉树,我们可以用一个数组来完美表示完美四叉树的结构情况。

        在实际运用中,四叉树主要在2D平面空间上的搜索用的比较多。

四叉树在游戏项目中的用法

  • 二维平面上的有效碰撞检测搜索范围
  • 地形的有效展示范围
  • 在地图上找某块方块上的人或事
  • 以及包括二维平面的寻路网格构建等。

八叉树搜索算法

        八叉树与四叉树类似,但在理念上更关注三维空间上的划分。八叉树把一个立方体从纵向和横向各切一刀,分割成八个相同大小的立方体。

        用在3D空间中的场景管理,可以很快地获取3D场景中的某范围物体,或测试与其它物体是否有碰撞以及是否在可视范围内。

        八叉树在实际游戏中用到的包括,渲染中的渲染裁切,和物理引擎中的碰撞检测

        优秀的算法都是能找到事物特征并且利用好事物特征的算法,不同种类的算法有其自身的理念,混用或合用几个算法也是常有的事,理解和知晓是第一步,灵活运用真的不是一朝一夕的事。