赞
踩
现在很多大厂面试都会问一些算法题,以至于很多同学急急忙忙搜索各种算法题,各种刷。刷题,没错,必须要多动手刷,熟能生巧。但是,如果你连常见的数据结构,如链表、树以及常见的算法思想,如递归、枚举、动态规划这些都没学过,那么,我不建议你盲目疯狂着去刷题的。而是先去找本数据结构的书学习下必要的基础知识,然后再去刷题,可能不会那么痛苦,并且事半功倍。有这么一句话说“程序=数据结构+算法”,也有人说“如果把编程比作做菜,那么数据结构就好比食材(菜),算法就好比厨艺(做菜的技巧)”。
数据结构在计算机中的表示称为数据的物理结构或存储结构,它是数据元素相互之间存在一种或多种特定关系的集合。
1、线性表,数据元素之间是“一对一”关系,如:顺序表、非顺序表、队列、栈
线性表的存储结构又有两种不同的类型:顺序存储结构和链式存储结构。
顺序存储结构是通过在计算机存储器中的相对位置来表示数据元素之间的逻辑关系,就是在计算机存储的物理位置是依次排列连续的,如我们所常见的数组就是顺序存储的。
链式存储结构是通过存储地址的指针表示数据元素之间的逻辑关系,就是数据元素之间存储的物理存储单元不一定是连续相连的,可能是非顺序、非连续的,数据元素的逻辑顺序是通过链表中的指针链接次序实现的“一条线排列”的关系,如链表。当然,栈和队列既可以是顺序也可以是链式存储结构。
2、树,数据元素之间是“一对多”关系
3、图,数据元素之间是“多对多”关系
算法
**算法(algorithm)**是指操作数据对象来解决程序中问题的方法,它不属于数据结构,而是运用数据结构描述解决问题的策略机制,对于我们程序开发者来说,就是能够对一定规范的输入,在有限时间内计算出所要求的输出。(以上是我自己的一个理解,翻了好多资料也没有找到一个权威统一的定义)
评价一个算法优劣是使用时间复杂度和空间复杂度来衡量。
时间复杂度:是指执行当前算法所消耗的时间,但并不是用于来真实代表算法的执行时间的,它是用来表示代码执行时间的增长变化趋势,我们用T(n)来表示。
算法的渐进时间复杂度:T(n) = O( f(n) ),其中f(n) 表示每行代码执行次数之和,而 O 表示正比例关系
O(F(n))表示法常见的时间复杂度量级有:
上面从上至下依次的时间复杂度越来越大,执行的效率越来越低。在时间复杂度又分为:
最好时间复杂度: 在数据最理想情况下,算法的时间复杂度,上面代码为O(1)
最坏时间复杂度: 在数据最坏情况下,算法时间复杂度,上面代码为O(n)
平均时间复杂度: 数据在上述状况下的概率并不高,为表示平均情况下的时间复杂度,引入了平均时间复杂度的概念
空间复杂度是指执行当前算法需要占用多少内存空间,是对一个算法在运行过程中临时占用存储空间大小的一个量度,同样反映的是一个趋势,我们用 S(n) 来定义。
算法的渐进空间复杂度:S(n) = O( f(n) )
空间复杂度比较常用的有:O(1)、O(n)、O(n²)。
最后,提高数据结构与算法没啥捷径,最好的捷径就是多刷题。但是,刷题的前提是你要先学会一些基本的数据结构与算法思想。下面给个数据结构和算法思维导图:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。