1.数据结构-基本概念

目录

1.1什么是数据结构

1.2什么是算法

1.3应用实例:最大子列和问题


1.1什么是数据结构

以数据使用为导向的数据目标的数据逻辑和物理结构表达。

1.2什么是算法

不依赖语言的有限数据处理指令集合;

接受一些输入;

产生输出;在一定有限步骤之后终止;

每条指令有明确的目标,在计算机能处理的范围内。

什么是好的算法:时间复杂度T(N)和空间复杂度S(N)。

例如:打印1-100万,有for循环实现和递归实现。下面是递归实现代码,你会发现程序非正常终止,原因在于递归函数多次调用占用大量资源,导致系统资源被吃光。而for循环程序中只有一个N变量,不涉及程序调用问题。

常见复杂度比较logN<N<NlogN<N2<2N常见复杂度比较logN<N<NlogN<N平方<2N次方

void printN(int N){
    {if(N){
    ptintN(N-1)};
    Printf("%d\n",N)
     }
    return
}

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

1.3应用实例:最大子列和问题

 算法来自LeeCode网站。对比两种算法的复杂度。算法链接

class Solution {
    public int maxSubArray(int[] nums) {
        int res = nums[0];
        int sum = 0;
        for (int num : nums) {
            if (sum > 0)
                sum += num;
            else
                sum = num;
            res = Math.max(res, sum);
        }
        return res;
    }
}
public int maxSubArray(int[] nums) {
    return divide(nums, 0, nums.length-1);        
}

//分治算法
private int divide(int[] nums, int left, int right){
    if(left == right) return nums[left];
    if(left == right - 1){
        int max;
        max = Math.max(nums[left], nums[right]);
        max = Math.max(max, nums[left] + nums[right]);
        return max;
    }
    
    int mid  = (left + right) >> 1;
    int lSum = divide(nums, left, mid - 1);
    int rSum = divide(nums, mid + 1, right);
    
    int max = nums[mid];
    int sum = max;
    for(int i = mid - 1; i >= left; i--){
        sum += nums[i];
        max = Math.max(max, sum);
    }
    
    sum = max;
    for(int j = mid + 1; j <= right; j++){
        sum += nums[j];
        max = Math.max(max, sum);
    }
    
    max = Math.max(max, lSum);
    max = Math.max(max, rSum);
    return max; 
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值