“数据结构”是“程序员”面试亘古不变的话题,很多人为了能拿到一个好的offer煞费心血,刷题提升自己。笔者也有过类似的经历。但是对数据结构的理解仍然是无序状态,为了更好的理解这一古老的话题,特对这一话题进行有序的梳理,以希望自己可以达到更深刻的理解或认识。
为什么程序员相关的岗位都要考察数据结构与算法呢?曾经以为图灵奖获得者Nicklaus Wirth提出过一个著名的公式:算法+数据结构=程序,所以如果想写出好的程序离不开数据结构。
当下很多人会说,我写的python什么的也没有用到这些,不是一样可以工作的好好的?那是因为当下很多底层的都被封装好了,对用户透明了,但是究其根本如果深知数据结构,则可以更好的理解程序。
闲言少叙,书归正传;
下面我们开始聊一下数据结构这一古老的话题。
首先粗略的画了一个导图,可以初步的了解一下,内容未列全,领会精神哈:
首先我们来看下概念:
什么是数据结构
数据结构(data structure)是带有结构特性的数据元素的集合,它研究的是数据的逻辑结构和数据的物理结构以及它们之间的相互关系,并对这种结构定义相适应的运算,设计出相应的算法,并确保经过这些运算以后所得到的新结构仍保持原来的结构类型。
通俗理解
通俗讲,数据结构就是为了解决实际应用而出现的各种数据组织结构或方式。
数据结构划分的根本原因
数据的逻辑结构和物理结构是数据结构的两个密切相关的方面,同一逻辑结构可以对应不同的存储结构。算法的设计取决于数据的逻辑结构,而算法的实现依赖于指定的存储结构。
通俗理解
因为数据组织内部的元素之间关系,或者存储的形式可以对数据结构进行类别划分,这正好也符合面向对象的思想哈
数据的逻辑结构:
指反映数据元素之间的逻辑关系的数据结构,其中的逻辑关系是指数据元素之间的前后间关系,而与他们在计算机中的存储位置无关。逻辑结构导图:
数据的物理结构(存储结构):
数据的逻辑结构在计算机存储空间中的存放形式称为数据的物理结构(也称为存储结构)。一般来说,一种数据结构的逻辑结构根据需要可以表示成多种存储结构,常用的存储结构有顺序存储、链式存储、索引存储和哈希存储等。
逻辑与物理的关系:
数据的逻辑结构和物理结构是数据结构的两个密切相关的方面,同一逻辑结构可以对应不同的存储结构。算法的设计取决于数据的逻辑结构,而算法的实现依赖于指定的存储结构。
常见数据结构:
1.数组(Array)
2.栈(Stack)
3.队列(Queue)
4.链表(Linked List)
5.树(Tree)
6.图(Graph)
7.堆(Heap)
8.散列表(Hash)
以上也是经常被提到的8大数据结构。这些常见的数据结构可以根据数据逻辑关系对应到对应的逻辑分类,也可以根据具体的底层实现方式对应到对应的物理分类或存储分类上。
常见算法的衍生
数据结构研究内容就是如何按一定的逻辑结构,把数据组织起来,并选择适当的存储表示方法把逻辑结构组织好的数据存储到计算机的存储器里。那么如何高效的使用数据?也衍生出来另一个话题“算法”。算法研究的目的是为了更有效的处理数据,提高数据运算效率。数据的运算是定义在数据的逻辑结构上,但运算的具体实现要在存储结构上进行。一般有以下2种常用运算:
(1)查找(搜索) 在数据结构中查找符合指定条件的数据,查找的作用,可能是取出、插入、删除、更新等操作;
(2)排序 在指定数据结构上,对所有元素进行既定顺序进行排列
具体查找算法或排序算法,因为不同的数据结构又衍生出很多具体算法,下图简单列出几条,供理解:
然后算法本身又有一些抽象的思想:如贪婪算法、分治算法、动态规划、回溯算法等等,这些无非是对某一类东西的归纳总结,具体这部分我们后边内容再分步骤梳理总结