对数据结构的一些理解

对数据结构的理解

​ 在大四的下学期我花了接近半年的时间去刷算法题,这个过程非常痛苦,很多时候一天也做不了几道题,更可怕的是,做完题之后还会经常性遗忘。现在想想仍然是很痛苦的事情。

​ 在学习一样知识时,仅仅学会是什么是远远不够的。第一次接触数据结构时是在课堂上,当时浑水摸鱼的我听的是一头雾水。再往后自己去学习时逐渐明白了数据结构到底是个什么东西,勉强算是知其然,但最重要的一定是知其所以然。比如在学到二叉树的时候,我逐渐明白了二叉树是个什么东西,但是从来没有人告诉我二叉树是用来干嘛的,随手去网上一搜,大家都是告诉你什么是二叉树,它有什么性质。

​ 不断的摸爬滚打中,慢慢明白了二叉树的一些优势(个人的理解):当你通过链表查找某个元素时,必须从头节点挨个遍历整个链表,效率非常低。我们知道二分查找的效率非常高(logn的时间复杂度),如果能通过二分查找那将大大提高查找效率,而通过一棵有序的二叉树我们就能实现这一点。一棵有序的二叉树在理想状况下(左右相对平衡)查找效率非常高,性能将接近二分查找。比如mysql数据库底层就是使用B+树来实现,可以看比二叉树更复杂的树形结构。这些复杂的数据结构需要等对一些简单的数据结构非常了解后再去学习。

同时看到别人的一些理解:

对数据结构的一些理解_第1张图片

有序的二叉树满足:左节点比根节点小,而右节点比根节点大。

当我们通过一棵有序的二叉树查找元素时,过程是这样的:首先与根节点相比,如果比根节点小,那就跟左节点去比较,而右边所有的节点都无需考虑了,直接将查找范围缩小了一半,这就是它性能接近二分查找的原因。同理,如果比根节点大就去跟右节点去比,而无需考虑左子树了。

​ 所以说,知其所以然才能让我们从根本上认识到我们为什么要学这个东西。

Talk is cheap,show me code.

简单记录一下对数据结构的理解:

​ 数据结构就是存储数据的方式。归根结底,计算机中最根本的存储方式就两种:

  • 数组:在计算机内存中地址相邻,是一段连续的内存空间。
    • 优点:随机访问速度快O(1)),只要给出下标就可以直接定位元素
    • 缺点:插入、删除速度慢(平均时间复杂度O(n),如果是在数组末尾则是O(1))。因为插入和删除涉及到对数组其他元素的移动,所以比较耗时。同时,数组在声明后大小不可变,限制了灵活性,而且如果数组较大在内存中将会占用较大的连续内存空间,内存利用率低(例如:声明数组长度10却只占用了4个长度)。
  • 链表:在计算机内存中地址不一定相邻,是一段不相邻的内存空间。
    • 优点:链表是一种动态数据结构,无需指定大小,内存利用率高,更灵活
    • 缺点:访问元素效率低。
    • 时间复杂度:
      对数据结构的一些理解_第2张图片

链表又分为单向链表和双向链表(还有循环链表),最基本一种的就是单向链表。如何实现链表日后再出,先挖坑。
​ 而像java内置的集合:ListSetHashMapTreeMap等等都是通过这些基本数据结构来实现的。

那么无论何种数据结构都是用来存储数据的,为什么要存储数据?当然是要用啊!先存起来,需要的时候再取出来或者修改,不需要的时候就删除。

对于所有的数据结构,我们定义好了数据结构,接下来就应该定义如何操作数据结构,通常一个数据结构都需要什么操作呢?通常有如下基本操作:添加元素、删除元素、修改元素、查找元素。所以在实现某种数据结构时,我们需要对数据结构进行定义,同时要对一些操作方法进行定义。

定义一种数据结构及其操作方法在专业术语叫做ADT(Abstract Data Type),中文译作抽象数据模型。

如何实现一种数据结构?挖坑以后写。

你可能感兴趣的:(数据结构,数据结构)