1.1打开算法之门
数据结构+算法=程序
数据结构是程序的骨架,算法是程序的灵魂;
1.2妙不可言-算法复杂性
伪代码(Pseudocode)是一种非正式的,类似于英语结构的,用于描述模块结构图的语言。人们在用不同的编程语言实现同一个算法时意识到,他们的实现(注意:这里是实现,不是功能)很不同。尤其是对于那些熟练于不同编程语言的程序员要理解一个(用其他编程语言编写的程序的)功能时可能很难,因为程序语言的形式限制了程序员对程序关键部分的理解。这样伪代码就应运而生了。伪代码提供了更多的设计信息,每一个模块的描述都必须与设计结构图一起出现。
使用伪代码的目的是使被描述的算法可以容易地以任何一种编程语言(Pascal,C,Java等)实现。因此,伪代码必须结构清晰、代码简单、可读性好,并且类似自然语言。 介于自然语言与编程语言之间。以编程语言的书写形式指明算法职能。使用伪代码, 不用拘泥于具体实现。相比程序语言(例如Java, C++,C, Dephi 等等)它更类似自然语言。它是半角式化、不标准的语言。可以将整个算法运行过程的结构用接近自然语言的形式(可以使用任何一种你熟悉的文字,关键是把程序的意思表达出来)描述出来。
算法是对特定问题求解步骤的一种描述;
算法具有一下特性:
有穷性:算法是由若干条指令组成的有穷序列,总是在执行若干次后结束,不可能永不停止;
确定性:每条语句都有确定的含义,无歧义;
可行性:算法在当前环境条件下可以通过有限次运算来实现;
输入/输出:有零个或多个输入以及一个或多个输出;
好算法的标准:
正确性:正确性是指算法能够满足具体问题的需求,程序运算正常,无语法错误,能够通过典型的软件测试,达到预期;
易读性:算法遵循标识符命名规则,简洁易懂,注释语句恰当适量,方便自己和他人阅读,便于后期调试和修改;
健壮性:算法对非法数据及操作有较好的反应和处理;
高效性:高效性是指算法运行效率高,即算法运行所消耗的时间短。
低存储性:低存储性是指算法所需的存储空间小。对于像手机、平板电脑这样的嵌入式设备,算法如果占用1空间过大,则无法运行。算法占用的空间大小被称为空间复杂度。
好算法的评判标准是高效率、低存储。
时间复杂度:算法运行需要的时间
空间复杂度:算法占用的空间大小
空间复杂度的本意是指算法在运行过程中占用了多少存储空间;
算法占用的存储空间包括:
输入/输出数据
算法本身
额外需要的辅助空间
输入输出数据占用的空间是必需的,算法本身占用的空间可以通过精简算法来缩减,但缩减的量是很小的,可以忽略不计。算法在运行时所用的辅助变量占用的空间(即辅助空间)才是衡量算法空间复杂度的关键因素;
1.3一盘棋的麦子
常见的算法时间复杂度有一下几类
常数阶
常数阶算法的运算次数是一个常数,如5、20、100。常数阶算法的时间复杂度通常用O(1)表示。
多项式阶
很多算法的时间复杂度是多项式,通常用O(n)、O(n*2)、O(n*3)等表示
指数阶
指数阶算法的运行效率极差,程序员往往像躲着恶魔一样避开这种算法。
对数阶
对数阶算法的运行效率较高
指数阶增量随着x的增加而急剧增加,而对数阶增长缓慢
在设计算法时,我们要注意算法复杂度增量的问题,尽量避免爆炸级增量
1.4神奇的兔子数列
做一些小练习:
打印出所有1000以内的水仙花数
#include <stdio.h>
int main() {
for (int i = 0; i < 1000; ++i) {
int a = i % 10, b = i / 10 % 10, c = i / 10 / 10;
if (a * a * a + b * b * b + c * c * c == i) {
printf("%d\n", i);
}
}
}
#include <stdio.h>
int main() {
int target = 10, result;
int a = 1, b = 2, c;
for (int i = 2; i < 10; ++i) {
c = a + b;
a = b;
b = c;
}
result = c ;
printf("%d \n", c );
}
1.5算法学习的瓶颈
实战:斐波那契数列
#include <stdio.h>
int main() {
int target = 10, result;
int a = 1, b = 2, c;
for (int i = 2; i < 10; ++i) {
c = a + b;
a = b;
b = c;
}
result = c ;
printf("%d \n", c );
}
备注:如有错误,请谅解!
此文章为本人学习笔记,仅供参考!如有重复!!!请联系本人