数据结构与算法 介绍(笔记)
2015-06-28 22:33
357 查看
数据结构是组织存储数据的方式,通常情况下精心选择的数据结构会带来最优效率的算法
例子:如何在书架子存储图书(给你书和图书,如何摆放)
- 存
1. 单单按拼音存放,二分法查找,找到相关的位置插入,但是后面的数据要向后移
2. 先分类,二分法查找,插入时只要在自己的分类的数据上向后移,但是如果一个架子不能装下,则需要加一个架子
- 取
1. 单单按拼音存放,二分法查找
2. 查到某分类下查找
如何确定各类别的空间?
- 类粗,一个类别太多书
- 类细,太多种类
- 空间大,浪费空间
- 空间小,不够空间
解决问题方法的效率和空间利用率有关
例子:写一个程序实现一个函数PrintN,使得传入一个正整数为N的参数后,能顺序打印从N到1的全部正整数
调用递归函数 VS 循环
输入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+....)))
我们常常用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)
还有像二路归并排序,需要一个额外的数组,所以额外空间是O(n)
再比如DFS通常需要一个o(n)的二进制数组来进行回溯。
当然,还有一些外排序算法,通过交换区和虚拟内存技术,可以减少内存空间。
渐进表达式:
longN以什么为底,无关紧要
![](http://img.blog.csdn.net/20150628234219952?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3Jhenl3YXN0ZXI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](http://img.blog.csdn.net/20150628234248463?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3Jhenl3YXN0ZXI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](http://img.blog.csdn.net/20150628234332020?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3Jhenl3YXN0ZXI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
若有两段算法,复杂度分别是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)
例子:如何在书架子存储图书(给你书和图书,如何摆放)
- 存
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
输入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=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===========================
数据结构
- 逻辑结构,如线性结构,树等
- 物理存储结构,在机器中到底是如何存放的
抽象数据类型(数据对象集,操作集)
算法
一个有限的指令集,产生输出,在有限步骤之后终止,与程序不同,每一个指令必须没有歧义,现实不依赖任何语言
什么是好的算法 - 最快情况复杂度,平均复杂度
- 时间复杂度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)
还有像二路归并排序,需要一个额外的数组,所以额外空间是O(n)
再比如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)
相关文章推荐
- 图示化各种数据结构和算法是怎么实现的
- acm 常用数据结构与算法专题(未分类均放于此)
- Redis数据结构分析
- 数据结构--顺序循环队列和链式队列
- 数据结构——二叉树的遍历
- 【采摘】CSDN谚语
- 数据结构--二进制转化为十进制的实现
- 数据结构算法代码实现——树与二叉树(一)
- 感受数据结构的魅力:记一次查找性能优化
- 感受数据结构的魅力:记一次查找性能优化
- 《数据结构》实验报告
- php 数组与数据结构
- 真正理解红黑树,真正的(Linux内核里大量用到的数据结构,且常被二货问到)
- 真正理解红黑树,真正的(Linux内核里大量用到的数据结构,且常被二货问到)
- POJ 1987 Distance Statistics (树上点分治)
- 数据结构和算法经典100题-第20题
- 几种常见的线性表存储结构
- Java-数据结构与算法-二分查找法
- 数据结构习题之栈和队列
- Java-数据结构与算法-逢3减1-面向对象