数据结构(1)——于数据组织

237 阅读3分钟

此文章出于《数据结构——浙江大学》视频的学习笔记

如何在书架上摆放图书?

通常我们需要考虑图书的体量有多少,这好比给你一堆数据,要如何将数据进行存放,数据体量的大小决定存储方式的选择。

一般,我们有三种解决方案

随意摆放

随意摆放的好处在于可以快速插入,有书进来就直接摆放到书架上。

但此方式的劣势也特别明显,当图书的体量到达一定程度时,查找书将会变得异常艰难,只能一本本翻出来。

时间复杂度为O(n)

对此方案总结:

优势:可对图书实现快速插入

劣势:书的体量达到一定时,查找非常吃力

按字母顺序有序摆放

顾名思义,此方案可以对图书进行一定的顺序,使用二分查找。

二分查找,也称折半查找(Binary Search),折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。时间复杂度为O(log2 n)

此方案比随意摆放方案聪明多了,但劣势也明显。

当书的体量达到一定时,如果要从中间插入一本书,顺序在这本书后面的图书都需要往后挪动一位,以保证图书摆放的有序性,这样的插入方式略显笨拙。

对此方案总结:

优势:可较为快速的查找到需要的图书

劣势:

  1. 插入新的图书时,为保证图书摆放的有序性,需要将新书字母后面的图书都往后挪动一位
  2. 且当图书体量较大时,需要进行多次二分查找才可以定位到图书的具体位置

先将图书分类,再按字母顺序有序摆放

把书架划分成几块区域,每块区域指定摆放某种类别的图书;在每种类别内,按照书名的拼音字母顺序排放

此方案的好处在于,不管在每个类别里进行什么样的操作,总归来说,图书的体量都小了很多,无论查找或者插入都会快速很多。

查找时,先定类别,再二分查找,二分查找的体量会小很多。

插入时,先定类别,二分查找确定位置,移出空位,需要挪动的图书数量也少很多。

但是会产生新的问题:

  1. 空间要如何分配?

每一类别的藏书量是不一样的,如果统一一个标准划分空间,有些类别的图书数量少,会造成空间资源浪费,有些类别的图书数量多,会造成没有空间插入新书。

  1. 类别需要分多细?

要是类别分得粗,需要较多次进行二分查找。要是分得细,类别太多了,找图书的种类都需要更多的时间。

拓展

关于第三种方案引发的问题,我所想到的解决方案是:

  1. 空间分配:初始划分的空间较小,预留较大的空间用于对空间不够的类别进行扩容
  2. 类别划分:原则上划分层级不应超过3层

欢迎讨论,此处仅代表我个人想法,只有思想的碰撞,才能产生智慧火花。

结论

由图书摆放这个问题得出结论:

解决问题方法的效率,是跟数据的组织方式相关的