数据结构之线性表

来源:互联网 发布:智睿高清网络电视下载 编辑:程序博客网 时间:2024/06/06 03:14
线性表(Linear List) :是由n(n≧0)个数据元素(结点)a1,a2, …an组成的有限序列。该序列中的所有结点具有相同的数据类型。其中数据元素的个数n称为线性表的长度。
当n=0时,称为空表。 
当n>0时,将非空的线性表记作: (a1,a2,…an)         

a1称为线性表的第一个(首)结点,an称为线性表的最后一个(尾)结点。

 a1,a2,…ai-1都是ai(2≦i≦n)的前驱,其中ai-1是ai的直接前驱;
ai+1,ai+2,…an都是ai(1≦i ≦n-1)的后继,其中ai+1是ai的直接后继。


线性表的数据类型定义:

  ADT List{
                    数据对象:D = { ai | ai∈ElemSet,  i=1,2,…,n, n≧0 }
                     数据关系:R = {<ai-1, ai> | ai-1, ai∈D,  i=2,3,…,n }
                    基本操作:
                    InitList( &L )
                    操作结果:构造一个空的线性表L;

                    ListLength( L )
                    初始条件:线性表L已存在;
                    操作结果:若L为空表,则返回TRUE,否则返回FALSE;
                   ….
                   GetElem( L, i, &e )
                   初始条件:线性表L已存在,1≦i≦ListLength(L);
                    操作结果:用e返回L中第i个数据元素的值;
                    ListInsert ( L, i, &e )
                    初始条件:线性表L已存在,1≦i≦ListLength(L) ;
                    操作结果:在线性表L中的第i个位置插入元素e;
                    …
                  } ADT List


 顺序线性表初始化
 Status Init_SqList( SqList *L ) 
{  L->elem_array=( ElemType * )malloc(MAX_SIZE*sizeof( ElemType ) ) ;
if ( !L -> elem_array ) return  ERROR ; 
else {   L->length= 0 ;    return OK ;  }


算法描述
Status Insert_SqList(Sqlist *L,int i ,ElemType e)
 {   int j ;
if  ( i<0||i>L->length-1)   return  ERROR ;
if  (L->length>=MAX_SIZE)
{    printf(“线性表溢出!\n”);  return  ERROR ;  }
for  ( j=L->length–1; j>=i-1; --j )
L->Elem_array[j+1]=L->Elem_array[j];
/*  i-1位置以后的所有结点后移  */
L->Elem_array[i-1]=e;    /*  在i-1位置插入结点  */
L->length++ ;
return  OK ;  
}


时间复杂度
        在线性表L中的第i个元素之前插入新结点,其时间主要耗费在表中结点的移动操作上,因此,可用结点的移动来估计算法的时间复杂度。
      设在线性表L中的第i个元素之前插入结点的概率为Pi,不失一般性,设各个位置插入是等概率,则Pi=1/(n+1),而插入时移动结点的次数为n-i+1。
总的平均移动次数: Einsert=∑pi*(n-i+1)  (1≦i≦n)
∴ Einsert=n/2 。
    即在顺序表上做插入运算,平均要移动表上一半结点。当表长n较大时,算法的效率相当低。因此算法的平均时间复杂度为O(n)。


时间复杂度分析
    时间主要耗费在数据元素的比较和移动操作上。
首先,在线性表L中查找值为x的结点是否存在;
其次,若值为x的结点存在,且在线性表L中的位置为i ,则在线性表L中删除第i个元素。
    设在线性表L删除数据元素概率为Pi,不失一般性,设各个位置是等概率,则Pi=1/n。
 ◆ 比较的平均次数: Ecompare=∑pi*i     (1≦i≦n)
∴ Ecompare=(n+1)/2 。
 ◆ 删除时平均移动次数:Edelete=∑pi*(n-i)  (1≦i≦n)
∴ Edelete=(n-1)/2 。  平均时间复杂度:Ecompare+Edelete=n ,即为O(n)

0 0