zoukankan      html  css  js  c++  java
  • 数据结构笔记2 线性表之顺序表

    什么是线性表?

    线性表(Linear List)是由n(n≥0)个数据元素(结点)a1,a2,…,an组成的有限序列。

    顺序表的特点:       

    1. 容量固定
    2. 访问速度快
    线性表的顺序存储结构在c#中最直接表现形式就是数组。数组是最基础也是存取速度最快的一种集合类型。在托管堆中创建数组时,除了数组元素,数组对象所占用的内存块还包括类型对象指针、同步索引等额外成员!数组虽然有很多优点,但是它无法进行添加和删除,也无法动态的更改集合的大小,如果要动态的改变数组所占用的空间的大小,可以使用c#中的ArrayList。动态数组。
    
    

    线性顺序表的操作:

    插入:
    通常将增加的内容加在顺序表的最后一个,但是如果要求按顺序插入时则应该先查找应该插入的位置
    在将该位置以后的顺序表的所有内容均向后移动,再将需要插入的内容插入相应位置。
    要注意的问题是:
    (1)顺序表中数据区域有MAXLEN个存储单元,所以在插入时先检查顺序表是否已满,在表满的情况下不能再做插入,否则产生溢出错误。
    (2)检验插入位置的有效性,这里 i 的有效范围是:1<=i<=n+1,其中 n 为原表长。
    (3)注意数据的移动方向,必须从原线性表最后一个结点(an)起往后移动。顺序表插入操作需移动表中一半数据元素,其时间复杂度为O(n)。

    删除:
    先查找应该删除内容的位置,在将该位置以后的顺序表的所有内容均向前移动,需要删除的内容就自动被删除了
    请注意以下问题:
    (1)首先要检查删除位置的有效性,删除第i个元素,i的取值为: 1<=i<=n。
    (2)当表空时不能做删除,因表空时 L->last的值为-1,条件(i<1 || i>L->last+1)也包括了对表空的检查。
    (3)删除 ai 之后,该数据则已不存在,如果需要,必须先取出 ai 后,再将其删除。

    优缺点:

    顺序存储的优点:
    

    • 可以随机存取表中任意一个元素;

    • 存储位置可以用公式:B+(i-1)*d 计算;

    • 节约存储空间。

    顺序存储的缺点:

    • 对顺序表作插入、删除时需要通过移动大量的数据元素,影响了运行效率。

    • 线性表预先分配空间时,必须按最大空间分配,存储空间得不到充分的利用。

    • 表的容量难以扩充(对有些高级语言而言)。

    C#中的ArrayList酒是动态地改变数组大小的。ArrayList又成为动态数组,他的存储空间可以被动态的改变,同时还有添加、删除元素的功能。

              以下是模拟ArrayList的部分核心代码实现:

    using System;
    namespace DataStructure
    {
    public class DAPArrayList
    {
    private const int _defaultCapacity = 4; //初始容量
    private object[] _items;//用于存放元素的数组
    private int _size;//指示当前元素个数
    private static readonly object[] emptyArray = new object[0];
    public DAPArrayList()
    {
    _items = emptyArray;
    }
    public DAPArrayList(int capacity)
    {
    if (capacity<0)
    {
    throw  new ArgumentOutOfRangeException("Capacity","为DAPArrayList指定的初始容量不能为负数!");
    }
    _items = new object[capacity];
    }
    public virtual int Add(object value)
    {
    return this._size++;
    }
    public void EnsureCapacity(int min)
    {
    if (this._items.Length _size)
    {
    throw  new ArgumentOutOfRangeException("index","索引超出范围");
    }
    if (this._size == this._items.Length)
    {
    EnsureCapacity(_size+1);
    }
    if (index _size)
    {
    throw new ArgumentOutOfRangeException("index", "索引超出范围");
    }
    this._size--;
    if (index
    /// 裁减空间
    /// 
    public  virtual void TrimToSize()
    {
    Capacity = _size;
    }
    /// 
    /// 元素个数
    /// 
    public virtual int Count
    {
    get
    {
    return _size;
    }
    }
    public virtual  object this[int index]
    {
    get
    {
    if (index < 0 || index >= _size)
    {
    throw new ArgumentOutOfRangeException("index", "索引超出范围");
    }
    return _items[index];
    }
    set
    {
    if (index < 0 || index >= _size)
    {
    throw new ArgumentOutOfRangeException("index", "索引超出范围");
    }
    _items[index] = value;
    }
    }
    public virtual int Capacity
    {
    get
    {
    return _items.Length;
    }
    set
    {
    if (value != _items.Length)
    {
    if (value<_size)
    {
    throw  new ArgumentOutOfRangeException("value","容量太小");
    }
    if (value>0)
    {
    object[] destinationArray = new object[value];
    if (_size > 0)
    {
    Array.Copy(_items, 0, destinationArray,0,_size);
    }
    this._items = destinationArray;
    }
    else
    {
    _items = new object[_defaultCapacity];
    }
    }
    }
    }
    }
    }
  • 相关阅读:
    Linux系统调优方法
    递归(Recursion)算法
    数据结构之链表
    【日常摸鱼】牛客挑战赛2
    【日常摸鱼】牛客挑战赛1
    组合计数学习笔记1
    To-Do List 2
    20199112 2019-2020-2 《网络攻防实践》第 3 周作业
    Flutter上线项目实战——腾讯点播直播下载
    打开旧Flutter项目说:Your Flutter application is created using an older version of the Android embedding
  • 原文地址:https://www.cnblogs.com/dupeng0811/p/1517812.html
Copyright © 2011-2022 走看看