上帝的磨盘转动很慢,可是却磨得很细。 ——毛姆
本文已经收录至个人GitHub,欢迎你们踊跃star 和 issues。
https://github.com/midou-tech...git
相互之间存在一种或多种特定关系的数据元素的集合,我总结一下就是描述数据关系的一种载体。github
数据结构包括逻辑结构和存储结构两个层次的描述。算法
描述数据逻辑关系的一种方式,与数据的存储无关。逻辑结构中数据元素之间的关系主要分为四种:集合结构、线性结构、树结构、图结构。全部的数据结构在逻辑上均可以用这四种中的一种。编程
数据和数据元素逻辑关系的存储对象,也被称为物理结构。一般逻辑结构包含两种,链式存储和顺序存储。顺序存储 数据元素存储在一块连续的内存空间上,例如数组,就是一块连续的空间。链式存储 数据存储不必定在一块连续的内存空间上,例如单链表。数组
是一组值的集合和定义在这个集合上的操做的总称。服务器
由用户定义的表示应用问题的数学模型,以及定义在这个模型上的一组操做的总称,具体包括三部分,数据对象、数据对象上关系的集合以及对数据对象基本操做的集合。微信
抽象数据类型有本身的定义格式:数据结构
ADT 抽象数据对象名 { 数据对象:(数据对象的定义) 数据关系:(数据关系的定义) 基本操做:(基本操做的定义) }
算法 解决一类问题而规定的一个有限长操做序列。并发
算法必须知足几个特性才能称之为算法:高并发
评价算法优劣的主要从如下几个方面考虑:
用算法中的"基本语句" 的执行次数来度量算法的工做量。正常状态下通常用循环或者递归的运行次数。
在某些算法中算法的时间复杂度会根据算法的初始状态决定,这种时候须要计算出算法的最好时间复杂度、最坏时间复杂度和平均时间复杂度。好比常见的排序算法就有最好最坏和平均时间复杂度。
算法在运行过程当中占用的辅助空间大小,被称做该算法的空间复杂度。
时间复杂度和空间复杂度都是用大写的 "O" 表示。对于一个算法,其时间复杂度和空间复杂度每每是相互影响的,当追求一个较好的时间复杂度时, 可能会致使占用较多的存储空间, 便可能会使空间复杂度的性能变差, 反之亦然。不过, 一般状况下, 鉴于运算空间较为充足, 人们都以算法的时间复杂度做为算法优劣的衡址指标。
本身在写算法时必定要能够去留意算法的效率问题,否则你写出来的算法虽然知足可行性、肯定性、健壮性,也会是一个很烂的算法。时间复杂度是咱们平常编程设计考虑最多的。
在学习算法效率的时候通常会把O(3N)≈O(N),N的常数倍都直接约等于O(N)。这也是约等于,不是彻底相等。实际编程设计时特别是在一些效率要求较高的程序设计必定要考虑进去,不能约等于。在高并发的请求下,O(3N)和O(N)是有着天壤之别的。
我在工做中遇到的一个实例,差点背了事故。一个高并发的场景下(qps在5k左右),我写了一个O(3N)的程序,测试时逻辑没问题,结果没问题,没有对该场景进行高并发压测,就上线了。上线以后不到十分钟我收到短信报警,多台机器CPU打满了,内存也在飙升(32C—124G的服务器)。此时的我吓坏了,意识到我刚刚发布了,确定和我发布有关。保证线上优先,立马把刚上线的服务下掉,别影响其余业务正常。下掉个人服务,CPU资源报警解除了。
通过一番review代码,各类测试,最终定位到两个问题。一个是我代码里面有一处内存泄漏致使内存飙升了,还有一处就是时间复杂度的问题。错误的把O(3N)=O(N)的算法上线了。把算法优化为O(N)以后,通过一番压力测试彻底没问题。此次事件对我一个很大的启示是,高并发的场景下,O(3N)≠O(N),必定不能等于。
高并发场景下算法的效率尤其重要,此时时间和空间的平衡关系必定要充分考虑。
概念性的东西通常在实际工做中不会去过多纠结,不少工做好久的同窗彻底不记得这些概念的文字却依然能够轻松愉快的完成相应知识的工做。是的,不拘泥于概念,却熟练运用概念对应的知识是咱们的目的。这样说并非概念不重要,彻底不须要看概念。概念是认识一个事物的开始,他表示一个事物是什么,后面的作什么,为何,都是创建在是什么的基础上的,因此概念必定要理解,而不是背书。
在学校的同窗会养成一种很很差的习惯,就是必须去记这些概念。为何呢?由于考试会考。是的,我在大学的时候也会去记这些概念的文字应付考试。好比下面这些考题就曾经出如今考卷中
抽象数据类型。
不要慌,理解记忆这些概念。既能应付考试,又能很好的理解知识。你须要记住考试好不表明你对知识掌握的好,掌握是指的能把这些知识运用在实际工做和生活应用中。
下一篇文章会写数据结构一种很是重要的数据结构——线性表。记得关注我,精彩内容不错过喔。
微信搜索 龙跃十二 便可订阅,微信更新会早于博客喔。