Life is long ......

继续向前 永不停止

   :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  26 随笔 :: 0 文章 :: 5 评论 :: 10万 阅读

分治算法通俗的讲就是把一个规模比较大的问题分成n个规模较小的问题来解决,再将每个小规模的问题进行合并,最后得到结果。通常问题规模比较大难以用普通的编程方法实现,或者不可能实现的时候采用分治算法,能够简化问题的解决。

一个例子:

求出一个数组中的最大值和最小值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package example;
 
public class MaxAndMinValue {
 
    // 直接算法 得到最大值和最小值
    public static void main(String[] args) {
        int[] A = { -18, -16, 9, -5, 7, -40, 0, 35 };
        System.out.println(getMaxValue(A));
        System.out.println(getMinValue(A));
        System.out.println(getMax(A, 0, A.length - 1));
 
    }
 
    // 直接算法求最大值
    public static int getMaxValue(int[] array) {
        int Max = 0;
        for (int i = 0; i < (array.length - 1); i++) {
            if (array[i] == array[i + 1]) {
                Max = array[i + 1];
            }
            if (array[i] < array[i + 1]) {
                Max = array[i + 1];
            }
            if (array[i] > array[i + 1]) {
                Max = array[i];
                array[i] = array[i + 1];
                array[i + 1] = Max;
 
            }
        }
        return Max;
    }
 
    // 直接算法求最小值
    public static int getMinValue(int[] array) {
 
        int Min = 0;
        for (int i = 0; i < (array.length - 1); i++) {
            if (array[i] == array[i + 1]) {
                Min = array[i + 1];
            } else if (array[i] < array[i + 1]) {
                Min = array[i];
                array[i] = array[i + 1];
                array[i + 1] = Min;
            } else if (array[i] > array[i + 1]) {
                Min = array[i + 1];
            }
        }
        return Min;
    }
 
    // 用分治法求最大最小值
    public static int getMax(int[] array, int i, int j) {
        int Max1 = 0;
        int Max2 = 0;
        if (i == j) {
            return Max1 = Max2 = array[j];
        } else if (i == (j - 1)) {
            Max1 = array[i];
            Max2 = array[j];
            return Max1 > Max2 ? Max1 : Max2;
        } else {
            int mid = (i + j) / 2;
            Max1 = getMax(array, i, mid);
            Max2 = getMax(array, mid, j);
            return Max1 > Max2 ? Max1 : Max2;
        }
    }
}

 

假设数组的大小为8,用直接的算法,最大值最小值总需要比较14次,而用分治算法可以一次性求出最大和最小,只需要10次比较。

posted on   patrickwai  阅读(4954)  评论(1编辑  收藏  举报
编辑推荐:
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
阅读排行:
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 《HelloGitHub》第 106 期
· 数据库服务器 SQL Server 版本升级公告
· 深入理解Mybatis分库分表执行原理
· 使用 Dify + LLM 构建精确任务处理应用
点击右上角即可分享
微信分享提示