求索数据结构的第一性原理

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

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

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

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

计算机内存是什么?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

这就是真正的道。

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

数据结构

指计算机存储、组织数据的方式。

逻辑结构

指反映数据元素之间的逻辑关系的数据结构,其中的逻辑关系是指数据元素之间的前后件关系,而与他们在计算机中的存储位置无关。

在这里插入图片描述

  • 线性结构:数据结构中的元素存在一对一的相互关系

  • 非线性结构

    • 集合:数据结构中的元素除了”同属于一个集合“的相互关系外,没有其它关系
    • 树形结构:数据结构中的元素存在一对多的相互关系
    • 图形结构:数据结构中的元素存在多对多的相互关系

简单地说,线性结构就是表中各个结点具有线性关系。如果从数据结构的语言来描述,线性结构应该包括如下几点:

1、线性结构是非空集。

2、线性结构有且仅有一个开始结点和一个终端结点。

3、线性结构所有结点都最多只有一个直接前驱结点和一个直接后继结点。

线性表就是典型的线性结构,还有栈、队列和串等都属于线性结构。

简单地说,非线性结构就是表中各个结点之间具有多个对应关系。如果从数据结构的语言来描述,非线性结构应该包括如下几点:

1、非线性结构是非空集。

2、非线性结构的一个结点可能有多个直接前驱结点和多个直接后继结点。

在实际应用中,树结构和图结构等数据结构都属于非线性结构。

物理结构

指数据结构在计算机中的表示(又称映像),它包括数据元素的机内表示和关系的机内表示。由于具体实现的方法有顺序、链接、索引、散列等多种,所以,一种数据结构可表示成一种或多种存储结构。

数据的顺序存储结构的特点是:借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系;非顺序存储的特点是:借助指示元素存储地址的指针表示数据元素之间的逻辑关系。

常用的有:

  • 顺序存储

  • 链式存储

  • 索引存储:分别存放数据元素和元素间关系的存储方式。

    所有的存储结点存放在一个区域。另设置一个索引区域存储结点之间的关系。

    索引是为了加速检索而创建的一种存储结构。它是针对一个表而建立的,是由存放表的数据页面以外的索引页面组成的。每个索引页面中的行都包含逻辑指针,通过该指针可以直接检索到数据,这样就会加速物理数据的检索。例如,假设在student表的ID列上建立了一个索引,则在索引部分就有指向每个学号所对应的学生的存储位置的信息。

  • 哈希存储:亦称“散列存储”,专用于集合结构的一种存储方式。

    数据元素存放在一块连续的存储区域中。数据元素的存放位置是通过一个哈希函数计算而得的。哈希函数将数据元素作为自变量,计算得到的函数值是数据元素的存储地址。

数据类型

和数据结构密切相关的,它是值的集合和定义在这个值集上的一组操作的总称。

高级语言中数据类型分为两类:

  • 原子类型:值不可分解,是什么就是什么。如整型、字符型等。
  • 结构类型:其值是由若干成分按某种结构组成的,因此可分解,并且它的成分可以是原子类型也可以是结构类型。(套娃,有无限的可能)。比如数组,其值是由若干分量组成的,每个分量可以是整数,或者也可以是数组。

🏛 把数据结构想象成骨架,单单有骨架的话数据还是死的,必须再用数据类型这种肉来填充骨架,有骨有肉这样数据才是鲜活的!

关于数据结构的奇思妙想

  • 一个因理解错”数组“概念而在StackOverflow上提出的很蠢的问题!

An array is an ordered collection of data elements of the same type, each constrained by n(n>=1) linear relationships. Arrays can be thought of as an extension of linear tables, a common data structure.

Because arrays generally do not do insert or delete operations, we usually use sequential storage to implement the array, that is, in memory to draw a contiguous space to store the array, the contiguous memory address also happens to be the array element number, this implementation is undoubtedly very practical and very reasonable.

However, from the point of view of the feasibility of data structures, I wanted to try to explore more possibilities.

We know that in the computer architecture of the Von Neumann system, data structures are generally stored in the machine in four ways: Sequential storage, chain storage, index storage, and hash storage. Now, can arrays be implemented using chained storage? And is there any possible practical value to this implementation?

@ Welbog

Array is, strictly speaking, a contiguous block of memory, addressed by a base index and offset indexes. The term “array” almost always refers to that specific implementation rather than an abstract data type with multiple implementations. A list is a more general ordered set and might be a more appropriate term for your situation.

数组是线性表的顺序存储实现,不是一种跟”线性表“那样的抽象数据结构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值