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
---算法
线性结构的基本特征是:在数据元素的非空有限集中,有且仅有一个元素没有前驱,有且仅有一个数据元素没有后继;其他数据元素有且仅有只有一个直接的前驱和后继。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.容易形成存储空间的“碎片”(由于线性表的顺序存储结构申请的内存空间都以连续的,若是由于某些操做(好比删除操做)致使某个部分出现了一小块的不连续内存空间,由于这一小块内存空间过小不可以再次被利用/分配,那么就形成了内存浪费,也就是“碎片”)
顺序表最大的缺点是移动数据元素须要耗费许多时间,影响操做效率。正是由于顺序表的特性,相邻两元素之间的数据存在相邻的关系,使得插入删除的操做麻烦了许多。
而链式存储方法不须要用地址连续的存储单元来实现,从而可使得逻辑相邻的两数据元素在物理上不相邻,但有优势就有缺点,链式存储方法不能进行随机存取。
而链表又有单链表,循环链表,双向链表,静态链表的区别。
待更新。。。。