算法(十二)分治算法

文章目录

算法概念

  • 分治算法(divide and conquer)算法的核心思想其实就是"分而治之",将原问题划分成n个规模较小,并且结构与原问题相似的子问题,递归地解决这些子问题,然后再合并其结果,然后就会得到原问题的解。
  • 分治和递归的区别:分治算法是种处理问题的思想,递归式一种编程技巧。
  • 分治算法的递归实现中 ,每一层递归都会涉及三个操作
    分解 :将原问题分解成一系列子问题;
    解决 :递归地求解各个子问题,若子问题足够小,则直接求解;
    合并:将子问题地结果合并成原问题。

分治算法典型地例子就是归并排序,具体请参考本人另一篇博客:算法(十)归并排序

算法例子

字符串中小写转大写

将字符串中的小写字母转化为大写字母,"abcde"转化为"ABCDE",我们可以利用分治的思想将整个字符串转化成一个一个的字符处理。

代码实现:

bash 复制代码
package com.xxliao.algorithms.divide_conquer;

/**
 * @author xxliao
 * @description: 将字符串中的小写字母转化为大写字母
 * "abcde"转化为"ABCDE"
 * 我们可以利用分治的思想将整个字符串转化成一个一个的字符处理
 * @date 2024/5/31 21:35
 */

public class Demo01 {

    public static void main(String[] args) {
        String ss="abcde";
        System.out.println(toUpCase(ss.toCharArray(),0));
    }

    /**
     * @description  将char[] 中小写字母转大写字母
     * @author  xxliao
     * @date  2024/5/31 21:39
     */
    public static char[] toUpCase(char[] array,int i){
        if(i>=array.length)
            // 递归结束条件
            return array;
        // 解决:递归地求解各个子问题,若子问题足够小,则直接求解
        array[i]=toUpCaseUnit(array[i]);
        // 向下递归
        return toUpCase(array,i+1);
    }

    /**
     * @description  char字符,小写转大写
     * @author  xxliao
     * @date  2024/5/31 21:39
     */
    public static char toUpCaseUnit(char c){
        int n=c;
        if (n<97 || n>122){
            return ' ';
        }
        return (char)Integer.parseInt(String.valueOf(n-32));
    }
}

演示结果:

求X^n问题

比如: 2^10 2的10次幂

采用分治法

2^10拆成

代码实现:

bash 复制代码
package com.xxliao.algorithms.divide_conquer;

/**
 * @author xxliao
 * @description: 比如: 2^10 2的10次幂
 * 采用分治法
 * @date 2024/5/31 21:44
 */

public class Demo02 {

    public static void main(String[] args) {
        System.out.println( dividpow(2,10) ); 
    }

    public static int dividpow(int x,int n){
        //递归结束 任何数的1次方都是它本身
        if(n==1){
            return x;
        }
        //每次分拆成幂的一半
        int half=dividpow(x,n/2);
        //偶数
        if(n%2==0){
            return half*half;
        }
        else{
            return half*half*x;
        }
    }
}

演示结果:

相关推荐
洛小豆4 分钟前
java 中 char 类型变量能不能储存一个中文的汉字,为什么?
java·后端·面试
爱吃烤鸡翅的酸菜鱼10 分钟前
从数据库直连到缓存预热:城市列表查询的性能优化全流程
java·数据库·后端·spring·个人开发
Algebraaaaa10 分钟前
Qt中的字符串宏 | 编译期检查和运行期检查 | Qt信号与槽connect写法
开发语言·c++·qt
Red Car10 分钟前
javascript 性能优化实例一则
开发语言·javascript·ecmascript
友友马12 分钟前
『 QT 』Hello World控件实现指南
开发语言·qt
一只学java的小汉堡25 分钟前
Java 面试高频题:HashMap 与 ConcurrentHashMap 深度解析(含 JDK1.8 优化与线程安全原理)
java·开发语言·面试
huohaiyu1 小时前
Hashtable,HashMap,ConcurrentHashMap之间的区别
java·开发语言·多线程·哈希
信奥卷王2 小时前
[GESP202503 五级] 原根判断
java·数据结构·算法
兮山与2 小时前
算法4.0
算法
nju_spy2 小时前
力扣每日一题(二)任务安排问题 + 区间变换问题 + 排列组合数学推式子
算法·leetcode·二分查找·贪心·排列组合·容斥原理·最大堆