unity3D技术分享Unity游戏开发经验分享

算法系列之二分查找法

2021-09-13  本文已影响0人  能不写代码么

概述

二分查找是一种算法,其输入是一个有序的元素列表。如果要查找的元素包含列表中,二分查找返回其位置; 否则返回null


举例

这些列子其实都属于查找问题,都可以用二分查找法解决。而且列子中你的想法就和二分法有了很大了关联


图文理解

代码理解二分查找法

int low = 0;
int high = itemList.Count - 1;
int mid = (low + high) / 2; //如果(low + high)不是偶数,将mid向下圆整。
if (itemList[mid] < currentItem)
{
     low = mid + 1;
}
if (itemList[mid] > currentItem)
{
     high = mid - 1;
}

完整的代码如下

using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 转载请注明唯一出处 - 简书
/// 简书地址:https://www.jianshu.com/u/ab8f5ab027bd
/// 简书作者:SunnyShao
/// 创作时间:2021年9月13号
/// </summary>
public class BinarySearchTest : MonoBehaviour
{
    public int currentItem = default(int);          //目标值
    public List<int> itemList = new List<int>();    //目标集合

    private void Awake()
    {
        Debug.Log($"找到的索引 = {BinarySearch_Recursion(0, itemList.Count - 1)}");
    }

    //使用递归的方法进行 二分查找法
    private int BinarySearch_Recursion(int low, int high)
    {
        int mid = (low + high) / 2;

        if (low > high)
        {
            return -1;
        }
        else
        {
            if (itemList[mid] == currentItem)
            {
                return mid;
            }
            else if (itemList[mid] < currentItem)
            {
                low = mid + 1;
                return BinarySearch_Recursion(low, high);
            }
            else
            {
                high = mid - 1;
                return BinarySearch_Recursion(low, high);
            }
        }
    }
}

    //使用循环的方式进行 二分查找法
    private int BinarySearch_While()
    {
        int low = 0;
        int high = itemList.Count - 1;
        int mid;
        while (low <= high)                         //只要范围没有缩小到只包含一个元素
        {
            mid = (low + high) / 2;                 //就检查中间的元素
            if (itemList[mid] == currentItem)
            {
                return mid;
            }
            else if (itemList[mid] < currentItem)
            {
                low = mid + 1;
            }
            else if (itemList[mid] > currentItem)
            {
                high = mid - 1;
            }
        }
        return -1;
    }

大O表示法

大O表示法指出了算法有多快。例如,假设列表包含n个元素。简单查找需要检查每个元素,因此需要执行n次操作。使用大O表示法,这个运行时间为O(n)。大O表示法指的并非以秒为单位的速度。大O表示法让你能够比较操作数,它指出了算法运行时间的增速。

二分查找法运行时间

检查长度为n的列表,二分查找需要执行log n次操作。使用大O表示法,这个运行时间怎么表示呢?O(log n)

对数复习

参考

《算法图解》(确实像小说一样有趣的算法书)

上一篇下一篇

猜你喜欢

热点阅读