- 数据结构是组织存储数据的方式,通常情况下精心选择的数据结构会带来最优效率的算法
例子:如何在书架子存储图书(给你书和图书,如何摆放)
- 存
1. 单单按拼音存放,二分法查找,找到相关的位置插入,但是后面的数据要向后移
2. 先分类,二分法查找,插入时只要在自己的分类的数据上向后移,但是如果一个架子不能装下,则需要加一个架子
- 取
1. 单单按拼音存放,二分法查找
2. 查到某分类下查找
如何确定各类别的空间?
- 类粗,一个类别太多书
- 类细,太多种类
- 空间大,浪费空间
- 空间小,不够空间
- 解决问题方法的效率和空间利用率有关
例子:写一个程序实现一个函数PrintN,使得传入一个正整数为N的参数后,能顺序打印从N到1的全部正整数
调用递归函数 VS 循环
from time import *
def printN1(N):
print N
if N>1:
printN1(N-1)
N-=1
def printN2(N):
while N>0:
print N
N-=1
N=int(raw_input("Enter N:"))
start=clock()
printN2(N)
print (clock()-start)/1000
- 解决问题效率与算法有关
直接算法 VS a0+X*(a1+X*(a2+X*(a3+....)))
def poly1(x,ls):
length=len(ls)
res=0
for i in range(length):
res+=ls[i]*x**i
return res
def poly2(x,ls):
idx=len(ls)-1
res=ls[idx]
while 0<idx:
res=ls[idx-1]+res*x
idx-=1
return res
我们常常用clock来计算算法时间,如果函数太快了,可以执行多次函数,然后平均
============================Insert something about Vim Editor and GCC========================
1. MAC自带Vim
2. Windows+Vim+GCC
http://blog.163.com/lixiangqiu_9202/blog/static/535750372012461190722/
3. Linux+Vim+GCC
http://blog.csdn.net/wolfpkfox/article/details/5570996
Vim入门
输入vim进入normal模式,输入i进入编辑插入模式,按入ESC键退出返回normal模式,在normal模式下,所有键都是功能键,保存完才能清退,以下是一些功能键与之对应功能:
yy - 拷贝
p - 黏贴
dd - 删除当前行
x - 删除光标所在的下一个字符
O - 在行前加入新行
o - 在行后加入新行
0 - 直接移动光标到行头
a - 光标后插入
u - undo
ctrl+r - redo
hjkl - 左下上右
:x和ZZ - 保存退出
:w - 保存
q! - 退出不保存
:e <path/to/file> - 打开一个文件
:saves <path/to/file> - 存放在什么地方
http://blog.csdn.net/niushuai666/article/details/7275406
GCC入门
GCC可以用来编译程序,程序的编译一般包括预处理,编译,汇编和链接过程:
1. 预处理,生成.l的文件
2. 将预处理文件转换成汇编代码,生成.s文件
3. 将汇编代码变为目标代码(机器代码),生成.o文件
4. 链接目标代码,生成可执行文件
gcc 程序名:生成一个a.out可执行文件
如果想要生成自定义文件名,则是gcc -o 自定义文件名 程序名
gcc -o tt t1.c
之后可以直接使用tt运行程序
-s 生成.s文件
- c 生成.o文件
gcc 程序名 -include 需要文件的路径
==================================END===========================
- 数据结构
- 逻辑结构,如线性结构,树等
- 物理存储结构,在机器中到底是如何存放的
抽象数据类型(数据对象集,操作集)
- 算法
一般情况下是不考虑空间复杂度的,空间复杂度并不是指所有的数据所占用的空间,而是使用的辅助空间的大小,比如两个矩阵的运算,在中间设置了一个中间矩阵来保存一些数据,这些空间叫做空间复杂度。空间复杂度的运算非常麻烦,一般简单的算法空间复杂度都是O(1),比较复杂的会告知空间复杂度,记住就好了。
一般而言,只比较额外空间,来比较算法空间优越性,也就是基础数据所需空间无法避免。
比如排序算法中的快速排序,显然会需要一个栈来记录递归返回地址,所以额外空间是O(logn)。堆排序虽然是在原数组中建堆,但是每做一次sift_down操作要同时做一次交换,交换操作一般需要一个临时变量,所以也说额外空间是O(1)
还有像二路归并排序,需要一个额外的数组,所以额外空间是O(n)
再比如DFS通常需要一个o(n)的二进制数组来进行回溯。
当然,还有一些外排序算法,通过交换区和虚拟内存技术,可以减少内存空间。
若有两段算法,复杂度分别是T1(n)= O(f1(n)), T2(n)= O(f2(n)),则
T1(n)+T2(n)=max(O(f1(n)), O(f2(n))) (if-else,比较两个分支和判断条件复杂度)
T1(n)*T2(n)=O(f1(n)*f2(n)) (for)
如果T(n)是n的k阶,则T(n)=O(n^k)