今天小编就采用Java语言来进行描述,帮大家好好梳理一下数据结构与算法,在工作和面试中用的上,亦即总结常见的的数据结构,以及在Java中相应的实现方法,务求理论与实践一步总结到位。
常用数据结构
数组
数组是相同数据类型的元素按一定顺序排列的集合,是一块连续的内存空间。数组的优点是:get和set操作时间上都是O(1)的;缺点是:add和remove操作时间上都是O(N)的。
Java中,Array就是数组,此外,ArrayList使用了数组Array作为其实现基础,它和一般的Array相比,最大的好处是,我们在添加元素时不必考虑越界,元素超出数组容量时,它会自动扩张保证容量。
Vector和ArrayList相比,主要差别就在于多了一个线程安全性,但是效率比较低下。如今java.util.concurrent包提供了许多线程安全的集合类(比如LinkedBlockingQueue),所以不必再使用Vector了。
链表
链表是一种非连续、非顺序的结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的,链表由一系列结点组成。链表的优点是:add和remove操作时间上都是O(1)的;缺点是:get和set操作时间上都是O(N)的,而且需要额外的空间存储指向其他数据地址的项。
查找操作对于未排序的数组和链表时间上都是O(N)。
Java中,LinkedList使用链表作为其基础实现。
//以上方法也适用于ArrayList
队列
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端进行删除操作,而在表的后端进行插入操作,亦即所谓的先进先出(FIFO)。
Java中,LinkedList实现了Deque,可以做为双向队列(自然也可以用作单向队列)。另外PriorityQueue实现了带优先级的队列,亦即队列的每一个元素都有优先级,且元素按照优先级排序。
栈
栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。它体现了后进先出(LIFO)的特点。
Java中,Stack实现了这种特性,但是Stack也继承了Vector,所以具有线程安全线和效率低下两个特性,最新的JDK8中,推荐用Deque来实现栈,比如:
集合
集合是指具有某种特定性质的具体的或抽象的对象汇总成的集体,这些对象称为该集合的元素,其主要特性是元素不可重复。
在Java中,HashSet体现了这种数据结构,而HashSet是在MashMap的基础上构建的。LinkedHashSet继承了HashSet,使用HashCode确定在集合中的位置,使用链表的方式确定位置,所以有顺序。TreeSet实现了SortedSet接口,是排好序的集合(在TreeMap基础之上构建),因此查找操作比普通的Hashset要快(log(N));插入操作要慢(log(N)),因为要维护有序。
最后,数据结构和算法是软件开发行业基础课程,也是每一位工程师应该熟练使用和掌握一门专业课。大学校招和大型互联网公司(华为,阿里巴巴,百度,京东,美团,字节跳动等等)招聘中基本要求熟练使用数据结构和算法。数据结构和算法是我们走进大型公司一个阶梯,也是走向高薪必须学习的一条路,而往往很多工程师只对数据结构和算法简单了解甚至没有接触过,与摆在面前的机会失之交臂。
动力节点Java数据结构视频教程,课程学习过后会让你对结构化数据有新的认识,不再盲目的一直垒砖,一个华丽的转身近距离接触身边大牛。目前市面上有C语言版的数据结构和算法,也有C++版的数据结构和算法,那么本课程我们使用java语言来传授数据结构和算法,避免了跨语言学习,更轻松的学习这门课程。