第一课作业 关于程序算法

一位程序员为妻子开设了一个特别的计算机课程,采用生动有趣的语言教授基础知识,每天布置作业并等待提交后才继续下一课。本文尝试解答了课程中的部分问题,包括编程方法论的理解、列举10种数据结构及10种算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

          无意中在51CTO.COM中看到了一个专栏,是一个比较牛的程序员给他的妻子写的计算机课程,感觉里面的语言生动有趣,而且从基础的入手,每天都会有作业,瞬间被这种学习方法所感动,只有当她老婆把作业提交后,他才会写出下一课,虽然很羡慕这个女孩有这样一个用心的好老公,但是很多东西还是要靠自己,能在新年前遇见这样的一个专栏,我已经很开心了。我会自我代入,将他所布置的答案写在这里,写完一课后再进行下一课的学习,目前有13个。
       第一课的作业是:
1. 用500字讲述什么是Programming Methodology?
2. 列举10种Data Structure.
3. 列举10种Algorithm.
对于上述问题,我的答案一直是似懂非懂,很模糊的感觉,我通过网络来进行回答,也是自己补充知识的一个过程。
 
1、500字论述什么是程序算法:
程序算法是对某些特定问题的求解过程的描述,是指令的有限序列,每条指令完成一个或多个操作,通俗的讲,就是为了解决某个问题而采取的具体有限的操作步骤。
特性是:有穷性,确定性,可行性,零个或多个输入,一个或多个输出
算法的复杂度:时间复杂度 空间复杂度
 
2. 列举10种Data Structure.
一、栈
1、后缀表达式的求值;
2、中缀到后缀表达式的转换;
3、深度优先搜索的非递归实现;
4、动态规划的优化:用于维护一个凸序列,便于二分查找,如LIS问题的O(nlgn)算法。
二、队列:
1、树的层序遍历;
2、广度优先搜索;
3、Bellman-Ford算法的SPFA实现;
4、网络流中FF算法的Edmonds-Karp实现,以及Preflow算法的队列优化实现。
三、二叉搜索树:
1、对大量的关键字的索引查找;
2、有很多平衡策略以改善其平均性能:
常用平衡树:AVL,红黑树,随机化BST,Splay Tree,Treap(或叫笛卡儿树)。
四、散列表(hash表): 
1、一般针对值域较大但状态很稀疏的应用,比如状态压缩记忆化搜索;
2、实现映射功能。
五、检索树(Trie):
1、一般用于字符串索引算法,速度快,但占用空间较大(相对hash);
2、常用的改进结构:Patricia线索树,多叉检索树(TST)。
六、优先队列:
1、常用的是二叉堆的实现,具体应用如堆排序和Dijkstra算法;
2、当需要快速合并两个优先队列时,常用二项式队列,实现简单。
3、注意最大最小堆的配对使用。
七、线段树和树状数组:
1、两者都可以用于离散对象的统计;
2、后者的步进函数的性质和应用值得注意;
3、前者基本上适用于任何的区间操作,如求区间最值,改变区间的值等。
4、线段树还可以用于优化状态的枚举,经常和动态规划结合。
八、后缀树与后缀数组:
1、总体规律是两者的实现都比较复杂,前者更甚,但是前者的功能也更强大;
2、几乎可以解决所有常见的关于字符串的算法,如最长回文子串,最长重复子串,以及很多的模式匹配问题。
九、并查集:
1、解决无向图的连通性问题,如用于Kruskal算法;
2、解决等价关系的查询(这是它的主要用武之地),如05年Baidu之星初赛的石头剪子布游戏;
3、优点是实现异常简单,缺点是合并后无法分离,若需要可以选择用动态树。
十、邻接表和边表:
1、表示图的最直接的方法;
2、后者更省空间,并且在一定程度上更好用,比如Bellman-Ford算法。
ps:数组、链表太基础不在考虑之列。 
3. 列举10种Algorithm.

计算机上的十种武器(常用的经典算法)

 1、蒙特卡罗算法(该算法又称随机性模拟算法,是通过计算机仿真来解决问题的算法,同时可以通过模拟可以来检验自己模型的正确性,是比赛时必用的方法)
2、数据拟合、参数估计、插值等数据处理算法(比赛中通常会遇到大量的数据需要处理,而处理数据的关键就在于这些算法,通常使用Matlab作为工具)
3、线性规划、整数规划、多元规划、二次规划等规划类问题(建模竞赛大多数问题属于最优化问题,很多时候这些问题可以用数学规划算法来描述,通常使用Lindo、Lingo软件实现)
4、图论算法(这类算法可以分为很多种,包括最短路、网络流、二分图等算法,涉及到图论的问题可以用这些方法解决,需要认真准备)
5、动态规划、回溯搜索、分治算法、分支定界等计算机算法(这些算法是算法设计中比较常用的方法,很多场合可以用到竞赛中)
6、最优化理论的三大非经典算法:模拟退火法、神经网络、遗传算法(这些问题是用来解决一些较困难的最优化问题的算法,对于有些问题非常有帮助,但是算法的实现比较困难,需慎重使用) 7、数值分析算法(如果在比赛中采用高级语言进行编程的话,那一些数值分析中常用的算法比如方程组求解、矩阵运算、函数积分等算法就需要额外编写库函数进行调用)
 8、一些连续离散化方法(很多问题都是实际来的,数据可以是连续的,而计算机只认的是离散的数据,因此将其离散化后进行差分代替微分、求和代替积分等思想是非常重要的)
9、网格算法和穷举法(网格算法和穷举法都是暴力搜索最优点的算法,在很多竞赛题中有应用,当重点讨论模型本身而轻视算法的时候,可以使用这种暴力方案,最好使用一些高级语言作为编程工具)  
10、图象处理算法(赛题中有一类问题与图形有关,即使与图形无关,论文中也应该要不乏图片的,这些图形如何展示以及如何处理就是需要解决的问题,通常使用Matlab进行处理
 
以上内容都来自于网络。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值