zoukankan      html  css  js  c++  java
  • 算法学习笔记-暴力搜索和分治法

    1.今天学习了一个简单的求最大连续子数组的问题,给定一个数组A[0,…,n-1],求A的连续子数 组,使得该子数组的和最大。例如:数组: 1, -2, 3, 10, -4, 7, 2, -5

    Python暴力求解法:

    dest_arry = [1,-2,3,10,-4,7,-2,5,12]
    max_val = dest_arry[0]
    cuur_val = 0
    
    start = 0
    end = 0
    
    
    print (len(dest_arry))
    
    count = len(dest_arry)
    #暴力法
    for i in range(0, count):
        for j in range(i, count):
            cuur_val = 0
            for k in range(i, j+1):          #这个需要特别注意,在这里这句话的意思相当于是for( k=i,k<(j+1),k++),在python中没有'<='这个符号
                cuur_val = cuur_val + dest_arry[k]
                if(cuur_val > max_val):
                    max_val = cuur_val
                    start = i
                    end = k
    
    print (max_val, start,end)
    

    Python分治法:

    #分治法
    dest_arry = [1,-2,3,10,-4,7,-2,5,12]
    
    max_val = dest_arry[0]
    cuur_val = 0
    
    start = 0
    end = 0
    
    
    print (len(dest_arry))
    
    count = len(dest_arry)
    
    def max_sub_add(fr, to):
        global start
        global end
    
        if fr == to:
            return dest_arry[fr]
        mid = int((fr + to)/2)
        m1 = max_sub_add(fr, mid)
        m2 = max_sub_add(mid+1, to)
    
    
        left = dest_arry[mid]
        now = dest_arry[mid]
    
        i = mid - 1
        while(i>=fr):
            now = now + dest_arry[i]
            if(now > left):
                left = now
                start = i
            i = i - 1
    
        right = dest_arry[mid+1]
        now = dest_arry[mid+1]
    
        i = mid+2
        while(i <= to):
            now = now + dest_arry[i]
            if (now> right):
                right = now
                end = i
            i = i + 1
        # for i in range(mid+2, to+1):
        #     now = now + dest_arry[i]
        #     if (now> right):
        #         right = now
        #         end = i
    
    
        m3 = right + left
        return max(m1, m2, m3)
    
    start = 0
    end = 0
    
    result = max_sub_add(0, (count)-1)
    print(result, start, end)
    

    C/C++暴力法:

    #include "stdio.h"
    #include "stdlib.h"
    
    void baoli()
    {
        int dest_arry[] = {1,-2,3,10,-4,7,-2,5,-12};
    
        int max_val = dest_arry[0] , cuur_val = 0, start_nbr = 0, end_nbr = 0;
        int count =  sizeof(dest_arry) / sizeof(int);
    
        int i = 0, j = 0, k = 0;
    
        printf("count: %d 
    ", count);
    
        for( i = 0; i < count; i++)
        {
            for (j=i;j<count; j++)
            {
                cuur_val = 0;
                for (k=i; k<=j; k++)
                {
                    cuur_val = cuur_val + dest_arry[k];
                    if(cuur_val > max_val)
                    {
                        max_val = cuur_val;
                        start_nbr = i;
                        end_nbr = k;
                       
                    }
                }
            }
        }
       
    
        printf("start: %d  end_nbr: %d  max_val: %d
    ", start_nbr, end_nbr, max_val);
       
    }
    int main()
    { 
    
        baoli();
        
    }
    
  • 相关阅读:
    javascript 闭包与函数变量作用域
    javaScript for循环
    node-inspector调试node项目
    nodejs async异步常用函数总结
    nodejs安装配置新手篇
    requirejs笔记
    使用nodejs中httpProxy代理时候出现404异常
    Bluebird-Collections
    Bluebird-Core API (三)
    Bluebird-Core API(二)
  • 原文地址:https://www.cnblogs.com/kmust/p/9261209.html
Copyright © 2011-2022 走看看