算法思想:分治法

分治法相关

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

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

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

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

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值