数据结构与算法代码(浙大版本陈越、何钦铭老师mooc课程)
第一章:基本概念
给定N个整数的序列{A1,A2,...,AN},求最大的子列和 。
算法一:暴力法找出所有子列和,时间复杂度O(N^3)
#include<stdio.h>
#include<string.h>
int maxnum(int A[], int n);int main() {int A[10] = { 1,2,3,4,-3,4,-9,4,7 };int n = 10;int p;p=maxnum(A, n);printf("%d", p);return 0;
}//最大子列和的暴力求解方法int maxnum(int A[], int n) {int i, j, k;int thisnum;int maxnum=0;for (i = 0;i < n;i++) { /*i是子列的左端*/for (j = i;j < n;j++) { /*j是子列的右端*/thisnum = 0; /*A[i]到A[j]的子列和*/for (k = i;k <= j;k++)thisnum += A[k];if (thisnum > maxnum)maxnum = thisnum;}}return maxnum;}
算法二:暴力法基础上提升,时间复杂度O(N^2)
//此处省略的代码在上面int maxnum(int A[], int n) {int i, j, k;int thisnum;int maxnum=0;for (i = 0;i < n;i++) { /*i是子列的左端*/thisnum = 0;for (j = i;j < n;j++) { /*j是子列的右端*/thisnum += A[j]; /*对于相同的i,不同的j,只需要在前一次的基础上加下一个元素*/if (thisnum > maxnum) {maxnum = thisnum;}}}return maxnum;}
当出现时间复杂度为O(N^2)的时候,程序员就会思考将时间复杂度减小到O(NlogN)
算法3:分而治之,时间复杂度O(NlogN),将复杂的问题分开解决最后合并,时间复杂度的计算方法可以由递推得到
#include<stdio.h>
#include<string.h>
int max3(int a, int b, int c);
int maxnum(int A[], int n);
int maxfenzhi(int A[], int n);
int main() {int A[10] = { 1,2,3,4,-3,4,-9,4,7 };int n = 10;int p;p=maxfenzhi(A, n);printf("%d", p);return 0;}
int max3(int a, int b, int c) {return a > b ? a > c ? a : c : b > c ? b : c;/*这个式子是简略形式,(a > b ? (a > c ? a : c ): (b > c ? b : c))*/
}
int divideandconquer(int List[], int left, int right) {int maxleft, maxright; /*存放左右子列的和*/int maxleftborder, maxrightborder; /*存放跨界的结果*/int leftborder, rightborder;int center, i;if (left == right) {/*递归的终止条件,此时子列只有一个数字*/if (List[left] > 0)return List[left];else return 0;}/*分而治之中的‘分’*/center = (left + right) / 2; /*找到中分点*//*递归求两边子列的最大和*/maxleft = divideandconquer(List, left, center);maxright = divideandconquer(List, center+1, right);/*下面求跨分界线的最大子列和*/maxleftborder = 0;leftborder = 0;for (i = center;i >= left;i--) {/*从中线向左侧扫描*/leftborder += List[i];if (leftborder > maxleftborder)maxleftborder = leftborder;}/*左侧扫描结束*/maxrightborder = 0;rightborder = 0;for (i = center + 1;i <=right;i++) {/*从中线向右侧扫描*/leftborder += List[i];if (leftborder > maxleftborder)maxleftborder = leftborder;}/*右侧扫描结束*//*下面是分而治之中的‘治’*/return max3(maxleft, maxright, maxleftborder + maxrightborder);
}
int maxfenzhi(int A[], int n) {return divideandconquer(A, 0, n - 1);
}
算法4:在线处理算法,时间复杂度为O(N),比上面的都要快!想一下这也是最快的算法了,因为处理这种问题必须要全部看一遍数据,当然越快的算法有时候看起来不那么好理解。
#include<stdio.h>
#include<string.h>
int maxzaixian(int A[], int n);
int main() {int A[10] = { 1,2,3,4,-3,4,-9,4,7 };int n = 10;int p;p=maxzaixian(A, n);printf("%d", p);return 0;
}
int maxzaixian(int A[], int n) {int maxnum = 0;int thisnum = 0;for (int i = 0;i < n;i++){thisnum += A[i];if (thisnum > maxnum) {maxnum = thisnum;}if (thisnum < 0){thisnum = 0;}}return maxnum;
}
第一章的算法就是这样了,陆续会继续出以后的章节以及补充练习等等。
数据结构与算法代码(浙大版本陈越、何钦铭老师mooc课程)相关推荐
- 数据结构-第一讲 基本概念-学习笔记(MOOC 浙江大学 陈越 何钦铭)
目录 第一讲 基本概念 1.1 什么是数据结构 1.1.1 关于数据组织 - 例:图书摆放 1.1.2 关于空间使用 - 例:PrintN函数实现 1.1.3 关于算法效率 - 例:计算多项式值 计算 ...
- 数据结构与算法--代码鲁棒性案例分析
代码鲁棒性 鲁棒是robust的音译,就是健壮性.指程序能够判断输入是否符合规范,对不合要求的输入能够给出合理的结果. 容错性是鲁棒的一个重要体现.不鲁棒的代码发生异常的时候,会出现不可预测的异常,或 ...
- 数据结构与算法--代码完整性案例分析
确保代码完整性 在撸业务代码时候,经常面对的是接口的设计,在设计之初,我们必然要先想好入参,之后自然会有参数的校验过程,此时我们需要把可能的输入都想清楚,从而避免在程序中出现各种纰漏.但是难免面面俱到 ...
- 4数据结构与算法(C/C++实现)视频教程-王桂林-专题视频课程
<4>数据结构与算法(C/C++实现)视频教程-1008人已学习 课程介绍 C/C++实现数据结构与算法视频培训课程全面介绍计算机行业,基本的数据结构与算法,既有理论的深度 ...
- 考研数据结构与算法代码实现目录
文章目录 线性表与链表 栈和队列 三.树与二叉树 四.图 五.查找 六.排序 8.2 插入排序 8.3 交换排序 8.4 选择排序 8.5 归并排序 一定要从本质上彻底搞懂数据结构,在代码层面上理解. ...
- 《数据结构与算法》第二版-陈卫卫-陆军工程大学811数据结构教材 第1-2章 参考答案
<数据结构与算法>(第二版)陈卫卫-高等教育出版社 陆军工程大学811数据结构教材 第1-2章 参考答案 习题1.1 1.1-1 (1)名称.数量.特征.性质的 ...
- MOOC浙江大学陈月、何钦铭老师《数据结构》学习笔记01
①多项式求和的两种方法. double f(int n, double a[], double x) { int i;double p = a[0];for ( i=1; i<=n; i++)p ...
- 冒泡算法代码java_java版本的冒泡算法
/** 文件名:MAOPao.java 描述: java版本的冒泡算法 作者:慈勤强 Email:cqq1978@Gmail.com **/ http://www.gaodaima.com/?p=42 ...
- 哦麦艾斯!AI设计的丑衣服将引领时尚?数据结构与算法代码面试题;将文件藏在图片里的隐写工具;蒙古语语音合成语料库
最新文章
- 【iCore组合式双核心开发板教程】【快速使用手册】
- 将本地镜像发布到阿里云
- 把你的 VS Code 打造成 C++ 开发利器
- 博客园客户端(睡睡版iphone)源码
- Windows Phone性能优化建议
- Linux中断(interrupt)子系统之一:中断系统基本原理
- PyTorch 1.0 中文官方教程:使用PyTorch进行深度学习
- 【Java从0到架构师】Spring - IoC 控制反转、DI 依赖注入
- 邪恶的编码魔咒,你中招没?
- vue循环渲染本地图片不显示?
- VBA 打开 Debug窗口 进行调试 (同时可以查看debug操作对应的快捷键)
- pku 3207 Ikki's Story IV - Panda's Trick 2-sat判定是否存在可行解
- 《Python CookBook2》 第一章 文本 - 测试一个对象是否是类字符串 字符串对齐
- Python-Matplotlib 7 饼状图
- 在linux上運行小火車
- 【GNN框架系列】DGL第一讲:使用Deep Graph Library实现GNN进行节点分类
- Unity3D做的DEMO
- BIOS锁定纯UEFI启动的解锁办法
- ESP32 文件存储 spiffs
- 解锁万亿级市场,边缘计算不“边缘”
热门文章
- ​用友T+标准版如何反结账,反记账​
- Python笔记 | 四平方数和定理
- Ipad手写笔什么牌子好用?高性价比ipad手写笔排行
- mysql8最大连接数设置
- axure内联框架和动态面板_Axure教程:如何使用动态面板?动态面板功能详解
- shell获取文件夹下所有文件名
- 最短作业优先(SJF)调度算法
- Unity3D 大型游戏 最后一站 源码 部分重点匹配战斗(一)(10)
- 组复制系统变量 | 全方位认识 MySQL 8.0 Group Replication
- 解决:centos中不能打拼音输汉字