陈越数据结构_第一周

1. 最大子列和问题

是第一周最后讲到的4种算法的实验题,属于基本要求,一定要做

  • 题目见PAT

  • 输入样例:

    6
    -2 11 -4 13 -5 -2
    
  • 输出样例:

    20
    

1.1 解法1:暴力解法

  • 算法思想:暴力枚举所有子序列求解,保留最大的子序列和
  • c++代码如下:
#include <iostream>using namespace std;int maxSubsequenceSum1(int n,int input_arr[]){int max_sum=0;for(int i=0;i<n;i++){for(int j=i;j<n;j++){int this_sum = 0;for(int k=i;k<j;k++){this_sum+=input_arr[k];}if(this_sum>max_sum){max_sum = this_sum;}}}return max_sum;
}int main(){int N = 100000;int input_arr[N];int n;int max_sum;cin >> n;for(int i=0;i<n;i++){cin >> input_arr[i];}max_sum = maxSubseqceSum2(n, input_arr);cout << max_sum << endl;return 0;
}
  • 时间复杂度:O(n^3)

1.2 解法2:针对解法1改进

  • 算法思想:分析可知,解法1中会有重复计算的子序列,因此去掉一个
  • c++代码如下:
int maxSubsequenceSum2(int n,int input_arr[]){int max_sum=0;for(int i=0;i<n;i++){int this_sum = 0;for(int j=i;j<n;j++){this_sum+=input_arr[j];if(this_sum>max_sum){max_sum = this_sum;}}}return max_sum;
}
  • 算法复杂度:O(n^2) 陈越老师讲到优秀的程序员看到O(n^2) 时就要想到把它优化到O(nlogn)

1.3 解法3:分而治之的解法

  • 算法思想:

    • 递归+分而治之。

    • 分为三部分分别求解最大子序列和:左半部分的最大子序列和、右半部分的最大子序列和、跨越中间边界的最大子序列和

  • c++代码:

int max3(int num1, int num2, int num3){int max_num = num1;if(num2>max_num){max_num = num2;}if(num3>max_num){max_num = num3;}return max_num;
}int maxSubSum3(int left, int right, const int input_arr[])
{int max_sum = 0;int left_max_sum, right_max_sum;int left_board_max_sum, right_board_max_sum;int left_board_sum, right_board_sum;int center;// 1. 递归基准情形if(left == right){if(input_arr[left]>0){return input_arr[left];}else{return 0;}}// 2. 递归不断推进center = (left + right)/2;left_max_sum = maxSubSum3(left, center, input_arr);right_max_sum = maxSubSum3(center+1, right, input_arr);// 3. 求解跨边界的情况left_board_sum = 0;left_board_max_sum =0;for(int i= center; i>=left;i--){left_board_sum += input_arr[i];if(left_board_sum>left_board_max_sum){left_board_max_sum = left_board_sum;}}right_board_sum = 0;right_board_max_sum = 0;for(int i=center+1;i<=right;i++){right_board_sum += input_arr[i];if(right_board_sum>right_board_max_sum){right_board_max_sum = right_board_sum;}}max_sum = max3(left_max_sum, right_max_sum, (left_board_max_sum+right_board_max_sum));return max_sum;
}
int maxSubsequenceSum3(int n, const int input_arr[])
{return maxSubSum3(0, n-1, input_arr);
}
  • 时间复杂度:O(nlogn)

1.4 解法4:漂亮的解法

  • 算法思路:目前能力有限,只是可以看懂,阐述不出思想
  • c++代码:
int maxSubsequenceSum4(int n, const int input_arr[]){int max_sum=0;int this_sum=0;for(int i=0;i<n;i++){this_sum += input_arr[i];if(this_sum > max_sum){max_sum = this_sum;}else if(this_sum < 0){this_sum = 0;}}return max_sum;
}
  • 时间复杂度:O(n)

2. Maximum Subsequence Sum

**Maximum Subsequence Sum:**是2004年浙江大学计算机专业考研复试真题,要求略高,选做。

  • 题目:

  • c++代码

  • 算法思想:

    • 最大子列和问题中解法4的复杂版

    • 设置start和end两个变量,当this_sum<0时,要开始新的序列,更新临时变量temp_index,当发现有了最大值更新的时候,更新start值和end两个值.

  • c++代码:

#include <iostream>using namespace std;int start_index = 0, end_index = 0;int maxSubsequenceSum4(int n, const int input_arr[])
{start_index = 0, end_index = n-1;int max_sum = -1;int this_sum = 0;int temp_index = 0;for (int i = 0; i < n; i++){this_sum += input_arr[i];if (this_sum < 0){this_sum = 0;temp_index = i+1;}else if (this_sum > max_sum){max_sum = this_sum;start_index = temp_index;end_index = i;}}if (max_sum < 0) max_sum = 0;return max_sum;
}
int main()
{int N = 100000;int input_arr[N];int n;int max_sum;cin >> n;for (int i = 0; i < n; i++){cin >> input_arr[i];}max_sum = maxSubsequenceSum4(n, input_arr);cout << max_sum << ' ' << input_arr[start_index] << ' ' << input_arr[end_index] << endl;return 0;
}

3. 二分查找

PAT 函数填空题

  • 算法思想:难点在于停止条件的把握
  • c语言代码:
#include <stdio.h>
#include <stdlib.h>#define MAXSIZE 10
#define NotFound 0
typedef int ElementType;typedef int Position;
typedef struct LNode *List;
struct LNode {ElementType Data[MAXSIZE];Position Last; /* 保存线性表中最后一个元素的位置 */
};List ReadInput(); /* 裁判实现,细节不表。元素从下标1开始存储 */
Position BinarySearch( List L, ElementType X );int main()
{List L;ElementType X;Position P;L = ReadInput();scanf("%d", &X);P = BinarySearch( L, X );printf("%d\n", P);return 0;
}/* 你的代码将被嵌在这里 */
Position BinarySearch( List L, ElementType X ){Position low, high, mid;low = 0; high = L->Last-1;while (low<=high){mid = (low+high)/2;if(L->Data[mid]>X){high = mid-1;}else if(L->Data[mid]<X){low = mid+1;}else{return mid;}}return NotFound;
}

陈越数据结构_第一周相关推荐

  1. 20162302 《程序设计与数据结构》第一周学习总结

    20162302 2017-2018-1 <程序设计与数据结构>第一周学习总结 教材学习内容总结 很多情况下时间和空间不可兼得.在不同的情况下,要么用时间换空间,要么用空间换时间. 引出算 ...

  2. 04.卷积神经网络_第一周卷积神经网络

    04.卷积神经网络_第一周卷积神经网络 1.1 计算机视觉 上面这张图是64x64像素的图像,它的数据量是12288,下图是1000x1000像素的图像,它的数据量是3百万.如果用全连接网络去处理这张 ...

  3. 20172314 2018-2019-1《程序设计与数据结构》第一周学习总结

    教材学习内容总结 概述 软件工程:是一门关于高质量软件开发的技术和理论的学科,用来控制开发过程,实现高质量的软件. 软件工程的目标:正确性.可靠性.健壮性.可用性.可维护性.可重用性.可移植性.运行效 ...

  4. 20162303《程序设计与数据结构》第一周学习总结

    学号 2016-2017-2 <程序设计与数据结构>第1周学习总结 教材学习内容总结 本周学习了基本的JAVA知识,虽然比较基础,但是在实际过程中还是出现了许许多多的问题,代码一遍遍的敲错 ...

  5. 2019-2020-1 1823《程序设计与数据结构》第一周作业总结

    作业地址 第一周作业:https://edu.cnblogs.com/campus/besti/2019-2020-1-1823-PDDS/homework/3466 提交情况如图: 共7人没提交,还 ...

  6. 输出结果为16的python表达式_第一周作业(rayco)

    rayco 第一周作业 第一次-课后习题 a = 10 b = 3 c = a/b-a print(c, type(c)) c = a/b*a print(c, type(c)) c = 0.1*a/ ...

  7. 华清远见嵌入式培训_第一周回顾与反思

    目录 第一天 周二 1.1 Linux系统的使用 1.2 终端 1.3 Linux系统命令 1.4 vi编辑器的使用 第二天 周三 2.1 顺利进入("hello world")阶 ...

  8. 陈越 数据结构第一节

    第一章 基本概念 1.1什么是数据结构 --解决问题方法的效率跟数据的组织方式.空间的利用效率.算法的巧妙程度有关. --数据结构:数据对象在计算机中的组织方式.(1)逻辑结构(个人存放数据的方式,如 ...

  9. 算法与数据结构(第一周)——线性查找法

    目录 线性查找法介绍 实现线性查找法 使用泛型 使用自定义类测试算法 循环不变量 简单的复杂度分析 常见的时间复杂度 测试算法性能 线性查找法介绍 线性查找法是一个非常简单的算法,比如说现在有一打试卷 ...

最新文章

  1. laravel 是怎么做到运行 composer dump-autoload 不清空 classmap 映射关系的呢?
  2. 删除取消 excel 2007 自动生成的超链接
  3. 【pointnet++点云识别】基于pointnet++的点云地理数据识别的MATLAB仿真
  4. Java常用类之【八种基本数据类型】
  5. k8s install
  6. Mac电视投屏工具:Mirror for Any Device for Mac
  7. 如何使用Putty登录安装在VirtualBox里的ubuntu 1
  8. 使用MMS(MongoDB Monitoring Service)监控MongoDB
  9. 【Luogu2142】【模板】高精度减法
  10. OSPF的LSA类型 ——连载二网络LSA
  11. 程序上下文切换,什么是上下文?
  12. 最少拍控制系统设计(一)-- 最少拍无纹波系统的设计方法
  13. 关于需求确认的重要性
  14. Python中的二维数组定义
  15. 获取国家法定节假日和周末
  16. java 1 20内奇数的乘积_计算所有奇数的乘积
  17. 汇编语言 王爽第二版 总结
  18. Android 设备Id 唯一不重复,Redmi
  19. 智能AI短视频搬运剪辑小程序,可过原创检测
  20. 提高农业品牌互联网曝光度的“四个一工程”

热门文章

  1. Android 播放mp3 tag乱码分析之jni 篇
  2. cdn与服务器的关系_域名解析、CDN 加速、服务器绑定域名之间的关系及如何操作?...
  3. 机器人的弊议论文_机器人替代人工利弊作文
  4. Markdown笔记的搭建:vscode+印象笔记+PicGo
  5. 去斑收毛孔 7个经济小偏方
  6. opengl鼠标点击选取模型
  7. 专门去除COD及其他有机物的技术特点
  8. 索尼android 8,索尼立功!让Android 8.0有了一个黑科技
  9. 蓝牙耳机哪个品牌最好?目前最值得入手性价比高的无线蓝牙耳机
  10. 祛除雀斑的健康方法 - 生活至上,美容至尚!