算法:分治回溯算法目录

本文介绍了分治算法的基本思想,包括分解、解决和合并三个步骤,并指出适用条件。同时,详细阐述了回溯算法的搜索尝试过程,强调其在无法满足条件时的回溯特性,被誉为“通用解题方法”。内容涵盖了两种算法在实际问题中的应用,如前n项和、斐波那契数列、二分查找等经典案例。
摘要由CSDN通过智能技术生成

目录

 分治算法:

回溯算法:

相关问题与代码实现:


  分治算法:

1.分治算法就是将原问题划分为成n个规模较小,并且结构与原问题相似的子问题,递归地解决这些子问题,然后再合并其结果,就得到原问题的解。

(递归:程序调用自身的编程技巧称为递归)

2.分治算法的递归实现中,每一层递归都会涉及到这样的三个操作:

——分解:将原问题分解成一系列子问题

——解决:递归地求解各个子问题,若子问题足够小,则直接求解

——合并:将子问题的结果合并成原问题

3.分治算法能够解决的问题一般满足以下条件:

——原问题与分解成的小问题有相同的模式

——原问题分解成的子问题可以独立求解,子问题之间没有相关性。

——具有分解终止条件,也就是说,当问题足够小时,可以直接求解。

——可以将子问题合并成原问题,而这个合并操作的复杂度不能够太高,否则就起不到减小算法总体复杂度的效果了。

回溯算法:

回溯算法是一个类似于枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当搜索到某一步时,发现原先选择并不是优解或者达不到目标。就退回一步重新选择,这种走不通就回退再走的技术称为回溯法,而满足回溯状态的某个点称为回溯点。许多复杂的,规模较大的问题都可以使用回溯法,有“通用解题方法”的美称。

相关问题与代码实现:

一:前n项和

public class RecursionDemo02 {
    public static void main(String[] args) {
        int ret = f(100);
        System.out.println(ret);
    }
 
    private static int f(int n) {
        if (n == 1) {
            return 1;
        }
        return f(n - 1) + n;
    }
}

 二:斐波那契数列

public class RecursionDemo03 {
    public static void main(String[] args) {
        int ret = f(5);
        System.out.println(ret);
    }
 
    private static int f(int x) {
        if (x == 1 || x == 2) {
            return 1;
        }
        return f(x - 1) + f(x - 2);
    }
}

三:二分查找

public class RecursionDemo04 {
    private static int count = 0;
    public static void main(String[] args) {
        int[] arr = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
        int index = binarySearch(arr,0,arr.length - 1,13);
        System.out.println(index);
        System.out.println(count);
    }
    //在数组arr中 L~R区间内进行二分搜索查找key的角标
    private static int binarySearch(int[] arr, int L, int R, int key) {
        count++;
        if (L > R) {  //元素key不存在
            return -1;
        }
        int M = (L + R) / 2;
        if (arr[M] == key) {
            return M;
        }
        if (arr[M] < key) {
            return binarySearch(arr,M + 1,R,key);
        } else {
            return binarySearch(arr,L,M - 1,key);
        }
    }
}

四:文件查找:

public class RecursionDemo05 {
    public static void main(String[] args) {
        File dir = new File("C:\\Users\\32519\\Desktop\\DS");
        traversal(dir);
    }
 
    private static void traversal(File dir) {
        File[] files = dir.listFile
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值