什么是算法设计?
算法设计更难,编码只是根据算法的伪代码去实现算法。需要一些写代码的功底。算法设计更注重的是想法。基本上算法设计出来了,写程序就不难了。 算法设计的工资比编码的工资高得多,一个高中生就能编码了。 在印度,程序员基本上是高中生。而中国的计算机本科生出来基本上做了程序员。
延伸阅读
算法设计的特点?
确性:算法的正确性是指算法至少应该有输入、输出和加工处理无歧义性、能正确反映问题的需求、能够得到正确答案。
可读性:算法设计的另一目的是为了便于阅读、理解和交流。
健壮性:当输入数据不合法时,算法也能做出相关处理,而不是产生异常或莫名其妙的结构。
时间效率高和存储量低。
算法的基本设计要求?
算法的基本设计要求包括:
1、数据对象的操作和操作:计算机可以执行的基本操作以指令的形式描述。
2、算法的控制结构:算法的功能结构不仅取决于所选的操作,还取决于操作之间的执行顺序。
算法的特征如下:
1、有穷性:算法的有穷性意味着算法在执行有限的步骤之后必须能够终止。
2、确切性:算法的每一步都必须确切定义。
3、输入项:一个算法有0个或多个输入来描述操作对象的初始条件。所谓的零输入是指由算法本身决定的初始条件。
4、输出项:一个算法有一个或多个输出来反映处理输入数据的结果。没有输出的算法毫无意义。
5、可行性:算法中执行的任何计算步骤都可以分解为基本的可执行操作步骤,即每个计算步骤都可以在有限的时间内完成。
算法设计怎么写?
设计一个好的算法需要设计者根据实际要解决的问题,充分发挥自己的分析和综合能力,经过认真构思、仔细设计和耐心调整。
在算法的设计过程中,最重要的是创新精神。经过数千年无数前人的创新,人类不近积累了大量精妙的算法,同时在算法的设计方法上也进行了深入的探讨,发现许多不同问题的解决算法,它们的设计思想有相似之处。经过科学的总结,找到了一些行之有效的能够用于设计算法的一般方法。
什么是主要的算法设计?
主要的算法设计包括分而治之算法、动态规划、贪心算法等。
分而治之是一种常见的算法设计,它的思路是把问题分解为与原始问题相似的较小子问题。通常以递归方式解决子问题,并结合子问题的解决方案来解决原始问题。
动态规划是一种优化技术,用于通过把复杂问题分解为较小的子问题来解决。看上去很像是分治法,但动态规划不是把问题分解为独立的子问题然后再组合在一起,而是只把问题分解为独立的子问题。
贪心算法与当前的最优解决方案相关,并试图找到一个全局的最佳方案。与动态规划不同,它不考虑全局。贪心算法倾向于简单直观,但可能不是整体最优的解决方案。
算法设计的5种基本方法?
步骤/方式1
一、【分治法】
分治策略是:对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并得到原问题的解。
步骤/方式2
二、【动态规划法】
最优化原理是动态规划的基础,任何一个问题,如果失去了这个最优化原理的支持,就不可能用动态规划方法计算。
使用动态规划求解问题,最重要的就是确定动态规划三要素:问题的阶段,每个阶段的状态以及从前一个阶段转化到后一个阶段之间的递推关系。
步骤/方式3
三、【贪心算法】所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。贪心算法的基本思路如下:1.建立数学模型来描述问题。2.把求解的问题分成若干个子问题。3.对每一子问题求解,得到子问题的局部最优解。4.把子问题的解局部最优解合成原来解问题的一个解。
步骤/方式4
四、【回溯法】
回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。
用回溯法解题的一般步骤:
(1)针对所给问题,定义问题的解空间;
(2)确定易于搜索的解空间结构;
(3)以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。
步骤/方式5
五、【分支限界法】
基本思想 :分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。
常见的两种分支限界法:
(1)队列式(FIFO)分支限界法:按照队列先进先出(FIFO)原则选取下一个节点为扩展节点。
(2)优先队列式分支限界法:按照优先队列中规定的优先级选取优先级最高的节点成为当前扩展节点。
常用算法设计方法是什么?
算法设计是一件非常困难的工作,经常采用的算法设计技术主要有迭代法、穷举搜索法、递推法、贪婪法、回溯法、分治法、动态规划法等等。 另外,为了更简洁的形式设计和藐视算法,在算法设计时又常常采用递归技术,用递归描述算法。
算法设计的步骤?
1. 弄清楚题目的意思,列出题目的输入、输出、约束条件
其中又一道题目是这样的:“有一个mxn的矩阵,每一行从左到右是升序的,每一列从上到下是升序的。请实现一个函数,在矩阵中查找元素elem,找到则返回elem的位置。”题设只说了行和列是升序的,我在草稿纸上画了一个3×4的矩阵,里面的元素是1~12,于是我就想当然的认为矩阵的左上角是最小的元素,右下角是最大的元素。于是整个题目的思考方向就错了。
2. 思考怎样让算法的时间复杂度尽可能的小
继续以上面的题目为例子。可以有如下几种算法:
a. 遍历整个矩阵进行查找,那么复杂度为O(m*n);
b. 因为每一行是有序的,所以可以对每一行进行二分查找,复杂度为O(m*logn)。但是这样只用到了行有序的性质。
c. 网上查了一下,最优的算法是从矩阵的左下角开始,比较左下角的元素(假设为X)与elem的大小,如果elem比X大,那么X所在的那一列元素就都被排除了,因为X是该列中最大的了,比X还大,那么肯定比X上面的都大;如果elem比X小,那么X所在的那一行就可以排除了,因为X是这一行里最小的了,比X还小那么肯定比X右边的都小。每迭代一次,矩阵的尺寸就缩小一行或一列。复杂度为O(max(m,n))。
可以先从复杂度较高的实现方法入手,然后再考虑如何利用题目的特定条件来降低复杂度。
3. 编写伪代码或代码