老狗啃骨头之数据结构-图和散列表
摘要:
图也是典型的非线性数据结构,相较于树,更为复杂。线性表和树在逻辑结构上都是没有回路的,图就不一样了,图任意两个元素,都可以有关系。散列表又被称为哈希表,是一种键值对应的结构。我们最熟悉的身份证,也是这样的,每人给予一个数字编号,来对应这个人,基本是一一对应,通过数字化的编号来定位具体的人,要方便快捷的多得多
图
图也是典型的非线性数据结构,相较于树,更为复杂。
在线性结构中,元素之间是一个接一个的顺序关系;树呢,虽略复杂,但也具有清晰的层次关系。线性表和树在逻辑结构上都是没有回路的,图就不一样了,图任意两个元素,都可以有关系,像网一样,我们看下百度地图上的宝岛台湾:

地图上的这个公路网,盘织交错,错综复杂,每个交织的节点,都是村镇和城市,可以看成元素,在图结构中,我们称其为顶点,连接他们的道路,可以称其为边,这,就是图。当然,地图是一个可以抽象成平面的二维图。当顶点和边之间的关系变得更加复杂,可以形成更为复杂的立体“图结构”,可以想象一下,如下图所示:

可以看出,在分子原子层面,也是图结构的一种形式。
图结构,是真实世界复杂事物关系的数据抽象;在数据结构中,图也因为能够更好的体现具体复杂事物关系,利用图结构则可以实现很多高效又复杂的算法。
在日常生活应用中,图的原理无处不在,在语言学、逻辑学、物理、化学、电讯工程、计算机科学以及数学等各种学科的分支中都扮演着重要的基础角色。
数据结构中的图很重要,图的结构原理,在生活中也很重要!
散列表
散列表又被称为哈希表,是一种键值对应的结构。
我们回想一下当年,课堂上老师点名的场景:

老师拿着名单,坐讲台上喊:张三——到!李四——到!… 同学们在教室的各个角落,听到名字就站起来应答。名单上的名字,就相当于键,就是key,站起来的每个人,就相当于值,就是value,一般没什么意外重名,基本就是一个名字对应一个人,这抽象成数据结构,就是散列表!
现在的实际应用中,我们最熟悉的身份证,也是这样的,每人给予一个数字编号,来对应这个人,基本是一一对应,通过数字化的编号来定位具体的人,要方便快捷的多得多。可以看出,散列表结构虽然理解起来简单,但其重要性不可忽视。
当然,就像身份证号重复带来的困惑和麻烦一样,散列表也可能会出现键冲突的问题,同样会带来数据计算的崩溃,这个在设计应用时,是需要考虑的。
总结
至此,从简单理解的层面,关于几种基本的数据结构,围绕着它们的特征和原理,都过了一遍,有些可能跟咱们原来课本上讲的有点出入,记得一点,考试走课本,理解走自己,咱这一通絮叨,是给予这些概念的回顾,来加深理解的,跑偏的地方,考试的小伙伴千万不要跟偏。语陋言疏,难免错误,不足之处,也可以通过网站留言来帮忙指正。
在实际的编程中,很多编程语言,都根据自身的特点,选择相对最优的方式,集成了自己的数据结构库、类库,我们在使用的时候,只需要去实例化,啪啪啪一顿调用就行了。例如java,各种数组啊链表,各种树啊散列表,根据不同特点,都有着优秀的实现。我们学习数据结构的时候呢,是可以看看源代码偷偷懒,理解了拿来用就行的。但对于学习新手来说,最好还是自己用代码,最基本的代码,自己去实现一下,可能会有更深刻的认识和理解。但无论是什么语言,在特殊的数据使用场景中,尤其是对存储空间、计算效率有着苛刻的要求的时候,普通的数据结构类库可能是无法满足的,这时候就只能摈弃那些现成的东西,根据具体使用需要,自己去实现特定数据结构的设计。事实上,这也是考验数学基础和数据结构理解深度的事情,一般来说程序员,我们能做的,就是好好去学习、去理解数据结构这个东西,至少在应用的时候,在这块儿,不要成为短板。
数据结构是数据结构,算法是算法,没有算法的数据结构,就是干敲砖,没滋没味没灵魂。接下来闲暇的时候,我考虑用java语言,用基本程序,结合算法,来扒一扒这些个数据结构,更为真实的样子。