数据结构和算法本质的思考

  最近在学习数据结构和算法,作为一个非科班生,真的挺难的。但是为什么要学习?这里就是所谓“道”和“术”的问题了。做了快3年Android开发,实现一个业务,完全不需要你了解数据结构和算法,但是Android更新换代如此之快,其本质只是“术”的不断丰富,帮助开发人员能够快速高效写APP。我觉得一味追求这种新的“术”,不如反过来逐“道”,而数据结构和算法即是“道”。

  数据结构为了解决什么问题?

    一个共识:所有计算机程序的最终目的是对数据进行“CRUD”,而CRUD需要通过“查找”“删除”和“插入”3个操作来完成。

    一个本质:世界纷繁复杂,如何将世界中的各种数据存储在内存中,并且方便“查找”“删除”和“插入”,就是数据结构的本质。

  计算机内存是什么?

    计算机存储的最小单位是一个字节(8个bit),而计算机内存就是一个连续的字节数组。

  怎么在连续的字节数组里存储数据---两个存储方案?

    一个最直观的方案,就是连续存储,这就引出了一个数据结构---数组

    数组特点:数组的存储对内存要求严格,需要连续的内存空间来存储,这样就很容易造成内存的碎片化。虽然数组对于“查找”而言,时间复杂度为O(1),但对于“删除”和“插入”并不友好,时间复杂度为O(n)。

    数组有其劣势,比如不能利用碎片内存,不能够快速的实现“插入”“删除”,从而引出不连续存储方案----链表

    链表特点:链表中每个元素,包含本身的值和下一个元素的地址。这样可以通过不连续存储放置数据。对于“删除”和“插入”都是O(1)的操作,但是牺牲了“查找”的性能。同时指针还会占用一部分空间,内存消耗相对大了一点

    到这里,可以毫不夸张的说,计算机数据存储就这两种方案。

  两种存储方案,怎么存储现实世界中的所有数据?

    现实世界中的数据关系大致可简化为三大类:线性结构,树结构和图结构

    第一步,做数据抽象,留下数据的两个属性:数据的值和数据之间的关系,形成一个数据结构图

    第二步,将这个结构图,映射到物理内存中。类似二叉树,可以选用链表或者数组存储。

    所以我们可以说,任何一种数据结构一定是从数组或者链表扩展而来的。

  单链表的进化?(举例说明不同数据结构是如何发展而来的)

    任何一种数据结构的产生,一定是其对“插入”“查找”“删除”的特殊要求做的改进。

    链表从结构上看,每个元素都保存了一个值和下一个元素的地址;支持操作,初始化,获取长度,插入,删除和查找,逆序等

    如果为了方便的查找一个元素的上一个元素,引入了双向链表。

    如果为了能够首尾相接的遍历链表,引入了循环链表。
    如果为了满足先进后出,可以将链表改造为堆栈
    如果为了满足先进先出,可以将链表改造为队列

    随着需求的增加,我们可以从一个链表演化出不同的数据结构,但是其本质都是一个链表。

    这就是真正的道。

  算法本质是什么?
    算法是基于某种数据结构,快速高效的实现数据操作的方法。也就说,数据结构是算法的前提,解决一个问题必须先使用恰当的数据结构来对问题进行转化,再在此基础上,使用算法进行求解,才能够事半功倍。

猜你喜欢

转载自www.cnblogs.com/xiao-shan/p/10366771.html
今日推荐