java入门一DAY01------从数据结构开始1


   个人整理笔记

    好了,数据结构这门课程主要是看的严尉敏版本的,这本确实很经典也很精彩。

    第一章 绪论(笔记)

数据元素是数据结构的基本单位。

数据项是数据结构不可分割的最小单位。

数据结构的定义:数据结构是一门对现实问题进行分析,从已知数据和未知数据中建立数学模型,并构建存储结构以及在计算机上操作和实现的一门学科。

    四种基本结构:集合 线性结构 树形结构 图 

数据结构分为:

    逻辑结构:抽象的,数据关系

    存储结构:顺序存储结构,非顺序存储结构

数据的类型

    抽象数据类型:指一个数学模型以及定义在该模型上的操作

    ADT={数据抽象,数据关系,基本操作}

         定义      表示       操作

    ADT主要是 是对数据的抽象模型

    如下

    ADT抽象据类型名{

        数据对象:<数据对象的定义>

        数据关系:<数据关系的定义>

        基本操作:<基本操作的定义>

    }ADT 抽象数据类名

    基本操作名(参数表)

        初始条件:<初始条件描述>

        操作结果:<操作结果描述>

这种数据类型我们实际编程用的比较多

其他的还有 多形数据类型 主要是指其值的成分不确定的数据类型 三元组数据类型。


算法:是对特定的问题求解的一种描述。

    有5个特性:有穷性 确定性 可行性 输入 输出

算法设计要求达到四个:正确性 可读性 健壮性 效率与低存储量

算法效率的度量:    

    事后分析法,有很多计算机可以采用计时的方式度量

    事前分析估算法:这个主要是根据算法的策略,问题规模,实现算法的语言级别越高执行效率越低,编译和机器执行时间来估        计

时间复杂度

    从算法中选取一种对于所研究的问题来说是基本操作的原操作,以该操作的重复执行的次数作为算法的时间度量。

    在乘法运算中:    

        for(i=1;i<=n;++i)

            for(j=1;j<=n;++j){

                c[i][j]=0;

                    for(k=1;k<=n;++k)

                        c[i][j]+=a[i][k]*b[k][j]  //整个算法的执行时间与该基本操作重复执行的次数N(3)成正比     

       }                                            记作 T(n)==O(n[3])

如何估算算法的时间复杂度

    算法==控制结构+原操作

    算法的执行时间==原操作的执行次数 X 原操作的执行时间

    频度:语句的频度指的是该语句重复执行的次数

算法的空间复杂度:算法所需要的存储空间的度量

    若额外空间相对于输入数据量来说是常数,则称此算法为原地工作

    S(n)==O(F(n))


算法

冒泡排序:

    void bubble_sort(int a[],int n)

        //将a中整数序列重新排序自小至大    

        for(i=n-1,chang=TURE,i>=1&&change;--i){

            change=FALSE;

            for(j=0;j

                if(a[j]>a[j+1]){

                    a[j]<-->a[j,i];change=TURE;   

        }

    }

方法二:

        void BubbleSort(DataType a[],int n)

      {                  

        for(i=0;i<=n-1;i++)

            for(j=0;j<=n-i-1;j++)

                if(a[j]>a[j+1])

                    a[j]<--->a[j+1];

       }


逻辑结构+存储结构+操作==数据结构

存储结构:

    顺序存储结构

    链式存储结构

    索引

    散列


    第二章 线性表(笔记)

线性表示N个数据元素的有限序列

特点:第一个只有后继,最后一个只有前驱,前驱,后继

    1.逻辑上相邻的元素在物理上也相邻

    2.随机访问

类型的定义:数组+长度

基本算法--遍历

    顺序访问所有元素:

    for(i=0;i

        visit(L.elem[i]);

    查找元素xx

    for(i=0;i

        if(L.elem[i]==x) break;

       if(i

         找到;

       else

         未找到;

插入算法 ListInsert(&L,i,x)

    1 表不满的情况下才能插入

    2 合理的插入范围:1<=i<=L.lenght+1

    3.步骤

        第i至最后所有元素后移一个元素

        在第i个元素位置插入元素XX

        表长增加1

    4 算法

    bool ListInsert(Sqlist&L,int i,DataType x){

        if(L.length==MASIZE||i<1||i>L.length+1)

        return false;//失败 元素后移

        for(j=L.length-1;j>=1;j--)  //这里j为下标,从L.length-1到i-1

            L.elem[j+1]=L.elem[j];    

        //插入x

        L.elem[i-1]=x;

        //表长增1

        L.length++;

        return true; //插入成功

    }

删除算法 ListDelete(&L,i&x)

1 表非空

2 合理的删除范围 1<=i<=L.length

3 步骤

    取出第i个元素

    第i个元素之后的元素向前移动一个位置

    表长减1

4 算法

    bool ListDelete(Sqlist&L,int t,DataType&x)

   {

    if(L.length==0||i<1||i>L.lenght)

        return false; //失败

    x=L.elem[i-1];

    for(j=i;j

        L.elem[j-1]=L.elem[j];

    L.length--;

    return ture; //删除成功

    }


单链表-----线性表的链式存储结构之一

概念:线性链表,单链表,结点;数据域,指针域;头指针,头结点。

特点:用指针表示数据之间的逻辑关系(逻辑相邻的元素物理位置不一定相邻)

定义类型:数据+指针

    typedef struct LNode{

    DataType data;

    struct LNode*next;

}LNode, *LinkList;

基本形态

1 单链表空

    条件:L->next==0

2 单链表不空

    条件:L->next!==0

基本算法 遍历:

1 顺序访问所有元素

p=L->next;

while(p!==NULL){

    visit(p->data);

    p=p->next;

}

2 查找元素X

LinkList Find(LinkList L,DataType x)

{

    p=L->next;

    while(p!=NULL){

    if(p->data==x) return p; //找到x

    p=p->next;

 }

    return NULL;    //未找到

}

3 查找第i个元素

LinkList Get(LinkList L,int i)

{

    p=L->next;j=1;

    while(p&&j

    p=p->next;j++;

}

    if(p&&j==i)return p;

    else return 0;

}

4 查找第i-1个元素

p=L; j=0;

while (p&&j

    p=p->next;j++;

}

if(p&&j==i-1)return p;

else return 0;


插入算法 ListInsert(&L,i,x)

思路 先查找到i-1个元素

    若找到,在其后插入新结点

bool ListInsert(LinkList &L,int i,DataType x)

{

    //查找第i-1个元素p

    p=L;j=0;

    while(p&&j

        p=p->next;j++;

    }//若找到,在p后插入x

    if(p&&j==i-1){

    s=(LinkList)malloc(sizeof(Node));

    s->data=x;

    s->next=p->next;

    p->next=s;

    return ture;   

}

else

    return false;

}


删除算法 ListDelete(&L,i,&x)

思路 

    先查找第i-1个元素

    若找到且其后存在第i个元素,则用x返回数据,并删除之

//删除算法

if(p&&j==i-1&&p->next){

    s=p->next;

    p->next=s->next;

    x=s->data;

    fress(s);

    return ture;

}

else

    return false;


建立链表的2种方法

思路

    建立空表(头结点)

    一次插入数据结点(每一次插入尾的(a1,a2,a3...an),每次插入头得(an,....a2,a1)).

    1 顺序建表

    2 逆序建表

循环链表

特点:最后一个结点的指针指向头结点

类型定义:同单链表 数据+指针

形态:空表:L-next==L 非空表

与单链表的关系

判断表尾的方法不同:单链表用P==NULL;循环链表用P==L; 其余操作相同

双向循环链表

特点:一个结点包括指向后继next和指向前驱的prior两个指针,两个方向又分别构成循环链表。

最大不同:前驱容易求得 判断表尾的方法与循环链表相同:P==L 插入和删除需要修改两个方向的指针


总结:需要反复插入,删除 采用链表合适;

      需要反复提取,很少插入删除采用顺序合适


---------------------- 拖走FM----期待与您交流! --------

收音机,电台,网上电台,广播,在线广播,网络广播,广播电台,网络电台,在线电台,电台在线收听,广播电台在线收听,网络电台在线收听,在线收听电台,fm收音机,网络收音机,广播下载,在线收音机,收音机软件下载,电台软件下载,网络收音机下载--------------

---------------------- 拖走FM----期待与您交流! --------

你可能感兴趣的:(java入门一DAY01------从数据结构开始1)