數據結構和算法 (Algorithm)- 線性結構


title: 數據結構和算法-day2
date: 2018-10-07 19:08:02
tags: 算法
categories: 算法
img: https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1539066969226&di=d0ecf508fdab9370a396a5a6297a0bdb&imgtype=0&src=http%3A%2F%2Fimg.zcool.cn%2Fcommunity%2F0117e2571b8b246ac72538120dd8a4.jpg%401280w_1l_2o_100sh.jpg
---算法

數據結構和算法 (Algorithm)- 線性結構

        線性結構的基本特徵是:在數據元素的非空有限集中,有且僅有一個元素沒有前驅,有且僅有一個數據元素沒有後繼;其他數據元素有且僅有隻有一個直接的前驅和後繼。windows

例如:   *---------------------------------*

線性表

      線性表是由同一類型的數據元素構成的線性結構,特色是:數據元素間呈一種線性關係。線性表是具備相同數據類型的n個數據元素的有限序列,一般記爲:數組

(a1,a2,a3,······,a(i-1),ai,a(i+1),······,an)數據結構

線性表抽象數據類型數據結構和算法

ADT List{

數據對象: D={ai| ai(-ElemSet,i=1,2,...,n,n>=0}

數據關係: R1={i-1,ai>| ai-1,ai(- D,i=2,...,n}

基本操做:
InitList(&L)        //初始化
DestroyList(&L)     //刪除
ListInsert(&L,i,e)  //插入
ListDelete(&L,i,&e) //刪除指定元素

}ADT List

線性表有兩種存儲結構:指針

      ①定長的順序存儲結構——向量型的一維數組結構code

      ②變長的線性表存儲結構——連接式存儲結構,動態數組,順序文件htm

線性表的順序存儲以及運算實現

      衆人皆知的數組,其實就是以順序結構存儲數據的線性表。對象

順序表示例圖:

順序表結構算法:

#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#define MAXSIZE 20          // 順序表的最大存儲容量
typedef int datatype;       // 順序表存儲的數據類型
typedef struct{
    datatype data[MAXSIZE]; //線性表存儲數據
    int Last;               //線性表的長度
}SeqList;
//定義一個順序表 SeqList L;
//定義一個SeqList類型的指針 SeqList *L;
SeqList * init_SeqList(){   //初始化線性表
    SeqList *L;
    L = (SeqList *)malloc(sizeof(SeqList));
    L->Last=0;
    return L;
}
int main(){
    int i;
    SeqList *L = init_SeqList();
    for(i=0;i<10;i++){
        L->data[i]=i;
        L->Last +=1;
    }
    printf("當前順序表的長度爲 %d,順序表的大小爲 %d",L->Last,sizeof(L->data));
}

      順序表應用舉例:有順序表A,B,其元素均按從小到大的升序排列,編寫一個算法將他們合併成一個順序表C,要求C的元素也是從小到大的升序排列。

      算法思路:依次掃描A和B中的元素,比較當前元素的值,將較小值的元素賦給C,直到一個線性表掃描完畢以後將未完的那個順序表中餘下的那部分賦給C,且C的容量須要可以容納A,B兩個線性表相加的長度,算法以下

void merge(SeqList A,SeqList B,SeqList *c){
   int i,j,k;
   i=0;j=0;k=0;
   while(i<=A.last&&j<=B.last){
       if (A.data[i]<B.data[i])
           C->data[k++]=A.data[i++];
       else
           C->data[k++]=B.data[i++];
   while(i<=A.last)
       C->data[k++]=A.data[i++];
   while(i<=B.last)
       C->data[k++]=B.data[i++];
   C->last=k-1;
       
   }
}

順序表的優缺點:

線性表的順序存儲結構,在存、讀取數據時,無論是在哪一個位置,時間複雜度都是O(1)。而在插入或者刪除時,時間複雜度都是O(n)。

這也就是線性表的順序存儲結構比較適合存取數據,不適合常常插入和刪除數據的應用。

優勢:

1.無需爲了表示表中元素之間的邏輯關係而增長額外的存儲空間(相對於鏈式存儲而言)。

2.能夠快速的存取表中任意位置的元素。

缺點:

1.插入和刪除操做須要移動大量的元素。

2.當線性表長度變化較大時,難以肯定存儲空間的容量。

3.容易形成存儲空間的「碎片」(由於線性表的順序存儲結構申請的內存空間都以連續的,若是由於某些操做(好比刪除操做)致使某個部分出現了一小塊的不連續內存空間,由於這一小塊內存空間過小不可以再次被利用/分配,那麼就形成了內存浪費,也就是「碎片」)

參考 http://www.javashuo.com/article/p-sbapejbi-dr.html

線性表的鏈式存儲和運算實現

      順序表最大的缺點是移動數據元素須要耗費許多時間,影響操做效率。正是由於順序表的特性,相鄰兩元素之間的數據存在相鄰的關係,使得插入刪除的操做麻煩了許多。

      而鏈式存儲方法不須要用地址連續的存儲單元來實現,從而可使得邏輯相鄰的兩數據元素在物理上不相鄰,但有優勢就有缺點,鏈式存儲方法不能進行隨機存取。

      而鏈表又有單鏈表,循環鏈表,雙向鏈表,靜態鏈表的區別。

隊列

數組

待更新。。。。

相關文章
相關標籤/搜索