最大子序列和問題的三種實現(c語言)

#include <stdio.h>

//由create_data.py產生的隨機數
int a[] = {-66,-83,14,-95,-7,42,39,-72,-100,-31,-57,47,99,-84,-96,-45,-38,-76,-65,85,39,83,28,16,-41,92,60,44,90,83,-40,17,-27,-75,6,88,81,-12,77,60,36,51,51,95,72,15,-61,-44,99,-94,-32,-37,55,45,22,30,-87,-71,69,100,-65,-51,-68,-96,41,-21,-24,31,28,-46,-22,6,-45,32,-6,-72,29,-42,88,-98,-62,-81,39,-99,35,5,-26,95,31,-59,80,-92,34,-53,-59,-70,-24,-65,73,-81,-8,0,-80,-75,-91,11,-83,-89,58,18,55,36,35,51,33,8,-8,-25,-9,-79,-81,-48,-2,7,-18,85,39,-62,-58,38,-38,38,52,-67,14,-51,95,-99,6,64,96,34,75,-54,81,59,-65,-78,77,-6,-79,-28,19,78,83,-30,-48,-33,-23,-100,51,-28,0,75,-71,-76,-55,15,-92,-59,-41,79,-46,23,32,-92,-1,-69,-25,80,-55,-92,-1,23,-86,-35,89,-92,-38,84,69,-91,-17,87,68,-3,68,55,-37,20,-79,44,26,-57,-81,16,-94,17,1,39,-49,-73,35,96,2,23,30,88,-59,-68,-51,-38,62,74,58,51,26,82,70,26,41,26,38,4,70,60,-4,98,-48,-55,-10,70,-54,-74,-38,-83,-99,57,36,-13,47,37,1,67,16,-19,50,53,-58,-19,-44,-86,35,71,-11,-2,-8,67,30,-21,93,-13,-12,3,67,92,82,-23,35,-64,-87,14,43,-13,74,17,68,-3,5,-100,-81,-33,-66,71,10,-38,-65,-81,-62,-55,-13,-59,11,14,82,7,92,99,45,-60,-14,62,80,21,-85,-64,-45,41,-41,61,-70,40,-93,-16,-99,88,-78,33,66,-58,-1,95,-22,-94,31,-32,100,20,62,-22,-68,22,96,-34,-85,75,-46,7,-64,-69,-56,93,-5,-96,37,13,8,-18,14,-63,97,64,81,-33,2,94,-18,-32,-70,65,39,-73,-88,-76,78,28,88,92,79,99,52,-18,12,-34,92,16,-10,-13,82,37,6,-14,12,92,-100,-26,-28,3,38,60,-39,-27,16,16,-69,-84,-11,-5,-63,10,-47,-100,-54,66,50,15,-66,-41,-15,44,-37,-7,-10,98,-91,-69,45,-65,-80,91,-99,55,-76,74,-26,-55,28,-78,70,36,68,29,-36,-51,-73,24,14,16,94,-42,31,-58,-33,81,0,36,65,-76,-55,-17,-12,31,-23,-24,-56,70,-40,34,-18,-59,54,23,-96,-34,-14,84,33,-87,98,54,-20,39,-14,-12,73,51,8,45,-60,-32,-60,-71,54,-37,-73,61,4,-56,100,-13,42,91,1,89,-57,-47,35,-11,-53,-8,-2,-20,-95,-56,-11,-88,64,-30,-78,55,-65,-97,-29,20,70,60,27,-34,-32,3,19,-72,52,-1,60,96,23,45,33,35,-26,-61,93,-12,76,-34,24,-97,-71,-14,43,-14,-62,56,-47,14,60,-88,73,87,-85,23,65,-48,94,22,2,-46,1,21,-49,31,-46,62,-85,-33,-100,-11,92,-14,47,-78,70,-24,40,-9,-7,-49,63,-25,-17,6,-90,-15,43,3,31,-76,31,-15,58,-29,75,91,-5,-44,-31,55,-65,27,80,-26,-80,11,-25,34,-43,34,33,57,-63,99,-18,79,2,54,23,-1,97,32,79,37,-46,21,-66,44,-63,-38,86,34,-85,68,-30,46,7,-40,-67,24,24,22,-100,38,-15,-83,78,87,83,-74,-86,88,-100,25,80,-16,-71,-13,-21,95,5,86,-10,-84,10,-49,20,10,-28,-77,-18,95,30,-58,45,-84,25,31,-72,-87,-36,7,63,13,-73,24,72,71,95,-60,-75,79,93,64,20,36,-26,-55,68,76,-20,84,-37,62,-3,62,-74,-66,27,-50,23,33,58,-2,-24,-2,-27,-57,-100,44,48,-24,-92,16,99,13,-25,-35,-98,-40,-88,-21,27,97,-44,27,-40,53,-46,-83,-14,82,38,-61,94,-29,19,-26,83,-18,98,-52,-66,52,-81,73,-59,75,21,29,-53,41,4,96,-33,-96,74,3,75,-26,-50,2,-91,71,97,92,-2,39,-26,9,24,3,-33,86,-29,-39,41,-83,29,37,-76,89,82,11,-6,26,52,-26,19,52,-38,96,7,-27,-2,87,13,-19,57,30,8,-80,96,-62,11,77,-7,-75,-34,67,80,90,-85,91,-45,32,40,64,-62,46,-61,-89,87,-89,-29,-53,25,-90,-88,-33,-28,74,-82,31,-48,-38,-61,-9,-87,86,-40,22,89,-77,-45,-5,11,72,-6,75,85,-91,-83,16,32,-35,77,90,-74,-83,-15,51,-74,-24,46,64,-12,-53,-53,47,36,9,-93,-51,-51,-73,-87,83,-35,-74,37,13,-74,85,-60,33,-7,-91,0,2,-37,-1,10,-75,21,-93,42,93,50,-1,-83,90,-49,-74,-85,49,-100,57,-1,1,38,-69,-72,-46,16,-91,-2,59,-43,-19,-6,-49,-20,7,46,-97,71,-18,53,-100,-49,-90,-77,39,82,-65,-14,-5,-41,92,54,81,-1,-13,-77,89,27,-84,99,61,47,-61,59,-44,12,45,-69,-19,-90,-8,88,49,-58,25,23,-30,-64,-90,-58,10,10,-10,-95,87,-75,44,99,23,-3,48,-39,34};

//簡單輪詢
int max_subquence_sum_simple(const int arr[], int len)
{
    int max = arr[0];
    for (int i = 0; i < len; i++)
    {
        int sum = arr[i];
        for (int j = i + 1; j < len; j++)
        {
            sum = sum + arr[j];
            if (sum > max){
                max = sum;
            }
        }
    }
 
    return max;
}

int max_subquence_sum_divide_and_conquer_inner(const int arr[], int left, int right)
{
    if (left == right)
    {
        if (arr[left] < 0)
            return 0;
        else
            return arr[left];        
    }

    int center = (left + right) / 2;
    int left_max = max_subquence_sum_divide_and_conquer_inner(arr, left, center);
    int right_max = max_subquence_sum_divide_and_conquer_inner(arr, center+1, right);

    int left_margin_max = arr[center];
    int sum = 0;
    for (int i = center; i >= left; i--)
    {
        sum += arr[i];
        if (sum > left_margin_max)
            left_margin_max = sum;
    }

    int right_margin_max = arr[center+1];
    sum = 0;
    for (int i = center+1; i <= right; i++)
    {
        sum += arr[i];
        if (sum > right_margin_max)
            right_margin_max = sum;
    }
    int margin_max = left_margin_max + right_margin_max;

    right_margin_max += left_max;
    int max_1 = (left_max > right_max) ? left_max : right_max;
    int max = (max_1 > margin_max) ? max_1 : margin_max;

    return max;
}

//分治
int max_subquence_sum_divide_and_conquer(const int arr[], int len)
{
    return max_subquence_sum_divide_and_conquer_inner(a, 0, len-1);
}

//聯機算法
int max_subquence_sum_efficient(const int arr[], int len)
{
    int max = arr[0];
    int sum = 0;
    for (int i = 0; i < len; i++)
    {
        sum += arr[i];
        if (sum > max)
            max = sum;
        else if (sum < 0)
            sum = 0;
    }
    return max;
}

int main()
{
    int max = max_subquence_sum_simple(a, sizeof(a)/sizeof(a[0]));
    printf("max = %d\n", max);
    max = max_subquence_sum_efficient(a, sizeof(a)/sizeof(a[0]));
    printf("max = %d\n", max);
    max = max_subquence_sum_divide_and_conquer(a, sizeof(a)/sizeof(a[0]));
    printf("max = %d\n", max);
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章