• 算法导论(第三版) Exercises4.2(求最大和子数组的算法优化过程)


    4.1-1

    如所有元素都为负,则返回所有元素中最大的负数。

    4.1-2(暴力法求最大和子数组)

    struct subarray
    {
        int start, end, sum;
    };
    void bruteFindMaxSubarray(int a[], int left, int right, struct subarray* result)
    {
        int i, j, sum=a[left];
        int tempSum;
        int l = left;
        int r = l;
        for(i=left; i<=right; i++)
        {
            tempSum = a[i];
            for(j=i+1; j<=right; j++)
            {
                tempSum += a[j];
                if(tempSum > sum)
                {
                    l = i;
                    r = j;
                    sum = tempSum;
                }
            }
        }
        result->start = l;
        result->end = r;
        result->sum = sum;
    }
    View Code

    4.1-3(归并算法求最大和子数组)

    int mergeFindSub(int a[], int l, int r, int result[])
    {
        int i, j, k, mid;
        int leftSum = 0;
        int rightSum = 0;
        int crossSum = 0;
        int leftResult[3] = {0};
        int rightResult[3] = {0};
        int crossResult[3] = {0};
        if(l == r)
        {
            result[0] = l;
            result[1] = r;
            result[2] = a[l];
        }
        else
        {
            mid = (l + r) / 2;
            leftSum = mergeFindSub(a, l, mid, leftResult);
            rightSum = mergeFindSub(a, mid+1, r, rightResult);
            crossSum = crossingSub(a, l, mid, r, crossResult);
            if(leftSum >= rightSum && leftSum >= crossSum)
                for(i=0; i<3; i++) result[i] = leftResult[i];
            else if(rightSum >= leftSum && rightSum >= crossSum)
                for(j=0; j<3; j++) result[j] = rightResult[j];
            else
                for(k=0; k<3; k++) result[k] = crossResult[k];
        }
        return result[2];
    }
    
    int crossingSub(int a[], int l, int m, int r, int result[])
    {
        int i, j, leftSum, rightSum, sum;
        int min = -10000;
        rightSum = min;
        leftSum = min;
        sum = 0;
        for(i=m; i>=l; i--)
        {
            sum += a[i];
            if(sum > leftSum)
            {
                result[0] = i;
                leftSum = sum;
            }
        }
        sum = 0;
        for(j=m+1; j<=r; j++)
        {
            sum += a[j];
            if(sum > rightSum)
            {
                result[1] = j;
                rightSum = sum;
            }
        }
        result[2] = leftSum + rightSum;
        return result[2];
    }
    View Code

    4.1-4

    如果允许空串,只要加一句

    if (sum < 0)  return sum=0;

    4.1-5(线性算法求最大和字串)

    void linearFindSub(int a[], int n, int result[])
    {
        int i, l, temp, sum;
        int min = -10000;
        sum = min;
        temp = 0;
        l = 0;
        for(i=0; i<n; i++)
        {
            if(temp < 0)
            {
                temp = a[i];
                l = i;
            }
            else
                temp += a[i];
            if(sum < temp)
            {
                result[0] = l;
                result[1] = i;
                sum = temp;
            }
        }
        result[2] = sum;
    }
    View Code
  • 相关阅读:
    location url 反向代理到来机的其它端口 gitlab
    PortSentry是入侵检测工具中配置最简单、效果最直接的工具之一
    iptables下state的4种形式
    windows  远程桌面命令 mstsc
    linux中解决SSH连接慢问题 关键点GSSAPIAuthentication
    无密码登录远程主机
    openfire 服务器名称:后面的黄色叹号
    ssh -v root@xxxxx 显示登录的细节
    mysql 只导数据不含表结构
    磁盘空间占满inode结点没用完 并删除了文件但是释放不了
  • 原文地址:https://www.cnblogs.com/xuanzhang/p/4752234.html
Copyright © 2020-2023  润新知