数据结构
前言
在数据结构系列文章中讲到了三种基础的数据结构数组、链表、字典。基本也是最常用的三种数据结构。数据结构可以理解为数据的某种组合方式,某种理解方式。事实上,一样的数据,不一样的理解方式,也会带来完全不一样的结果。
在整个系列的文章中,重点是围绕着信息开展的与排序篇构成了姐妹篇。
后语
数组出现的原因
数组的出现直接原因是因为,物理现实,同时也因为知识、技术体系,只可制造有界且有限的存储实体。而数组的快速寻址,正是建立在这些基本的条件上才得以实现的,这里应用了已知获取(整个存储区域中最小存储单元地址均匀分配。实际上在物理上内存区域是可能断开的,但是这个问题是操作系统或者是硬件会解决,在应用程序中可以简单认为,内存是完全连续的)
链表正确使用的方式
链表解决数组的浪费问题,同时解决了数组增、删慢的问题。但也因为只是记录了中间信息导致了需要计算才能得到其他关联元素的信息。事实上一般设计严谨的链表,并不会直接提供,下标寻址这种方法或者方式。一般遇到的情况都是不知道数据总量,但是查询操作都是总量确定的情况下才开展的,这种情况,一般采用先使用链表添加所有元素,最后把链表转换成数组,然后在开展查询等其他操作。
高级语言中数组本质
在实际使用中,基本上都是增、删、查的需求都需要满足,同时还需要满足工程性能(开发速度)的需求, 所以在一般数组都提供这三个方法。实际上一些高级语言中一般使用的数组并不是单纯的数组,而是数组和链表两种数据结构的集合,这种东西数据结构类似于双向列队。如果说链表是把最小存储单元之间“链”起来,那么高级语言中的数组是把数组之间“链”起来。内部实现是由多个数组构成,数组之间的链接使用链表的方式链接,这样会让数组与链表中的元素都不会过多,从而让性能综合最佳。
高级语言中的动态、静态object与字典
在字典设计中发现实际上还是将key映射到了下标才开始的操作,在编程语言中一般,存在两种基本的数据结构,动态与静态object。实质上动态object它就是一个字典,因为它要动态的增加属性,因为属性的数量以及key的不确定,所以只能采用字典这种方式。而静态object实际上是编译时就会计算它的属性对应的下标,在使用时直接通过下标进行寻址。(静态object可以看做一个数组,数组的大小就是属性的数量,其中每一个元素对应每一个属性的地址,这也解释了为什么静态object不可动态添加属性的原因。)
c/c++与其他主流语言的区别
c/c++与其他主流语言最大的区别之一就在于,c/c++使用了大量的静态结构,核心目标追求性能,而静态结构实际上就是已知获取,而已知获取,事实上就是让人进行大量预设。同时因为静态优先的原则,所以导致动态复杂化,也正应为如此,引出了最大问题,内存需要自己管理。而其他语言主要追求综合性能,其中包括计算性能,也包括工程性能,设计时静态和动态进行综合使用。即:c/c++追求,执行高效、逻辑严谨。其他主流语言追求,开发高效、逻辑容错。那么:只有最适用的算法,且也只有最适用的语言。
大数据处理方案与数据库设计
在数据库的设计中,建索引的操作其实就是解决字典中出现的问题。字典在面对超大数据量时也是不适用的,且如果是大量查询,少量增删操作时也是不适用的。如果存储空间够大实际上是可以通过预先分配且设计对应的hashKey,来解决这个问题。当然这种操作也是有牺牲的。
算法和数据结构的关系
算法与数据结构不分家。
信息结论
在信息方面,数组应用了已知获取,链表应用了计算获取,字典应用了假设获取。