CM2 线性结构之一:线性表

CM2 线性结构之一:线性表

文章目录

    • CM2 线性结构之一:线性表
      • 数据元素集(D)
      • 逻辑结构(L)
      • 基本操作(O)
      • 相关操作
      • 顺序存储结构
      • 链式存储结构

数据元素集(D)

n个相同类型数据元素的有限序列( a 1 , a 2 , . . . , a n a_1,a_2,...,a_n a1,a2,...,an

逻辑结构(L)

由下标i决定

首元素、尾元素、前驱、后继

算法的设计取决于逻辑结构

基本操作(O)

  • 初始化

    ListInit(L)

  • 销毁

    ListDestory(L)

  • 引用型操作

    ListLength(L), ListGet(L, i), ListLocate(L, elem), ListPrior(L, elem), ListNext(L, elem), ListEmpty(L)

  • 加工型操作

    ListInsert(L, i, elem), ListDelete(L, i), ListClear(L)

相关操作

  • 遍历

    首先判空ListEmpty(L)

    然后找到线性表的第一个元素,依次向后扫描

  • 合并

    • 直接合并

      • 算法描述

        集合La, Lb

        依次从Lb中取第i个元素

        elem = ListGet(Lb, i)

        判断elem是否在LA中存在

        ListLocate(La, elem)

        若不存在,则将elem插入到La

        ListInsert(La, n+1, elem)

      • 算法分析

        基本操作执行次数

        ListGetListInsert与具体存储结构有关,与长度无关

        最好情形: O ( n 2 ) O(n^2) O(n2)

        最坏情形: O ( m n + n 2 ) O(mn+n^2) O(mn+n2)

        优化:选元素少的作为Lb

    • 保序合并

      双指针

      时间复杂度:O(n+m)

顺序存储结构

  • 逻辑上相邻的元素其物理位置也相邻

  • 实现方法

    • 数组表示法
      • 内存空间在编译前确定,称为静态存储
    • 指针表示法
      • malloc
  • 相关操作

    操作 时间复杂度
    void SeqListInit(SeqList &L) O ( 1 ) O(1) O(1)
    int SeqListLength(SeqList &L) O ( 1 ) O(1) O(1)
    ElemType SeqListGet(SeqList &L, int i) O ( 1 ) O(1) O(1)
    int SeqListLocate(SeqList &L, ElemType elem) O ( n ) O(n) O(n)
    ElemType SeqListPrior(SeqList &L, ElemType elem) O ( n ) O(n) O(n)
    ElemType SeqListNext(SeqList &L, ElemType elem) O ( n ) O(n) O(n)
    bool SeqListInsert(SeqList &L, ElemType elem) O ( n ) O(n) O(n)
    bool SeqListDel(SeqList &L, int i) O ( n ) O(n) O(n)
    bool SeqListEmpty(SeqList &L) O ( 1 ) O(1) O(1)
    void SeqListTraverse(SeqList &L) O ( n ) O(n) O(n)
  • 特点

    • 随机存取
    • 元素最大个数需预先确定,不便于扩充
    • 插入和删除效率低

链式存储结构

  • 用一组地址任意的存储单元存放数据元素,结点中含有一个指针域

  • 牺牲空间效率换取时间效率

  • 相关操作

    操作 时间复杂度
    void LinkedListInit(LinkedList L) O ( 1 ) O(1) O(1)
    int LinkedListLength(LinkedList L) O ( n ) O(n) O(n)
    ElemType LinkedListGet(LinkedList L, int i) O ( n ) O(n) O(n)
    int LinkedListLocate(LinkedList L, ElemType elem) O ( n ) O(n) O(n)
    ElemType LinkedListPrior(LinkedList L, LinkedList p) O ( n ) O(n) O(n)
    ElemType LinkedListNext(LinkedList L, LinkedList p) O ( 1 ) O(1) O(1)
    bool LinkedListInsert(LinkedList L, LinkedList p, ElemType elem) O ( n ) O(n) O(n)
    bool LinkedListDel(LinkedList L, ElemType elem, LinkedList p) O ( n ) O(n) O(n)
    void LinkedListCreate(LinkedList L, ElemType a[n]) O ( n ) O(n) O(n)
    bool LinkedListEmpty(LinkedList L) O ( 1 ) O(1) O(1)
    void LinkedListTraverse(LinkedList L) O ( n ) O(n) O(n)
  • 特点

    • 动态结构,不需要预先分配空间
    • 不能随机存取
  • 双向链表

  • 循环链表

若线性表的长度不大,主要操作是查找采用顺序表,则采用顺序表。

L)` | O ( n ) O(n) O(n) |

  • 特点

    • 动态结构,不需要预先分配空间
    • 不能随机存取
  • 双向链表

  • 循环链表

若线性表的长度不大,主要操作是查找采用顺序表,则采用顺序表。

若线性表的长度变化大,主要操作是插入、删除,则采用链表。

你可能感兴趣的:(程序设计与算法基础,链表,数据结构,算法)