目录
1.1什么是数据结构
以数据使用为导向的数据目标的数据逻辑和物理结构表达。
1.2什么是算法
不依赖语言的有限数据处理指令集合;
接受一些输入;
产生输出;在一定有限步骤之后终止;
每条指令有明确的目标,在计算机能处理的范围内。
什么是好的算法:时间复杂度T(N)和空间复杂度S(N)。
例如:打印1-100万,有for循环实现和递归实现。下面是递归实现代码,你会发现程序非正常终止,原因在于递归函数多次调用占用大量资源,导致系统资源被吃光。而for循环程序中只有一个N变量,不涉及程序调用问题。
常见复杂度比较logN<N<NlogN<N平方<2N次方
void printN(int N){
{if(N){
ptintN(N-1)};
Printf("%d\n",N)
}
return
}
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;
}