数据结构与算法 介绍(笔记)

来源:互联网 发布:pon网络光纤监测系统 编辑:程序博客网 时间:2024/06/06 03:39

  • 数据结构是组织存储数据的方式,通常情况下精心选择的数据结构会带来最优效率的算法

例子:如何在书架子存储图书(给你书和图书,如何摆放)

- 存

1. 单单按拼音存放,二分法查找,找到相关的位置插入,但是后面的数据要向后移

2. 先分类,二分法查找,插入时只要在自己的分类的数据上向后移,但是如果一个架子不能装下,则需要加一个架子

- 取

1. 单单按拼音存放,二分法查找

2. 查到某分类下查找


如何确定各类别的空间?

- 类粗,一个类别太多书

- 类细,太多种类

- 空间大,浪费空间

- 空间小,不够空间


  • 解决问题方法的效率和空间利用率有关

例子:写一个程序实现一个函数PrintN,使得传入一个正整数为N的参数后,能顺序打印从N到1的全部正整数

调用递归函数 VS 循环

from time import *def printN1(N):print Nif N>1:printN1(N-1)N-=1def printN2(N):while N>0:print NN-=1N=int(raw_input("Enter N:"))start=clock()printN2(N)print (clock()-start)/1000
输入10000后,使用递归方法会返回RuntimeError: maximum recursion depth exceeded,因为递归占用空间太大,需要保存10000个状态知道最后一个被算出,所有会发生溢出的错误,S(n)=C(n)
  • 解决问题效率与算法有关
例子:求多项式的值 f(x)=a0+a1*X+a2*X^2+a3*X^3+...+aN*X^N

直接算法 VS a0+X*(a1+X*(a2+X*(a3+....)))

def poly1(x,ls):length=len(ls)res=0for i in range(length):res+=ls[i]*x**ireturn resdef poly2(x,ls):idx=len(ls)-1res=ls[idx]while 0<idx:res=ls[idx-1]+res*xidx-=1return 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===========================

  • 数据结构

- 逻辑结构,如线性结构,树等

- 物理存储结构,在机器中到底是如何存放的

抽象数据类型(数据对象集,操作集)

  • 算法
一个有限的指令集,产生输出,在有限步骤之后终止,与程序不同,每一个指令必须没有歧义,现实不依赖任何语言
什么是好的算法 - 最快情况复杂度,平均复杂度 
- 时间复杂度T(n),耗费时间的长度
- 空间复杂度S(n), 耗费存储单元的长度(相对

回顾多项式,第一个普通的方法需要(1+2+3+4+...+n), T(n)=C1*n^2+C2*n,而第二种只需要n

空间复杂度:(这个网上复制的,忘记了出处了,T_T)

一般情况下是不考虑空间复杂度的,空间复杂度并不是指所有的数据所占用的空间,而是使用的辅助空间的大小,比如两个矩阵的运算,在中间设置了一个中间矩阵来保存一些数据,这些空间叫做空间复杂度。空间复杂度的运算非常麻烦,一般简单的算法空间复杂度都是O(1),比较复杂的会告知空间复杂度,记住就好了。


一般而言,只比较额外空间,来比较算法空间优越性,也就是基础数据所需空间无法避免。
比如排序算法中的快速排序,显然会需要一个栈来记录递归返回地址,所以额外空间是O(logn)堆排序虽然是在原数组中建堆,但是每做一次sift_down操作要同时做一次交换,交换操作一般需要一个临时变量,所以也说额外空间是O(1)
还有像
路归并排序,需要一个额外的数组,所以额外空间是On

再比如DFS通常需要一个o(n)的二进制数组来进行回溯。
当然,还有一些外排序算法,通过交换区和虚拟内存技术,可以减少内存空间。


渐进表达式: 
longN以什么为底,无关紧要




若有两段算法,复杂度分别是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)

0 0
原创粉丝点击