【算法】分治法

本文介绍了分治法的基本思想,包括其在合并排序和快速排序中的应用。同时,深入探讨了LeetCode中的1238题——循环码排列,通过分析和源码展示了解决方案。此外,还讨论了如何通过剪枝优化分治法的效率。
摘要由CSDN通过智能技术生成

目录

1.简介

2.算法模式

3.样例

3.1 合并排序法( Merge Sort )

3.2 快速排序( Quicksort )

3.3 leetCode 1238 循环码排列

3.3.1 分析:

3.3.2 源码


1.简介

分而治之(Divide and Conquer),分割问题、各个击破。将一个大问题,分割成许多小问题。如果小问题还是很难,就继续分割成更小的问题,直到问题变得容易解决。

2.算法模式

divide_and_conquer (原问题)
{
    /* Divide */
    先将原问题分割成许多小问题;
 
    /* Conquer */
    递归调用,求得子问题的解;
    解答1  =  divide_and_conquer (子问题1 );
    解答2  =  divide_and_conquer (子问题2 );
    ......
 
    /* Combine */
    用小问题的解答,算出原问题的解答;
    原问题解答=解答1  +解答2  + ......;
 
    return  原问题解答;
}

// 伪代码
Object divide_and_conquer(Object n) {
    if (canSolve(n)) return conquer();
    List subs = divide();
    List subanses = new ArrayList();
    for (Object sub: subs) {
        Object subans = divide_and_conquer(sub);
        subanses.add(subans);
    }
    return combine(subanses);
}
List divide(){
    return null;
}
Object conquer() {
    return null;
}
Object combine(List subanses) {
    return null;
}
boolean canSolve(Object n) {
    return false;
}

3.样例

3.1 合并排序法( Merge Sort )

Divide 阶段:数组分割成两半。

Conquer 阶段:两个子数组各自递归Merge Sort 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>