视频解析  https://edu.csdn.net/course/play/7813


计算机科学是通过使用计算机解决各种问题的研究领域。

为了使用计算机解决给出的问题,您需要为其设计算法。

可设计多个算法来解决特定的问题。

提供了最大效率的算法应用于解决此问题。

算法的效率可通过使用合适的数据结构来改善。

数据结构帮助创建简单、可重用和易于维护的程序。

本模块允许学员选择并实现合适的数据结构和算法来解决特定 的编程问题。


解决问题时算法和数据结构的作用


问题解决是每个科学规律的必要部分。

计算机广泛用于解决与各个域有关的问题,例如银行、商业、医疗、制造和 运输。

为了使用计算机解决给出的问题,您需要为其编写程序。

程序由两个组件组成,即算法和数据结构。


算法这个词来源于波斯数学名称 Al-Khowarizmi 

算法可定义为解决问题的逐步程序。

算法帮助用户在有限的步骤中到达正确的结果。



算法具有 5 个重要的属性:

有限性

明确性 ( 确定目的 )

输入

输出

有效性



只要可以为其编写算法,通过使用计算机可以解决问题。

此外,算法提供了以下好处:

帮助编写对应的程序

帮助区分一系列可以解决的小问题和难以解决的问题

决策制定成为更加理性的过程

使得过程一致和可靠



数据结构的作用


可使用不同的算法来解决相同的问题。

一些算法可能比其它算法更有效地解决问题。

应使用提供最大效率的算法来解决问题。

改善算法效率的其中一个基本技巧是使用 适当的数据结构 

数据结构被定义为在内存中互相组织各个数据元素的方式。



数据可以按许多不同的方式来组织。因此,您可以创建尽可能多的数据结构。

经过多年已经证明很有用的一些数据结构是:

 数据类型也是基本数据结构.

数组

链表

堆栈

队列


合适数据结构的使用有助于提高程序的效率。

使用合适的数据结构还允许您克服一些其它编程挑战,如:

简化复杂的问题

创建标准的可重用的代码组件

创建易于理解和维护的程序


数据结构的类型


数据结构可分为以下两类:

静态:例子数组

动态:例子链接表


设计算法时两个常用的技巧是:

分治法

贪婪法



分治法是解决概念性困难问题的强大方法。

分治法需要你找出一个方法:

将问题细分为子问题

解决微不足道的用例

组合到子问题的解决方案以解决原始问题


基于贪婪法的算法用于解决优化问题,其中您需要在给定的条件集合中最大化利润或最小化成本。

优化问题的一些示例包括:

找出从始发城市到一组目标城市的最短距离,给出两个城市之间的距离。

找出某个金额所需的货币票据的最小数值,其中有每个命名的任意票据数。

从给出的项集合中选择具有最大值的项,其中所选项的总重量不能超过给出的值。


递归:

递归指的是按照本身定义过程的技巧

用于解决本来重复的复杂编程问题

通过使用递归程序或函数,递归可以在程序中实现。递归程序或函数是调用本身的函数。

递归的主要好处是可用于编写清晰、简短和简单的程序

最简单的一个小例子:从前有座山,山里有个老和尚,….


课间思考


明确在尝试找出前面n个自然数之和的以下算法中的问题:

      算法:Sum (n)

      1. s = n + Sum(n  1)

      2. Return (s)



答案:

在给出的递归算法中没有结束条件。因此,可以无限调用自身。正确的算法为:

    


  1. If (n = 1)

      Return(1)

  2. s = n + Sum(n – 1)

  3. Return(s)



确定算法的效率


影响程序效率的因素包括:

机器速度

编译器

操作系统

编程语言

输入大小

除了这些因素,程序的方式数据被组织且用于解决此问题的算法还对程序的 效率具有重大影响。



通过确定消耗的资源量,可以计算算法的效率。

算法消耗的主要资源是:

时间: 执行算法所需的 CPU 时间。

空间: 执行算法时所用的内存量。

算法使用的资源越少,效率越高。


时间 / 空间权衡 

指的是您可以在程序执行速度较慢时可以减少使用的内存或在使用内存的成本很 高时减少运行的时间。

可以应用时间 / 空间权衡的情形示例为数据存储。

内存是可扩展的,但时间却不可以。因此, 通常考虑 时间 要比考虑内存的情 况多。


为了测量算法的时间效率,您可以根据算法编写程序,执行程序并测量运行 程序所需的时间。

您按这种方式测量的执行时间将取决于大量因素,例如:

机器的速度

编译器

操作系统

编程语言

输入数据

但是,您要确定执行时间是如何受算法的性质影响的。


算法的运行时间直接与算法中涉及的关键比较成比例,并且它是 n 的函数, 其中 n 是输入数据的大小。

算法的 运行时间 随着输入 数据量的增加而增加  速率 称为算法增长的阶。

算法 增长的阶 使用  O  号来定义。

 符号已经接受为说明算法效率的基础技巧。



增长的阶与其对应的大 O 符号之间的不同是:

常量 - O(1)

对数 - O(log n)

线性 - O(n)

重对数 - O(n log n)

二次方程 - O(n 2 )

立方 - O(n 3 )

指数 - O(2 n ), O(10 n )



根据增长阶,大 符号可按照递增阶的方式排列:

     O(1) < O(log n) < O(n) < O(n log n) < O(n 2 ) < O(n 3 ) < O(2 n )

     < O(10 n )



分组讨论:所选算法的效率依赖性

问题描述:

您需要编写算法以搜索字典中给定的单词。讨论组织致电数据的不同算法和不 同方式如何影响进程的效率。



小结



在本章中,你已经学到:

算法可定义为解决问题的逐步程序,在有限的步骤内产生正确的结果。

算法具有 5 个重要的属性:

有限性

明确性

输入

输出

有效性

提供了最大效率的算法应用于解决此问题。



数据结构可分为以下两类:

静态

动态

设计算法时两个常用的技巧是:

分治法

贪婪法

递归指的是按照本身定义过程的技巧。用于解决本来重复的复杂编程问题。

算法消耗的主要资源是:

时间:执行算法所需的 CPU 时间。

空间: 执行算法所用的内存量。



时间 / 空间权衡指的是您可以为了减慢程序执行的速度而减小内存的使用量,或 在减少运行时间的同时提高使用的内存。

算法的总运行时间直接与算法中涉及的比较次数成比例。

算法增长的阶使用大 O 符号来定义。