- 为什么要学习数据结构?
在计算机的世界里,数据无处不在。数据结构研究的是数据如何在计算机中进行组织和存储,使得我们可以高效的获取数据或者修改数据。
可能有小伙伴要说了,学这玩意儿有啥用呢,应对面试?针对考试?在现今的程序开发中,各种框架横行,各大博客网站、github开源项目等等途径,已经让我们的开发变的越来越EZ,简直就是一招CV在手,走遍天下都不怕。
在我看来,确实有一定道理,如果只是希望使用现有的工具,搭建一个产品,那么数据结构对你而言,确实作用很小,关键是在于产品的逻辑、模式的设计、交互体验的设计等等。但是如果想成为专家的话,那么数据结构必然不可缺少。
这是为啥子呢?大家可以去Boss直聘,或者拉勾网了解一波。在月薪20k以上的招聘职位中,或者各大厂的岗位JD中,算法与数据结构已经越来越重要,毕竟越大的公司,越需要自己的开发人员有扎实的基础,因为他们开发的是面向下一代的程序和工具。
所以说,学好数据结构将大大提高自己的技术上限,让你在计算机科学的路上走得更远!
- 初步介绍
一、从类别来看,有三大类:
1.线性结构:数组、栈、队列、链表、哈希表...
2.树形结构:二叉树、二分搜索树、AVL、红黑树、Treap、Splay、堆、Trie、线段树、K-D树、并查集、哈夫曼树...
3.图结构:邻接矩阵、邻接表
二、从难易度来看:
1.基础的也是面试中常客的有:数组、栈、队列、链表、二分搜索树、堆。基本上的功能个人觉得需要达到手写的境界。
2.竞赛相关的:线段树、Trie、并查集。
3.较难的也是面试中不会常考的:平衡树(AVL、红黑树)、哈希表等。
在日常工作中,我们需要根据应用的不同,灵活选择最合适的数据结构。
- 语言的选择
在本系列的数据结构笔记中,选择Java8作为主语言,那么有的小伙伴就会问了,我也可以用Python、JS啊,完全没问题。但是呢,脚本语言可以用来学习数据结构的原理,但不适用于考察数据结构的性能。不仅和逻辑相关,还非常依赖于解析器对于不同的写法解析上的不同。
比如,对于python而言,往往pythonic的写法可能比逻辑本身更重要。
arr = []
for i in range(100000):
arr.append(i)
arr = [i for i in range(100000)]
所以对于脚本语言来说,数据结构性能的验证,不仅考察逻辑而且对于逻辑的写法也很重要。
- 大O表示法
大O描述的是算法的运行时间和输入数据之间的关系。
public static int sum(int[] nums){
int sum = 0;
for (int num:nums){
sum += num;
}
return sum;
}
时间复杂度为O(n),其中n为nums中的元素个数,那么意思就是,这个函数的运行时间的多少跟元素个数n成线性关系。
为何叫O(n),因为忽略了常数的影响。大O描述的是一个算法的渐进时间复杂度,当n趋近于无穷大时的情况,并且低阶项可以忽略。
在算法分析领域,通常考察最坏的情况。
常见时间复杂度:

所消耗的时间从小到大:

好了,今天就到这里,后续从数组开始,一点点的搞起吧。