数据结构梳理

1.基本数据结构:数组,链表,堆,栈,队列

数组:

arr =【a,b,c】.通过索引可以定位到数组中的元素,比如arr[0],arr[1]就是表示数组中的第一个元素和第二个元素

arr.lenth() 可以立马获取数组的元素长度

查询一个元素为O(1), 插入或删除一个元素为O(n)

链表:

list = [];

list.add(a);list.add(b);list.add(c);

list.size() 也是可以立马获取到链表的长度

list.get(index) 则无法获取指定索引的元素;但是给定元素,可以方便的获取它的前一个或者后一个元素

知道list[N] 可以迅速找到 list[N+1]这是因为在Node[N] 节点,存储了指向Node[N+1]的指针

堆:

在java 堆 主要是说内存模型,将类的实例,方法,变量存于堆中

heap 平时应用也比较少

其实堆也算一种二叉树,插入或删除是O(nlogn), 查找最大值或最小值为O(1)

在处理有优先级的任务时,比较使用

栈:

在java 栈 主要也是说内存模型,存储一个不变的常量

stack 平时应用也比较少

栈也是一种“先进后出”的数据结构,与队列类似,有进栈和出栈,这两个操作都是O(1)的复杂度

队列:

queue 队列有先进先出,后进先出的方式

采用先进先出,可以很方便获取队列第一个元素。应用场景:比如监听消息,生产者有消息就往队列里发,监听者监听到到队列有消息,就按照先进先出从队列里取出元素进行消费。

采用先进后出,可以很方便获取队列最后一个元素,

2.进阶数据结构:有向图,无向图,二叉树,哈希表

图:

在数学《图论》课程中,有有向图和无向图区分

无向图就是几个点相连成线组成的图,在此基础上,线如果是有方向的,则是有向图

一个常见的研究场景是:几个城市,去每个城市不重复的最短路径,用于寻求最优解。

树:

构建的有层次关系的点的结构,

可以分为有根树和无根树,无根树实际上也是一种特殊的无向图。

有根树,有父节点,子节点,叶子节点等概念。

常见的二叉树,是指每个节点最多两个子节点

哈希表:

实际就是我们常说的hash

不同在于我们常说的hash,是指一个对象的hash值,用来作为对象的唯一标识。

这里阐明数据结构,

是指key-value的存储形式,将不同对象计算hash值,放到一个字典(映射)中,key就是hash值,value就是对象。如果就算出的hash一样,则key还是hash值,value 就有多个对象了,以队列方式存储。


版权声明:本文为u014209205原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。