YC Yc.W home Systems · C++ · AI Infrastructure
Computer Science · Note

数据结构和算法——小甲鱼

Explore all Computer Science notes →

数据结构 是一门研究非数值计算的程序设计问题中的操作对象,以及它们之间的关系和操作等相关问题的学科 分为:逻辑结构、物理结构

逻辑结构: 数据对象中数据元素之间的相互关系。 物理结构: 数据的逻辑结构在计算机中的存储形式。

集合结构,其中的数据元素除了同属于一个集合外,它们之间无关系 线性结构,一对一 树形结构,一对多 图形结构,多对多

顺序存储结构 链式存储结构

算法:(五个特征) 输入,零个或多个输入 输出,一个或多个输出 有穷性,算法在执行有限的步骤之后,自动结束而不会无限循环,并且每一个步骤在可接受的时间内完成 确定性,算法的每一个步骤都具有确定的含义,不会出现二义性;算法在一定条件下,只有一条执行路径,相同的输入只能有唯一的输出结果;算法的每个步骤都应该被精确定义而无歧义。 可行性,算法的每一步都必须是可行的,即,每一步都能通过执行有限次数完成。

算法设计要求: 正确性 可读性 健壮性 时间效率高和存储量低

算法效率的度量方法 事后统计方法 事前分析估算方法,在计算机程序编写前,依据统计方法对算法进行估算 影响因素: 1.算法采用的策略,方案 2.编译产生的代码质量 3.问题的输入规模 4.机器执行指令的速度

算法时间复杂度 定义:在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。 T(n)=O(f(n)) 表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称为时间复杂度。其中f(n)是问题规模n的某个函数。 大O记法 O(1) O(n) O(n^2) 1.用常数1取代运行时间中的所有加法常数。 2.在修改后的运行次数函数中,只保留最高阶项。 3.如果最高阶项存在且不是1,则去除与这个项相乘的常数。 4.得到的最后结果就是大O阶。

  • 常数阶
  • 线性阶
  • 平方阶
  • 对数阶 … O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)

最坏情况与平均情况

空间换时间 算法的空间复杂度 通过计算算法所需的存储空间实现,算法的空间复杂度的计算公式记作: S(n) = O(f(n)),其中,n为问题的规模,f(n)为语句关于n所占存储空间的函数。 用“时间复杂度”来指运行时间的需求 用“空间复杂度”来指空间需求

线性表(List):由零个或多个数据元素组成的有限序列 1.序列,元素之间有序 2.前驱,后继 3.有限 用数学语言定义: 若将线性表记为(a1,….ai-1,ai,ai+1,….,an),则表中ai-1领先于ai,ai领先于ai+1,称ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素

数据类型:指一组性质相同的值的集合及定义在此集合上的一些操作的总称。 抽象:指抽取出事物具有的普遍性的本质。 要求抽出问题的特征而忽略非本质的细节,是对具体事物的一个概括。抽象是一种思考问题的方式,隐藏了繁杂的细节。 抽象数据类型(Abstract Data Type,ADT)是指一个数学模型及定义在该模型上的一组操作。 仅取决于它的一组逻辑特性,而与其在计算机内部如何表示和实现无关。 “抽象”的意义在于数据类型的数学抽象特性。不仅仅指已经定义并实现的数据类型,还可以是计算机编程者在设计软件程序时自己定义的数据类型。 标准格式:

ADT 抽象数据类型名
Data
      数据元素之间逻辑关系的定义
 Operation
      操作
  endADT

线性表的抽象数据类型 ADT 线性表(List)

Data
    线性表的数据对象集合为{a1,a2,...,an},每个元素的类型均为DataType。其中,除第一个元素a1外,每一个元素有且只有一个直接前驱元素,除了最后一个元素an外,每一个元素有且只有一个直接后继元素。数据元素之间的关系是一对一的关系。

Operation
      InitList(*L):初始化操作,建立一个空的线性表L。
      ListEmpty(L):判断线性表是否为空表,若线性表为空,返回true,否则返回false。
      ClearList(*L):将线性表清空。
      GetElem(L,i,*e):将线性表L中的第i个位置元素值返回给e。
      LocateElem(L,e):在线性表L中查找与给定值e相等的元素,如果查找成功,返回该元素在表中序号表示成功;否则返回0表示失败。
      ListInsert(*L,i,e):在线性表L中第i个位置插入新元素e。
      ListDelete(*L,i,*e):删除线性表L中第i个位置元素,并用e返回其值。
      ListLength(L):返回线性表L的元素个数。
endADT

线性表的顺序存储结构,用一段地址连续的存储单元依次存储线性表的数据元素。

#define MAXSIZE 20
typedef int  ElemType;
typedef struct
{
        ElemType data[MAXSIZE];
        int length;  //线性表当前长度
}SqList;

顺序存储结构封装:(三个属性) 1.存储空间的起始位置,数组data,它的存储位置就是线性表存储空间的存储位置。 2.线性表的最大存储容量:数组的长度MaxSize。 (一般不变,动态扩容影响性能) 3.线性表的当前长度:length。

地址计算方法(从1开始) O(1)->随机存储结构 LOC(ai) = LOC(a1) + (i-1)*c

线性表的顺序存储结构优缺点: 1.在存、读数据时,不管是哪个位置,时间复杂度都是O(1)。而在插入或删除时,时间复杂度都是O(n)。 2.适合元素个数比较稳定,不经常插入和删除元素,而更多的操作是存取数据的应用。 优点: a.无须为表示表中元素之间的逻辑关系而增加额外的存储空间。 b.可以快速地存取表中任意位置的元素。 缺点: a.插入和删除操作需要移动大量元素 b.当线性表长度变化较大时,难以确定存储空间的容量 c.容易造成存储空间的“碎片”

线性表链式存储结构定义

  • 存储数据元素信息的域称为数据域
  • 存储直接后继位置的域称为指针域。指针域中存储的信息称为指针或链。

这两部分信息组成数据元素称为存储映像,称为结点(Node) n个结点链接成一个链表,即为线性表(a1,a2,a3,…,an)的链式存储结构。

单链表:链表的每个结点中只包含一个指针域

链表中的第一个节点的存储位置叫做 头指针, 最后一个结点指针为空(NULL) 头指针与头结点的异同 1.头指针是指链表指向第一个结点的指针,若链表有头结点,则是指向头结点的指针。 2.头指针具有标识作用,所以常用头指针冠以链表的名字(指针变量的名字)。 3.无论链表是否为空,头指针均不为空。 4.头指针是链表的必要元素。 头结点: 为了操作的统一和方便而设立的,放在第一个元素的结点之前,其数据域一般无意义(可以存放链表的长度) 有了头结点,对在第一元素结点前插入结点和删除第一结点的操作与其他结点的操作就统一了。

typedef struct Node
{
        ElemType data;        //数据域
        struct Node* Next;   //指针域
}Node;
typedef struct Node* LinkList;

单链表的整表创建 1.头插法 2.尾插法

单链表的整表删除 ……


← Previous C#-Timer重入