美文网首页
算法理论 | 分治算法

算法理论 | 分治算法

作者: icebreakeros | 来源:发表于2019-08-03 11:01 被阅读0次

分治算法

将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同,求出子问题的解,就可得到原问题的解

应用场景

原问题可以分解为多个子问题
原问题在分解过程中,递归地求解子问题
在求解并得到各个子问题的解后,应能够采用某种方式、方法合并或构造出原问题的解

框架

分解,将要解决的问题划分成若干规模较小的同类问题
求解,当子问题划分得足够小时,用较简单的方法解决
合并,按原问题的要求,将子问题的解逐层合并构成原问题的解

实例

快速排序

public class QuickSort {

    private InsertSort insertSort = new InsertSort();

    public void sort(int[] arr) {
        quickSort(arr, 0, arr.length - 1);
    }

    private void quickSort(int[] arr, int left, int right) {
//        if (left >= right)
//           return ;

        if (right - left <= 15) {
            insertSort.sortOp(arr);
            return;
        }

        int p = partition(arr, left, right);
        quickSort(arr, left, p);
        quickSort(arr, p + 1, right);
    }

//    private int partition(int[] arr, int left, int right) {
//        int v = arr[left];
//        int i = left + 1;
//        int j = left;
//        while (i <= right && j < right) {
//            if (arr[i] <= v) {
//                if (i != j) {
//                    ArrayUtils.swap(arr, i, j + 1);
//                }
//                j++;
//            }
//            i++;
//        }
//        ArrayUtils.swap(arr, left, j);
//        System.out.println(j);
//        return j;
//    }

    private int partition(int[] arr, int left, int right) {
        int v = arr[left];
        int j = left;
        for (int i = left + 1; i <= right; i++) {
            if (arr[i] < v) {
                ArrayUtils.swap(arr, i, j + 1);
                j++;
            }
        }
        ArrayUtils.swap(arr, left, j);
        System.out.println(j);
        return j;
    }
}

归并排序

public class MergeSort {

    // [left, right]
    public void sort(int[] arr, int left, int right) {
        if (right <= left) {
            return;
        }

        int middle = (left + right) / 2;
        sort(arr, left, middle);
        sort(arr, middle + 1, right);
        merge(arr, left, middle, right);
    }

    private void merge(int[] arr, int left, int middle, int right) {
        int[] temp = new int[right - left + 1];
        int i = left;
        int j = middle + 1;
        int k = 0;
        while (i <= middle && j <= right) {
            if (arr[i] < arr[j]) {
                temp[k++] = arr[i++];
            } else {
                temp[k++] = arr[j++];
            }
        }

        while (i <= middle) {
            temp[k++] = arr[i++];
        }

        while (j <= right) {
            temp[k++] = arr[j++];
        }

        k = 0;
        while (left <= right) {
            arr[left++] = temp[k++];
        }
        ArrayUtils.printArray(arr);
    }
}

相关文章

  • 分治算法

    文章结构 如何理解分治算法 分治算法应用举例 1. 如何理解分治算法 1.1 分治算法的核心思想 分治算法的核心思...

  • 算法理论 | 分治算法

    分治算法 将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同,求出子问题的解,就...

  • 算法导论第2.3章 - 分治算法

    分治算法 递归:算法一次或多次递归地调用其自身已解决紧密相关的若干子问题。这些算法遵循分治法的思想。 分治算法三个...

  • 从分治算法到 MapReduce

    从分治算法说起 要说 MapReduce 就不得不说分治算法,而分治算法其实说白了,就是四个字 分而治之 。其实就...

  • Leetcode-Java(二十五)

    241. Different Ways to Add Parentheses 采用分治算法,分治算法的基本思想是将...

  • 最大子数组

    最大字数组问题一种java实现,理论部分参见算法导论分治策略

  • 09《算法入门教程》分治算法

    1. 前言 本节内容是分治算法系列之一:分治算法的介绍,主要介绍了分治算法的定义及基本思想和实现策略,然后我们介绍...

  • 分治算法

    理解分治算法 分而治之

  • 2018-03-16

    碰到的算法并查集逆序对归并排序分治算法

  • 分治算法

    如何理解分治算法? 分治算法(divide and conquer)的核心思想其实就是四个字,分而治之,也就是将原...

网友评论

      本文标题:算法理论 | 分治算法

      本文链接:https://www.haomeiwen.com/subject/osvkdctx.html