一、初识数据结构

250 阅读3分钟
**关注公众号:EZ大数据(ID:EZ_DATA)。每天进步一点点,感觉很爽!**
  • 为什么要学习数据结构?

在计算机的世界里,数据无处不在。数据结构研究的是数据如何在计算机中进行组织和存储,使得我们可以高效的获取数据或者修改数据。

可能有小伙伴要说了,学这玩意儿有啥用呢,应对面试?针对考试?在现今的程序开发中,各种框架横行,各大博客网站、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趋近于无穷大时的情况,并且低阶项可以忽略。

在算法分析领域,通常考察最坏的情况。

常见时间复杂度:

image-20200903110622424

所消耗的时间从小到大:

image-20200917143600560

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