数据结构与算法笔记一
来源:互联网 发布:无法登录mysql服务器 编辑:程序博客网 时间:2024/05/22 10:49
1.写个程序计算 1+2+3 +。。+100,你会怎么写?
很明显是个等差数列
所以直接用 n*(n+1)/2来实现,避免循环,在数据量特别大的时候,效果比较高,有点比较明显。
2.算法时间复杂度
算法的时间复杂度,也就是算法的时间量度,记作:t(n)=0(f(n)). o(1)代表常数阶,o(n)代表线性阶,
o(n^2)代表平方阶。具体推导时间复杂度的方法:
1.用常数1取代运行时间中的所有加法常数。
2.在修改后的运行次数函数中,只保留最高阶项。
3.如果最高阶项存在且不是1,则去除与这个项相乘的常数。
比如一个for循环1-n,复杂度就是o(n),两个for循环嵌套1-n,复杂度就是o(n^2)。两个for循环一个循环1-n,另外一个循环1-m,两个循环嵌套,时间复杂度就是o(n*m)
再比如:
int count=1;
while(count < n)
{
count = count * 2;
}
由于每次count*2以后,就距离n更近了一分,也就是说,有多少个2相乘后大于n,则会退出循环。
由2^x=n,得到x=log2N,所以这个循环的时间复杂度为 o(logn)
再比如:
int i,j ;
for(int i = 0 ; i < n; i ++)
{
for(j = i; j < n; j ++)
{
.//do something
}
}
由于当i=0的时候,内循环执行了n次,当i=1的时候,执行了n-1次,。。。当i=n-1的时候,执行了一次。所以总的执行次数为:
n + (n-1) + (n-2) + .. + 1 = n(n+1)/2 = n^2/2 + n/2,用我们的推导方法,第一条加法常数不予考虑,第二条保留最高阶项,所以保留 n^2/2,第三条去掉最高阶项的常数,所以变成 o(n^2)
再比如一个稍微特殊一点的:
常用时间复杂度举例:
3.算法空间复杂度
算法的空间复杂度通过计算算法所需的存储空间实现,算法空间复杂度的计算公式记作:s(n)=o(f(n)),其中n为问题的规模,f(n)为语句关于n所占存储空间的函数。
当一个算法的空间复杂度为一个常量,即不随被处理数据量n的大小而改变时,可表示为O(1);当一个算法的空间复杂度与以2为底的n的对数成正比时,可表示为0(10g2n);当一个算法的空I司复杂度与n成线性比例关系时,可表示为0(n).若形参为数组,则只需要为它分配一个存储由实参传送来的一个地址指针的空间,即一个机器字长空间;若形参为引用方式,则也只需要为其分配存储一个地址的空间,用它来存储对应实参变量的地址,以便由系统自动引用实参变量。
4.线性表
线性表的优点和缺点:
比如java中 ArrayList就是线性数组实现的线性表,数组进行扩容时,会将老数组中的元素重新拷贝一份到新的数组中,每次数组容量的增长大约是其原容量的1.5倍。这种操作的代价是很高的,因此在实际使用时,我们应该尽量避免数组容量的扩张。当我们可预知要保存的元素的多少时,要在构造ArrayList实例时,就指定其容量,以避免数组扩容的发生。或者根据实际需求,通过调用ensureCapacity方法来手动增加ArrayList实例的容量。
关于ArrayList和Vector区别如下:
- ArrayList在内存不够时默认是扩展50% + 1个,Vector是默认扩展1倍。
- Vector提供indexOf(obj, start)接口,ArrayList没有。
- Vector属于线程安全级别的,但是大多数情况下不使用Vector,因为线程安全需要更大的系统开销。
8.双向链表
直接说循环双向链表,结构图如下:
有了循环双向链表,你可以通过任何一个结点访问他的前驱结点和后继结点,而单链表只能获取后继结点,要想获得前驱结点,需要再次循环。显然,循环双向链表这种场景更方便。
9.栈
①线性栈
栈是限定仅在表尾进行插入和删除操作的线性表。我们把允许插入和删除的一端成为栈顶,另一端
称为栈底,不含任何数据元素的栈为空栈。栈又称为后进先出的线性表,简称LIFO结构。、
我们定义一个top变量来指示栈顶元素在数组中的位置,这top就如同游标,来回移动。进栈或者出栈的时候,top移动。
②链栈
顾名思义,就是链表数据结构实现的栈。
③栈的重要应用
栈的重要应用之一,斐波那契额数列。
栈的重要应用二:
待续
- 数据结构与算法笔记一
- 数据结构与算法笔记一
- 数据结构与算法的笔记(一)
- 数据结构与算法笔记(一)单链表
- 数据结构与算法分析 阅读笔记一
- 算法与数据结构(一)
- 数据结构与算法一
- 数据结构与算法一
- 数据结构与算法学习笔记(一)最大公约数与最小公倍数
- 数据结构笔记-----数据结构与算法
- 数据结构与算法笔记
- 算法与数据结构笔记
- JAVA 数据结构与算法学习笔记一(转载)
- 学习笔记之数据结构与算法(一)
- 数据结构与算法分析 学习笔记(一)
- 《数据结构与算法分析java语言描述》学习笔记一
- 数据结构与算法之线性表(一)(笔记)
- 学习Javascript数据结构与算法系列笔记(一):数组
- 黑马程序员——IO流(二)
- jenkins插件资源
- spring mvc 入门
- 队列的链式存储结构C++实现
- ZooKeeper的部署以及简单使用
- 数据结构与算法笔记一
- 高并发量网站解决方案
- 正则表达式
- java开端(二)——怎么配置环境变量
- VS2013常用快捷方式
- Ant学习
- java+Spring+mybatis 查询sql报错:无效的序列号!
- ******************* fputc---fgetc函数的作用 *******************
- Eclipse下快速打开本地文件插件EasyExplorer