但凡IT江湖侠士,算法与数据结构为必修之课。早有前辈已经明确指出:程序=算法+数据结构 。要想在之后的江湖历练中通关,数据结构必不可少。数据结构与算法相辅相成,亦是阴阳互补之法。
创新互联公司是一家专注网站建设、网络营销策划、重庆小程序开发公司、电子商务建设、网络推广、移动互联开发、研究、服务为一体的技术型公司。公司成立十载以来,已经为成百上千家门帘各业的企业公司提供互联网服务。现在,服务的成百上千家客户与我们一路同行,见证我们的成长;未来,我们一起分享成功的喜悦。
说道数组,几乎每个IT江湖人士都不陌生,甚至过半人还会很自信觉的它很简单。
的确,在菜菜所知道的编程语言中几乎都会有数组的影子。不过它不仅仅是一种基础的数据类型,更是一种基础的数据结构。如果你觉的对数组足够了解,那能不能回答一下:
所谓数组,是相同的元素序列。数组是在程序设计中,为了处理方便,把具有相同类型的若干元素按无序的形式组织起来的一种形式。
正如以上所述,数组在应用上属于数据的容器。不过我还是要补充两点:
有线性结构当然就有非线性结构,比如之后我们要介绍的二叉树,图 等等,这里不再展开~~~
我相信所有人在使用数组的时候都知道数组可以按照下标来访问,例如 array[1] 。作为一种最基础的数据结构是什么使数组具有这样的随机访问方式呢?天性聪慧的你可能已经想到了:内存连续+相同数据类型。
现在我们抽象一下数据在内存上分配的情景。
array[n]=array[0]+size*n
以上是元素地址的运算,其中size为每个元素的大小,如果为int类型数据,那size就为4个字节。其实确切的说,n的本质是一个离首元素的偏移量,所以array[n]就是距离首元素n个偏移量的元素,因此计算array[n]的内存地址只需以上公式。
论证一下,如果下标从1开始计算,那array[n]的内存地址计算公式就会变为:
array[n]=array[0]+size*(n-1)
对比很容易发现,从1开始编号比从0开始编号每次获取内存地址都多了一次 减法运算,也就多了一次cpu指令的运行。这也是数组从0下标开始访问一个原因。
其实还有一种可能性,那就是所有现代编程语言的鼻祖:C语言,它是从0开始计数下标的,所以现在所有衍生出来的后代语言也就延续了这个传统。虽然不符合人类的思想,但是符合计算机的原理。当然也有一些语言可以设置为不从下标0开始计算,这里不再展开,有兴趣的可以去搜索一下。
当然这里有一个技巧:如果你的业务要求并不是数组连续有序的,当在位置k插入元素的时候,只需要把k元素转移到数组末尾,新元素插入到k位置即可。当然仔细沉思一下这种业务场景可能性太小了,数组都可以无序,我直接插入末尾即可,没有必要非得在k位置插入把。~~
当然还有一个特殊场景:如果是多次连续的k位置插入操作,我们完全可以合并为一次“批量插入”操作:把k之后的元素整体移动sum(插入次数)个位置,无需一个个位置移动,把三次操作的时间复杂度合并为一次。
与插入对应的就有删除操作,同理,删除操作数组为了保持连续性,也需要元素的移动。
综上所述,数组在添加和删除元素的场景下劣势比较明显,所以在具体业务场景下应该避免频繁添加和删除的操作。
我们学习的每个数据结构其实都有对应的适合场景,只不过是场景多少的问题,具体什么时候用,需要我们对该数据结构的特性做深入分析。
关于数组的特性,通过以上介绍可以知道大的一个亮点就是按照下标访问,那有没有具体业务映射这种特性呢?
添加关注,查看更精美版本,收获更多精彩
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。