880 likes | 1.02k Views
思考. 问题六:大学生如何工作?(组织能力、管理能力) (班干部、系院学校团委、社团、志愿者 …… ). 不要崇拜哥,哥是打酱油的. 听说哥在大学 6 个社团当官,我好崇拜哥. 李开复给程序员的七个建议. 1. 练内功: 数据结构、算法、数据库、操作系统原理、计 算 机体系结构、计算机网络、离散数学等基础打实。 2. 多实战: 编程和调试并重。 3. 求实干: 一丝不苟、强烈的好奇心。 4. 重视数学学习 :离散数学、概率论、布尔代数、集合论和 数理逻辑。 5. 培养团队精神: 不能单打独斗、学会协作。
E N D
思考 • 问题六:大学生如何工作?(组织能力、管理能力) (班干部、系院学校团委、社团、志愿者……) 不要崇拜哥,哥是打酱油的 听说哥在大学6个社团当官,我好崇拜哥
李开复给程序员的七个建议 1.练内功:数据结构、算法、数据库、操作系统原理、计 算 机体系结构、计算机网络、离散数学等基础打实。 2.多实战:编程和调试并重。 3.求实干:一丝不苟、强烈的好奇心。 4.重视数学学习:离散数学、概率论、布尔代数、集合论和 数理逻辑。 5.培养团队精神:不能单打独斗、学会协作。 6.激励创新意识、培养好奇心、不要死记硬背:重要自己思 想的提高。 7.有策略的“打工”:实习机会也很重要。
送给学生的话 它们需要哪些能力 贝贝,如果你一生可以做五个工作,你希望做哪五个工作 老师、省长、CEO、医生、记者 爱好、吃苦、认真、特长、乐观、交际
算法与数据结构 • 6.1 算法的发现 • 6.2 什么是算法 • 6.3 算法的表示 • 6.4 基本的算法 • 6.5 数据结构
【面试真题一】 妈呀你管谁叫姑娘呢!人家是纯爷们儿! 一位商人有8枚银元,其中有1枚略轻的是假银元。姑娘您能用天平(不用砝码)将假银元找出来吗?
【面试真题二】 还是出道题考考你吧!听好了!东方明珠大概要多少个乒乓球垒积起来? 这叫什么题啊?这叫谁谁也回答不了!我……
【面试真题三】 把23、3、465、2、57、561、36、35 变成以下形式 的二维数组: 23 3 465 57 2 36 561 35 源代码
程序=数据结构+算法 描述对数据的操作步骤 描述数据的类型、组织形式 著名计算机科学家沃思( Niklaus Wirth )
我也不知道,让我们去学习吧…… 程序的灵魂是什么? 您真棒! 三毛,计算机的灵魂是什么? 软件的灵魂是什么 软件 程序 算法 海宝,算法的灵魂是什么?
6.1 算法的发现 • 算法(Algorithm)由九世纪数学家al-Khwarizmi的名 字翻译而来 • 它初期的概念是指解决问题或执行任务的确定的过程 • 1842年,Ada Byron为他设想的自动计算器写了世界 上第一个算法。但这算法未能被真正实现,因为Aba Byron未能造出他的自动计算器 • 现代意义上的计算机算法的概念是在1936年Alan Turing 提出现代计算机的基本模型图灵机之后才清晰 起来 • 算法是解决问题或执行任务的过程;它能够一步一步 地在图灵机或等价的机器(如现代的计算机)上执行
算法常常是用伪程序、自然语言、程序语言、硬算法常常是用伪程序、自然语言、程序语言、硬 件描述 • 由此可见,算法的本质是问题解决过程的概念, 而相应的程序只是一种它的表述 小胖,很多网民还不懂程序与算法的关系,你说说 程序就是算法的衣服,是其中衣服的一件
6.2 什么是算法 1.什么是算法 • 解决某一特定问题的一组有序的、明确的、可执行 的、可终止的步骤集合 例:求 • 方法1:1+2,+3,+4,一直加到100 加99次 • 方法2:100+(1+99)+(2+98)+…+(49 +51)+50 = 100 + 49×100 +50 加51次
2.算法特性 • 输入:有零个或多个 • 输出:至少一个 • 确定性:组成算法的每条指令清晰、无歧义 • 有限性:每条指令执行次数有限,执行每条指令的 时间有限 • 可行性:算法是能行的 • 程序是算法用程序语言的具体实现,程序可以不满 足有限性
3.算法的评价 • 正确性 • 健壮性 • 性能性(效率与低存储量) • 可读性 • 扩充性 • 维护性 为了有效地进行解题,不仅需要保证算法正确,还要考虑算法的质量,选择合适的算法。希望方法简单,运算步骤少
4.算法的复杂性计算 • 时间复杂性:与问题规模、算法输入及算法本身相 关的操作次数的总和,常记为T(n) • 渐进时间复杂性:问题规模逐渐增大后时间复杂度 的极限形式 • 如果存在一个常数C>0,一个算法能够在Cn2的时 间内处理完规模大小为n的输入,则该算法的时间 复杂性记为 O(n2),称作n2级
5.算法的分类 • 数值运算算法、 非数值运算算法 • 串行算法、并行算法 • 确定性算法、随机算法 • 描述算法的方法:文字、图形(符号)
6.算法研究的典型问题 • 分类 • 排序 • 搜索(图片、视频) • 遍历 • 集合运算
算法常用设计方法: • 循环法 • 递归法 • 分治法 • 贪心法 • 动态规划 • 线性规划 • 搜索与枚举 • 启发式搜索
8.学习算法的方法 • 数学家的方法:Dijkstra算法、A*算法等 • 工程师的方法: http://theory.stanford.edu/~amitp/GameProgramming/ 【典型例题】:货郎担问题 某售货员要到若干个城市销售货物,已知各城市之间的距离,要求售货员选择出发的城市以及旅行路线,使每个城市仅仅过一次,最后回到出发城市,而路程最短
6.3 算法的表示 1.为什么要设计算法表示 好好学习 好 读 书 不 好 读 书 好 读 书 不 好 读 书
2.带序号的自然语言描述 • 易懂却不直观,不严格 【例题】计算1到100的和 1. 0=>s单元 2. 1 => n单元 3. s+n =>s 4. n+1 =>n 5.判断n100?是,转3;否则转6 6.输出s的值
输入/输出 处理 判断 起止 连接点 流程线 开始 0=>s 1=>n s+n =>s n+1=>n T n100? F 输出s 结束 3.流程图-UML • 灵活、自由、形象、直观,可表示任何算法 【例题】计算1到100的和
0=>s P P A T F 1=>n A A P n100? A B s+n =>s n+1=>n 输出s的值 • 4.N-S图(盒图) • 特点:完全去掉了带箭头的流程线,算法所有处 理步骤都写在一个大矩形框(表示简单、符合结 构化思想) 判断 处理 循环 【例题】计算1到100的和
0=>s 1=>n if n100 s+n =>s n+1=>n print s • 5.伪代码 • 用介于自然语言与计算机语言之间的文字及符号来 描述算法 • 方便、易懂、便于向计算机语言过渡 【例题】计算1到100的和
Pn A P P1 P2 P2 P1 P1 L1 L2 X=… Ln while c C 或 P2 输入输出 重复 子算法 定义 选择 语句标号 处理 until c d 循环结构 a 顺序结构 b 选择结构 c 多选择结构 6.PAD图
x {输入年份} x是400的倍数 或者 x是4的倍数但不是100的倍数 算法开始 “x是闰年” “x不是闰年” 算法结束 【例题】输入年份,判断该年是否为闰年
6.4 基本的算法 1.求和 【例题】1到100的奇数之和 #include <stdio.h> int main() { int i,sum=0; for (i=1;i<=100;i++) { sum=sum+i; i=i+2; } printf("sum= %d \n",sum); } 这个程序对吗?
#include <stdio.h> int main() { int a=1,b=99,sum=0; for (;a<=b;) { sum=sum+a+b; a=a+2; b=b-2; } printf("sum= %d \n",sum); } 这个程序对吗?
【面试题】百元钱买百支笔问题(钢笔3元一支,【面试题】百元钱买百支笔问题(钢笔3元一支, 圆珠笔2元一支,铅笔0.5元一支)。 问:有哪些购买方案? 源代码
2.乘积 【面试真题】利用递归调用手段编程计算N! #include <stdio.h> int main() { int i,n,sum=1; scanf("%d",&n); for (i=1;i<=n;i++) { sum=sum*i; } printf("sum= %d \n",sum); }
#include <stdio.h> int main() { int n; int find(int i); scanf("%d",&n); printf("%d \n",find(n));} int find(int i) { int n,val=1; for(n=i;n>1;n--) val*=n; return val;}
#include <stdio.h> int main() { int n; int find(int n); scanf("%d",&n); printf("n!=%d \n",find(n));} int find(int n) { if(n==1) return 1; else return find(n-1)*n;}
3.最大和最小 【面试真题】四个数从小到大输出来 #include <stdio.h> int main() { int t,a,b,c,d; scanf("%d",&a); scanf("%d",&b); scanf("%d",&c); scanf("%d",&d); if(b>a) { t=a; a=b; b=t; } if(c>a) { t=a; a=c; c=t; } if(d>a) { t=a; a=d; d=t; } if(c>b) { t=b; b=c; c=t; } if(d>b) { t=b; b=d; d=t; } if(d>c) { t=c; c=d; d=t; } printf("%d,%d,%d,%d \n",a,b,c,d); }
4.排序 • 选择排序:先找一个最小的交换,然后在剩下的找最 小的交换 【例题】把下列的数字从小到大排列:23,78,45,8,32,56 第一次: 第二次: 第三次: 第四次: 第五次:
冒泡排序:依次比较相邻的两个数,将小数放在前冒泡排序:依次比较相邻的两个数,将小数放在前 面,大数放在后面 【例题】把下列的数字从小到大排列:23,78,45,8,32,56 第一次: 第二次: 第三次: 【思考】如果上面的例题每次找最小的排在前面, 则每次怎么排序?
插入排序:先取第一个,然后取第二个,把前面两个排插入排序:先取第一个,然后取第二个,把前面两个排 序,然后取第三个,把前三个排序,按照如此方法排序, 就像插牌 【例题】把下列的数字从小到大排列:23,78,45,8,32,56 第一次: 第二次: 第三次: 第四次: 第五次: 第六次:
快速排序: • 堆排序: • 希尔排序: • 桶式排序: • 合并排序: • 基排序:
5.查找 • 顺序查找:先从第一个数比较,然后第二个,直到相等 【例题】找到62:4,21,36,14,62,91,8,22,7,81,77,10 第一次: 第二次: 第三次: 第四次: 第五次:
折半查找:数据有顺序。先从数中间比较,然后看折半查找:数据有顺序。先从数中间比较,然后看 是大了还是小了,然后再找从中间到另一半的中间 的数进行比较,一直这样比较,直到找到 【例题】找到22:4,7,8,10,21,22,36,62,77,81,91 第一次: 第二次: 第三次: 第四次:
6.子算法 • 结构化编程的原则要将算法分成几个单元,称为 子算法,每个子算法又分为更小的子算法,如选择 排序
7.递归 • 迭代:如果算法的定义没有包含算法本身 • 递归:如果算法的定义包含算法本身
为什么学习《数据结构》 • 重要的计算机专业课程 • 重要的求职敲门砖 • 重要的考研专业课程 • 程序设计竞赛核心课程 • 它为操作系统、编译原理、数据库原理、软件工 程、图形学等后续课程的学习打下基础
为什么学习《数据结构》 • 进程之间就是用链表结构 • 内存分配就是用二叉平衡树 • 键盘的输入、显示器输出就是用队列 • 硬盘、内存、高速缓冲区切换的读入就用到电梯算法 • 编译原理就用到很多图、栈 • 数组到处都用 • 异常结构用到的异常链 • 文件索引用到的B+树 • 高速缓冲区用到hash 表 • 路由器就用到图 • ……
线性表 书目卡片 书目文件 索引表 按分类号 按书名 按作者名 登录号: 书名: 作者名: 分类号: 出版单位: 出版时间: 价格: 为什么学习《数据结构》 例1 书目自动检索系统
…... …... …... …... 树 …….. …….. 例2 人机对奕问题
例3文件管理的树型结构 文件目录间的树型关系
图 AB C AC AD D B BA BC BD DA DB DC E A EA EB EC ED 例4多叉路口交通灯管理问题