算法思想:分治法

本文介绍了分治法这一常用算法思想,通过二分查找和归并排序的例子详细阐述其核心思想和实现过程。二分查找的时间复杂度分析展示了分治法如何将大问题分解为小问题解决。归并排序则演示了分治法在排序问题上的应用。文章还探讨了分治法在不同规模问题上的时间复杂度。

分治法相关

在偶尔做算法题时,很多人的解题思路都使用了分治法的思想,分治法是一种常用的算法思想。

分治法的核心思想是分解问题,将复杂问题分解,找到问题的最小规模,逐个击破

期间也可以使用递归对分解后的任务进行分治

图解在这里插入图片描述
例子:
二分查找:

分治问题最简单的例子即为二分查找,即查找链表的某个值
将链表(数组)分为两个数组(同时对数组进行递归),分别查找两边数组
比较这两个数
以JS为例:

binarySearch(val, arr) {
      const serachFun = (arr, left = 0, right = array.length) => {
        if (left >= right) return -1 // 空 或 头尾相接
        const middle = parseInt((left + right) / 2) // 二分开始
        if (arr[middle] === val) {
          return middle  // 查找成功
        } else if (arr[middle] < val) {
          return serachFun(arr, middle + 1, right) // 移动游标
        } else if (arr[middle] > val) {
          return serachFun(arr, left, middle)   // 移动游标
        }
      }
      const index = serach(arr)
      return index
    }
时间复杂度分析:

根据原理我们可知,设原子个数为n,最大时间复杂度为T(n) ( n > 1 )

  1. 将问题一分为二:T(n/2)
  2. 最小原子复杂度为O(n)
    则:
    T(n)=T(n/2)+T(n/2)+O(n)=2⋅T(n/2)+O(n)T(n) = T(n/2) + T(n/2) + O(n) = 2·T(n/2) + O(n) T(n)=T(n/2)+T(n/2)+O(n)=2T(n/2)+O(n)

由此我们即可推出分治-递归的总体时间复杂度

归并排序:

将数组持续地一分为二,递归进行排序,最后依次进行合并
图例:
在这里插入图片描述

分治-递归时间复杂度:

设:原子个数为n,分解规模为m,最大时间复杂度为T(n) ( m <= n && n > 1 )
T(n)=T(n/m)+T(n/m)+O(n)=m⋅T(n/m)+O(n)T(n) = T(n/m) + T(n/m) + O(n) = m·T(n/m) + O(n) T(n)=T(n/m)+T(n/m)+O(n)=mT(n/m)+O(n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值