之前有读过《Java数据结构和算法》,当时简单的写了一些笔记和实现的实例,现对其进行一个系统的整理,以作为分享和备忘。
本篇主要是一些简要的介绍和一些专业词汇的定义:
大体可以分为三类情况:
以上除数组外,都可以被认为是抽象数据结构 ;
这些数据结构后面都会有单独的篇章去进行具体的讲解,现在不用去纠结它们是什么。
1. 是由于面向过程语言在处理大型的复杂问题时的力不从心
2. 程序与现实世界缺乏对应关系(对现实世界建模的无能为力)
3. 程序内部的结构出现了问题
Abstract Data Type ,简称ADT,用于指定逻辑特性而不指定实现细节的数据结构 ,简单来说就是 着重于它做了什么,而忽略它是怎么做的。
例如,栈和队列都是属于ADT,用数组或者链表都可以实现栈和队列,拿栈来说,它的精髓在于后进先出,在于push,pop,以及如何使用它,而不是它的内在实现,用数组还是链表实现关键就在于,能否精确的预测栈或队列需要容纳的数据量,以及增删改查的时间复杂度(效率)的差别。
定义:如果一个问题的规模是n,解这一问题的某一算法所需要的时间为T(n),它是n的某一函数。T(n)称为这一算法的“时间复杂度”。
这个定义来自百度百科,感觉并不容易看懂,不过并不重要,下面举几个例子就好了:
1. 交换i,j的时间复杂度是 O(1)
2. 单层for循环的时间复杂度是O(n)
3. 双重for循环的时间复杂度是O(n^2)
后面讲到其他数据结构和算法还会多次提及这个感念,例如下一篇的数组,线性查找(fori)的时间复杂度是O(n),而有序数组的二分查找的时间复杂度是O(logN)。