vlambda博客
学习文章列表

数组,链表,二叉树,这些是为了解决什么问题而出现的呢?

数组,链表,二叉树,这些是为了解决什么问题而出现的呢?

最近开始真正的复习一波数据结构了,然后也更新了一波自己的学习方法,于是觉得奇怪,为什么会有数组这种东西呢?链表呢?二叉树呢?个人觉得凡事东西/概念出现了一定是为了解决什么问题而出现的,就像数据结构的概念的出现其实就是绝对的算力跟不上数据的级别,如果很大很大的数据在很短(可以忽略不计)的时间内被处理,个人认为数据结构这种东西也不会出现。

##扯远了,数组呢?why?数组会出现?

而且据我google的结果,数组的出现其实是为了解决计算机定址问题,但是现在数组已经成为了人们日常使用的数据结构之一了。

##what?数值有什么用呢?

其实数组的用处还是蛮大的,当数据对象存储在数组中时,个别对象通常借由非负整数的索引变量来选取。索引也称为下标,可将数组的值对应到存储对象。

简单来说就是元素标识和计算(矩阵其实也是数组的一种)。

how? 数组是怎么起作用的呢?

数组的主要作用就是方便人们进行计算和标识相关的数据。

算法的时间复杂度:也称算法渐进时间复杂度,其实就是对某种算法的时间增长率的一个表现。

遍历数组的时间复杂度为O(1),而插入的算法时间复杂度为O(n)(每插入一个数移动的数字程序步的时间复杂度的数量级都为N),所以为O(n)。

##why?为什么链表会出现?

链表开发于1955-56,由当时所属于兰德公司(英语:RAND Corporation)的艾伦纽维尔(Allen Newell),克里夫肖(Cliff Shaw)和赫伯特西蒙(Herbert Simon)在他们编写的信息处理语言(IPL)中做为原始数据类型所编写。IPL被作者们用来开发几种早期的人工智能程序,包括逻辑推理机,通用问题解算器和一个计算机象棋程序。-----wiki百科

what? 链表是是什么?(不涉及双向链表,暂时直讲单链表)

相对于数组来说,链表对数据插入和删除的时间复杂度都低了很多,链表插入和删除的时间复杂度都为O(1),因此,在频繁插入和删除的数据中,链表有很大的优势,但是遍历又成了一个比较大的问题,因为链表的遍历,相对较为麻烦,每次遍历链表都是要从头开始,那么遍历链表的时间复杂度为O(N),另外因为多了一个指针,空间上,链表空间复杂度要稍微多一点。因此很难说,链表一定是有某种特定的用处,主要还是分问题情景,诸如要求,时间空间,大小之类的。

##why?二叉树是什么?为什么会出现?

二叉树是一个连通的无环图,并且每一个顶点的度不大于3。有根二叉树还要满足根节点的度不大于2。有了根节点之后,每个顶点定义了唯一的父节点,和最多2个子节点。然而,没有足够的信息来区分左节点和右节点。如果不考虑连通性,允许图中有多个连通分量,这样的结构叫做森林 ----wiki.

但是上面并没有提到二叉树为什么会出现?

##个人观点:二叉树的确是为了解决数组和链表都不太好解决的问题,而被人们发明的一种数据结构。

从数据结构的角度来讲,很大程度上是因为当遇到实际问题中那种既需要多次查找又需要多次更改的数据的时候(比如数据库),这个时候其实数组和链表都是不合适的,当然非要用也可以,但是从时间和空间复杂度上来讲都没有比较好的解决这个问题。

但是根据某大神的说法:其实就是对数组和链表取了一个折中的办法,因为就查找和插入来说,无论是链表还是数组都是O(N)+O(1),但是二叉树呢?O(logn)+O(logn)(这里暂时先 不说最坏的情况,而且最坏的情况也无非是退化为顺序表)

2O(logN)其实是比O(N)数量级要小很多的,所以才会出现这种数据结构。

但是问题还没解决,其实不光是二叉树,N叉树的出现也是为了缓解这样尴尬的局面,但是问题是,这样的局面下N叉树还是二叉树其实意义都是一样的,起码从数量级上是如此的,至于N叉树无非是人们在工程上对不同的问题发现好像N叉树更好用而已。