算法--分治算法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 一、分治算法
  • 二、使用--找最大最小值
    • 1.普通算法
    • 2.分治算法
    • 3.c语言
  • 总结



提示:以下是本篇文章正文内容,下面案例可供参考

一、分治算法

所谓问题间相互独立,简单理解就是每个问题都可以单独处理,不存在“谁先处理,谁后处理”的次序问题。

二、使用–找最大最小值

1.普通算法

代码如下(示例):

输入 num[1...n]              // 输入 n 个数字
max <- num[1]                // 将第 1 个数字赋值给 max(表示最大值)
min <- num[1]                // 将第 1 个数字赋值给 min(表示最小值)
for i <- 2 to n:             // 从第 2 个数字开始遍历
    if num[i] > max:         // 如果 max 小于遍历到的数字,则更新 max 的值
        max <- num[i]
    if num[i] < min:         // 如果 min 小于遍历到的数字,则更新 min 的值
        min <- num[i]
Print max , min              // 输出 max 和 min 的值

2.分治算法

有点像二分法。
如下是分治算法求数组中最大值的伪代码::

输入 arr[1...n]           // 输入 n 个数字
arr_max(x , y) :          // 设计一个递归函数,[x , y] 用来限定查找最大数的范围
    if y-x ≤ 1 :         // 如果 y-x 的值小于等于 1,则比较 arr[x] 和 arr[y] 的值,大的就是最大值 
        return max(arr[x] , arr[y])
    else :
        // 将 [x , y] 区域划分为 [x , ⌊(x+y)/2⌋ ] 和 [ ⌊(x+y)/2+1⌋ , y] 两个区域,求出两个区域内各自的最大值
        max1 = arr_max(x ,(x+y)/2)    
        max2 = arr_max((x+y)/2+1, y)
    return max(max1 , max2)   // 比较两个区域的最大值,最终找出 [x , y] 中的最大值

该处使用的url网络请求的数据。


3.c语言

有点像二分法。
如下是分治算法求数组中最大值的伪代码::

#include 
//自定义函数,其中 [left,right] 表示 arr 数组中查找最大值的范围
int get_max(int* arr, int left, int right) {
    int max_left = 0, max_right = 0, middle = 0;
    //如果数组不存在
    if (arr == NULL) {
        return  -1;
    }
    //如果查找范围中仅有一个数字
    if (right - left == 0) {
        return arr[left];
    }
    //如果查找范围中有 2 个数字,直接比较即可
    if (right - left <= 1) {
        if (arr[left] >= arr[right]) {
            return arr[left];
        }
        return  arr[right];
    }
    //等量划分成 2 个区域
    middle = (right - left) / 2 + left;
    //得到左侧区域中的最大值
    max_left = get_max(arr, left, middle);
    //得到右侧区域中的最大值
    max_right = get_max(arr, middle + 1, right);
    //比较左、右两侧的最大值,找到 [left,right] 整个区域的最大值
    if (max_left >= max_right) {
        return  max_left;
    }
    else {
        return max_right;
    }
}
int main() {
    int arr[4] = { 3,7,2,1 };
    int max = get_max(arr, 0, 3);
    printf("最大值:%d", max);
    return 0;
}

以上程序的输出结果均为:
最大值:7

总结

分治算法的实现思路是:不断地等分数组中的元素,直至各个分组中元素的个数 ≤2。由于每个分组内的元素最多有 2 个,很容易就可以找出其中的最值(最大值或最小值),然后这些最值再进行两两比较,最终找到的最值就是整个数组中的最值。

你可能感兴趣的:(数据结构与算法,算法,排序算法,数据结构)