大话数据结构 -- 整理归纳(1)

2019-03-08  本文已影响0人  Whyn

第 1 章 数据结构绪论

集合结构

  2. 线性结构:数据元素之间是一对一关系。如下图所示:

线性结构

  3. 树形结构:数据元素之间呈现一对多关系。如下图所示:

树形结构

  4. 图形结构:数据元素是多对多关系。如下图所示:

图形结构

 ☛ 物理结构:是指数据的逻辑结构在计算机中的存储形式,因此也称为 存储结构
数据是数据元素的集合,那么根据物理结构的定义,实际上就是如何把数据元素存储到计算机的存储器中。存储器主要是针对内存而言的,像硬盘,软盘,光盘等外部存储器的数据组织通常用文件结构来描述。
数据的存储结构应正确反映数据元素之间的逻辑关系
数据元素的存储结构形式有两种:顺序存储链式存储
  1. 顺序存储结构:是把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的。如下图所示:

顺序存储结构

  2. 链式存储结构:是把数据元素存放在任意的存储单元里,这组存储单元可以是连续的,也可以是不连续的。如下图所示:

链式存储结构

第 2 章:算法

举个例子,如下代码,请用大 O 推导式求出函数的时间复杂度:

int i,j;
for ( i = 0; i < n; ++i){
    for(j = i; j < n; ++j){
        /*时间复杂度为 O(1) 的程序步骤序列 */
    }
}

分析:对于外循环,其时间复杂度为 O(n);对于内循环环,当 i=0 时,内循环执行了 n 次,当 i=1 时,执行了 n-1 次,······当 i=n-1 时,执行了 1 次。因此内循环总的执行次数为:

n + (n-1) + (n-2) + \cdots + 1 = \frac{n(n+1)}{2} = \frac{n^2}{2} + \frac{n}{2}

根据大 O 阶推导方法,最终上述代码的时间复杂度为 O(n^2)

常见的时间复杂度及其耗时排序

第 3 章:线性表

线性表的顺序存储结构

LOC(a_i) = LOC(a_1) + (i-1)*c

上述推导公式具体内容如下图所示:

通过该公式,就可以随时算出线性表中任意位置的地址,不管是第一个还是最后一个,都是相同的时间。也即对于线性表每个位置的存入或者取出数据,对于计算机来说都是相等的时间,也就是一个常数时间,因此,线性表的存取操作时间性能为 O(1)。我们通常将存取操作具备常数性能(O(1))的存储结构称为 随机存储结构

结点 头结点 -> 头指针 线性表

第 4 章:栈与队列

顺序栈 链栈 Fibonacci

如果我们直接将按上面的公式用代码进行翻译,如下所示:

int fbi(const int n){
    int i;
    int ret;
    int last1 = 0;
    int last2 = 1;
    if (n == 0){
        ret = 0;
    }else if (n == 1){
        ret = 1;
    }else{
        for(i = 2; i <= n; ++i){
            ret = last1 + last2;
            last1 = last2;
            last2 = ret;
        }
    }
    return ret;
}

但是如果我们使用递归方式实现,则会更加简洁:

int fbi(const int n){
    if (n < 2){
        return n == 0 ? 0 : 1;
    }
    return fbi(n-1) + fbi(n-2);
}

使用递归,简洁之余,还更加契合其数学公式的定义。

第 5 章:串

串的链式存储结构

第 6 章:树

非树 线性表 vs 树 二叉树

  ☛ 前序遍历:规则是先访问根结点,然后前序遍历左子树,再前序遍历右子树(总结:根结点 -> 左子树 -> 右子树)。如下图所示,遍历的顺序为:ABDGHCEIF。

前序遍历

  ☛ 中序遍历:从根结点开始(注意并不是先访问根结点),中序遍历根结点的左子树,然后再访问根结点,最后中序遍历右子树(总结:左子树 -> 根结点 -> 右子树)。如下图所示,遍历的顺序为:GDHBAEICF。

中序遍历

  ☛ 后序遍历:从左到右先叶子后结点的方式遍历访问左右子树,最后访问根结点(总结:**从左到右访问叶子结点 -> 根结点)。如下图所示,遍历的顺序为:GHDBIEFCA。

后序遍历

  ☛ 层序遍历:从树的第一层,即根结点开始访问,从上而下逐层遍历,在同一层中,按从左到右的顺序对结点逐个访问(总结:第一层 -> 第二层(从左到右访问结点)-> ··· -> 最后一层(从左到右访问结点)。如下图所示,遍历的顺序为:ABCDEFGHI。

层序遍历

第 7 章:图

  ☛ 无向图(Undirected graphs):若顶点 v_iv_j之间的边没有方向,则称这条边为 无向边(Edge),用无序偶对 (v_i,v_j) 来表示。如果图中任意两个顶点之间的边都是无向边,则称该图为 无向图。下图所示即为无向图:

无向图

由于无向图是无方向的,连接顶点 AD 的边,可以表示成无序对 (A,D),也可以写成 (D,A)
对于上图中的无向图 G_1 来说,G_1 = (V_1,\lbrace E_1\rbrace ),其中顶点集合 V_1 = \lbrace A,B,C,D \rbrace;边集合 E1 = \lbrace (A,B),(B,C),(C,D),(D,A),(A,C) \rbrace

  ☛ 有向图(Directed graphs):若从顶点 v_iv_j 的边有方向,则称这条边为 有向边,也称为 弧(Arc)。用有序偶 <v_i,v_j> 来表示,v_i 称为弧尾(Tail),v_j 称为弧头(Head)。如果图中任意两个顶点之间的边都是有向边,则称该图为 有向图(Directed graphs)。如下图所示即为一个有向图:

有向图

连接到顶点 AD 的有向边就是弧,A 是弧尾,D 是弧头,<A,D> 表示弧,注意不能写成 <D,A>
对于上图的有向图 G_2 来说,G_2 = (V_2,\lbrace E_2 \rbrace),其中顶点集合 V_2 = \lbrace A,B,C,D \rbrace;弧集合 E_2 = \lbrace <A,D>,<B,A>,<C,A>,<B,C> \rbrace

:看清楚了,无向边用小括号 "()" 表示,而有向边则是使用尖括号 "<>" 表示。

  ☛ 简单图:在图中,若不存在顶点到其自身的边,且同一条边不重复出现,则称这样的图为简单图。如下所示的两个图就不属于简单图:

非简单图

  ☛ 完全无向图:在无向图中,如果任意两个顶点之间都存在边,则称该图为 无向完全图。如下图所示即为一个无向完全图:

无向完全图

  ☛ 有向完全图:在有向图中,如果任意两个顶点之间都存在 方向互为相反 的两条弧,则称该图为 有向完全图。如下图所示即为一个有向完全图:

有向完全图
上一篇 下一篇

猜你喜欢

热点阅读