大学上数据结构课都逃了,后来发现其重要,期间又自己抱起书学了一遍,因为当时懒,自学的成果也不大,如今工作有一年了,也写过几个项目越来越感觉数据结构对个人思想的重要,如今趁裸辞的空窗期,好好恶补下,顺便写个笔记总结下。仅为个人笔记用所以不排版写到哪算哪。
1,数据结构,是相互之间存在一种或多种关系的数据元素的集合
从不同角度讨论,有不同的分类
物理结构:顺序存储结构,链式存储结构
逻辑结构:线性结构,集合结构,树形结构,图形结构
2.数据类型,是指一组性质相同的值得类型的集合以及在此集合上的一些操作
抽象数据类型:是只一个数学模型及定义在该模型上的一组操作(像java的类?)
3.算法,是解决特定问题求解步骤的描述,在计算机中表先为指令的有限序列。并且每条指令表示一个或多个操作
五个特性:输入输出、有穷性、确定性、可行性
好的算法设计应该具有,正确定,可读性,健壮性(例:当输入不合法时,不报莫名奇妙的错误),高效率,低存储量(用最短的是时间办最大的事)
算法效率统计方法:
事后统计法(笨法,外部因素太多,舍弃)
事前分析估算方法:例如:分析执行次数、执行时间
A算法:2n+3 ;B算法:3n+1 哪个快?答:不一定 n的值不同 情况不同
由上引出 函数的渐近增长:给定两个函数F(n)和G(n),如果存在一个整数N,使得对于所有的n>N,F(n)总是比G(n)大,那么我们说F(n)的增长渐近快于G
+1 +3并不影响算法最终变化,忽略常数,最高次项的常数也同理并不重要
最高次项指数大的增长的越快,判断一个算法的效率时,其他项可以忽略,只要关心最高阶项的阶数
基本可以分析出:某个算法随着n越来越大,可能会越来越优于另一算法,这其实就是通过时间复杂度估算算法时间效率
时间复杂度:T(n) = O(f(n)) 随着n的增大T(n)增长越慢的算法为最优算法
简单推到时间复杂度方法:1.用常数1取代所有加法常数。2,在1的基础上保留最高阶数。3,除去最高阶数的乘数 例:常数阶O(1)(只能是1不能是其他数字) 线性阶O(N) 平方阶O(N2) 对数阶 立方阶,指数阶还有其他....
常用的时间复杂度所耗费的时间顺序:O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)
最坏时间复杂度(默认),平均时间复杂度
空间复杂度:S(n) = O(f(n)) f(n)为语句关于n所占存储空间的函数
3.线性表,零个或多个元素的有限序列