1 开发环境搭建
开发环境
■ 开发工具
□ eclipse(或者IntelliJ IDEA)
✔ 明亮、简洁、舒服
✔ 多个项目可以在同一个窗口展示
✔ 学习过程中不会使用到后台开发的框架
□ 支持Mac、Windows平台
□ 下载地址
✔ https://www.eclipse.org/downloads/
■ JDK
□ 版本≥ 1.8
□ 下载地址
✔ https://www.oracle.com/java/technologies/javase-downloads.html
配置环境变量(windows)
字体设置
■ Mac
■ Windows
行号设置
■ 点击红色区域,然后勾选:Show Line Numbers
常用快捷键
■ 代码提示
□ Mac:Option + /
□ Windows:Alt + /
■ 错误修复
□ Mac:Command + 1
□ Windows:Ctrl + 1
■ 快速生成代码
□ Mac:Option + Command + S
□ Windows:Alt + Shift + S
■ 自动导入所需要的类
□ Mac:Command + Shift + O
□ Windows:Ctrl + Shift + O
代码提示增强
■ 将需要代码提示的字符输入到下面的文本框
□ 比如输入.ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789
修改工作空间默认编码
导入已经存在的项目
■ 右键
2 斐波那契数
什么是算法
■ 算法是用于解决特定问题的一系列的执行步骤
■ 使用不同算法,解决同一个问题,效率可能相差非常大
□ 比如:求第n个斐波那契数(fiboncci number)
3 算法的评估
如何评判一个算法的好坏?
■ 如果单从执行效率上进行评估,可能会想到这么一种方案
□ 比较不同算法对同一组输入的执行处理时间
□ 这种方案也叫做:事后统计法
■ 上述方案有比较明显的缺点
□ 执行时间严重依赖硬件以及运行时各种不确定的环境因素
□ 必须编写相应的测算代码
□ 测试数据的选择比较难保证公正性
■ 一般从以下维度来评估算法的优劣
□ 正确性、可读性、健壮性(对不合理输入的反应能力和处理能力)
□ 时间复杂度(time complexity):估算程序指令的执行次数(执行时间)
□ 空间复杂度(space complexity):估算所需占用的存储时间)
4 时间复杂度的估算
5 大O表示法
大O表示法(Big O)
■ 一般用大O表示法来描述复杂度,它表示的是数据规模n对应的复杂度
■ 忽略常数、系数、低阶
□ 9 >> O(1)
□ 2n + 3 >> O(n)
□ n² + 2n + 6 >> O(n²)
□ 4n³ + 3n² + 22n + 100 >> O(n³)
□ 写法上,n³ 等价于 n^3
■ 注意:大O表示法仅仅是一种粗略的分析模型,是一种估算,能帮助我们短时间内了解一个算法的执行效率
对数阶的细节
■ 对数阶一般省略底数
■
常见的复杂度
■
■ 可以借助函数生成工具对比复杂度的大小
□ https://zh.numberempire.com/graphingcalculator.php
数据规模较小时
数据规模较大时
6 斐波那契数复杂度分析
fib函数的时间复杂度分析
■
■
■ 呈现的是指数级增长的趋势
■ 他们的差别有多大?
□
□
□
□ 有时候算法之间的差距,往往比硬件方面的差距还要大
斐波那契的线性代数解法 -特殊方程
时间复杂度:视为 O(1)
算法的优化方向
■用尽量少的存储空间
■ 用尽量少的执行步骤(执行方向)
■ 根据情况,可以
□ 空间换时间
□ 时间换空间
多个数据规模的情况
更多知识
■ 最多复杂度的知识,会在后续的数据结构、算法中穿插
□ 最好、最坏复杂度
□ 均摊复杂度
□ 复杂度震荡
□ 平均复杂度
□ ......
7 leetcode
leetcode
■ 一个用于联系算法的好网站
■ 斐波那契数