算法(algorithm),算法在计算机科学中描述为:计算机接受一个输入的指令,然后进行一个过程处理,最后输出计算的结果。
例如:妈妈让打酱油的过程,打酱油的命令是输入,给妈妈酱油是输出
总之,逻辑过程或者行为模式在计算机中的映射是算法
用更准确的描述来说,算法是一种有限,确定,有效的并适合计算机程序来实现的,用来解决问题的方法。
例如:有一个问题,然后有一个方法去解决它,这个方法叫算法
算法是有限的,就是算法的步骤是有限的,执行的时间也是有限的,能够在有限时间内得出结果。
算法也是确定的,就是无论执行多少次计算结果都是一样的
算法是有效的,就是计算出的结果对解决问题有帮助
一个例子:汉诺塔问题描述
在三根杆(编号A,B,C),在A杆自上而下,由大到小按顺序排序放置64个金盘。
游戏目标:把A杆上的金盘全部移到C杆上并保持原有顺序叠好
操作规则:每次只能移动一个盘子,并且在移动的过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A,B,C任意一杆上
我们想到的算法:
package main import "fmt" var total = 0 // 汉诺塔 // 一开始A杆上有N个盘子,B和C杆都没有盘子。 func main() { n := 4 // 64 个盘子 a := "a" // 杆子A b := "b" // 杆子B c := "c" // 杆子C tower(n, a, b, c) // 当 n=1 时,移动次数为 1 // 当 n=2 时,移动次数为 3 // 当 n=3 时,移动次数为 7 // 当 n=4 时,移动次数为 15 fmt.Println(total) } // 表示将N个盘子,从 a 杆,借助 b 杆移到 c 杆 func tower(n int, a, b, c string) { if n == 1 { total = total + 1 fmt.Println(a, "->", c) return } tower(n-1, a, c, b) total = total + 1 fmt.Println(a, "->", c) tower(n-1, b, a, c) }
通过归纳法,我们得知需要移动的次数为2的n次方-1
通过计算可以得知2的64次方-1=18446744073709551615
所以显然得到的这个记过告诉我们,这个算法不是很现实所以我们不使用此方法
数据结构,顾名思义就是存放数据的结构,也可以认为是存放数据的容器。比如你要寻找出1000个数字中最大值,首先就需要将这个1000个数字记在某些卡片上,然后对卡片进行排序。
大多数算法都需要组织数据,所以产生了数据结构。数据结构在计算机中,主要是用来实现各种算法的基础,当然数据结构本身也是算法的一部分。
基本的数据结构有:链表,栈和队列,树和图
数据结构是算法的辅助,是为了更高效组织数据的结构,所以数据结构和算法其实密切联系。
学习算法是为了更好的节约资源,但是选择合适的算法很难。我们需要对其进行数学分析才能知道什么是好的算法,在计算机里,我们称这一过程为算法分析
什么是好的数据结构和好的算法
计算机资源是有限的,占用计算机资源越小的越好
人的生命是有限的,等待的时间越短越好
得出新的理论:时间和空间复杂度理论
算法**
计算机资源是有限的,占用计算机资源越小的越好
人的生命是有限的,等待的时间越短越好
得出新的理论:时间和空间复杂度理论