数据结构学习笔记

  • 1.基本概念
    • 1.1 数据
  • 2.数据结构
    • 2.1逻辑结构
      • 2.1.1 集合结构
      • 2.1.2 线性结构
      • 2.1.3 树形结构
      • 2.1.4 图形结构
    • 2.2物理结构(存储结构)
      • 2.2.1 顺序存储结构
      • 2.2.2 链式存储结构
  • 3.数据类型
    • 3.1抽象数据类型
  • 4 算法
    • 4.1算法的特性
      • 4.1.1 输入和输出
      • 4.1.2 有穷性
      • 4.1.3 确定性
      • 4.1.4 可行性
    • 4.2 算法的设计要求
      • 4.2.1 正确性
      • 4.2.2 可读性
      • 4.2.3 健壮性
      • 4.2.4 时间效率高和存储量低
    • 4.3 算法效率的度量方法
      • 4.3.1 事后统计方法
      • 4.3.2 事前分析估算方法
    • 4.4 算法时间复杂度
      • 4.4.1 算法时间复杂度定义
      • 4.4.2 推导大O阶方法
    • 4.5 算法空间复杂度
  • 5.线性表
    • 5.1 线性表的抽象数据类型定义
    • 5.2 线性表的顺序存储结构
      • 5.2.1 顺序存储定义
      • 5.2.2 顺序存储方式
      • 5.2.3 数据长度与线性表长度区别
      • 5.2.4 地址计算方法
    • 5.3 顺序存储结构的插入与删除
      • 5.3.1 插入操作
      • 5.3.2 删除操作
      • 5.3.3 线性表顺序存储结构的优缺点
    • 5.4 线性表的链式存储结构
      • 5.4.1 头指针与头结点

1.基本概念

1.1 数据

数据:是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。

数据元素:是组成数据的、有一定意义的基本单位,在计算机中通常作为整体处理。也被称为记录。例如家禽类数据元素牛、羊、猪等等。

数据项:一个数据元素可以有若干个数据项组成。例如人的数据元素可有眼、耳、鼻子等。数据项是数据不可分割的最小单位

数据对象:是性质相同的数据元素的集合,是数据的子集。

数据结构:是相互之间存在一种或多种特点关系的数据元素的集合

2.数据结构

2.1逻辑结构

逻辑结构:是指数据对象中数据元素之间的相互关系。分为集合结构线性结构树形结构图形结构

2.1.1 集合结构

集合结构:集合结构中的数据元素除了同属一个集合外,他们之间没有其它关系。

2.1.2 线性结构

线性结构:线性结构中的数据元素之间是一对一的关系。

2.1.3 树形结构

树形结构:树形结构中的数据元素之间存在一种一对多的层次关系。

2.1.4 图形结构

图形结构:图形结构的数据元素是多对多的关系。

2.2物理结构(存储结构)

物理结构:是指数据的逻辑结构在计算机中的存储形式。分为顺序存储链式存储

2.2.1 顺序存储结构

顺序存储结构:是把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的。(数组)

2.2.2 链式存储结构

链式存储结构:是把数据元素存放在任意的存储单元里,这组存储单元可以是连续的,也可以是不连续的。可以利用指针存放数据元素地址


3.数据类型

数据类型:是指一组性质相同的值的集合及定义在此集合上的一些操作的总称。可以分为两类:原子类型和结构类型。
原子类型:是不可以再分解的基本类型,包括整形、实型、字符型等。
结构类型:由若干个类型组合而成,是可以再分解的。例如,整型数组是由若干整型数据组成的。

3.1抽象数据类型

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

4 算法

4.1算法的特性

基本特性:输入、输出、有穷性、确定性和可行性。

4.1.1 输入和输出

输入:算法具有零个或多个输入。
输出:算法至少有一个或多个输出。

4.1.2 有穷性

有穷性:指算法在执行有限的步骤之后,自动结束而不会出现无限循环,并且每个步骤在可接受的时间内完成。

4.1.3 确定性

确定性:算法的每一步骤都是具有确定的含义,不会出现二义性。

4.1.4 可行性

可行性:算法的每一步都必须是可行的,也就是说,每一步都能够通过执行有限次数完成。

4.2 算法的设计要求

4.2.1 正确性

正确性:算法的正确性是指算法至少应该具有输入、输出和加工处理无歧义性、能正确反映问题的需求、能够得到问题的正确答案。

  • 算法程序没有语法错误。
  • 算法程序对于合法的输入数据能够产生满足要求的输出结果。
  • 算法程序对于非法的输入数据能够得出满足规格说明的结果。
  • 算法成语对于精心选择的,甚至刁难的测试数据都有满足要求的输出结果。

4.2.2 可读性

可读性:算法设计的另一目的是为了便于阅读、理解和交流。

4.2.3 健壮性

健壮性:当输入数据不合法时,算法也能做出相关处理,而不是产生异常或莫名其妙的结果。

4.2.4 时间效率高和存储量低

4.3 算法效率的度量方法

4.3.1 事后统计方法

事后统计方法(不推荐):这种方法主要是通过设计好的测试程序和数据,利用计算机计时器对不同算法编制的程序的运行时间进行比较,从而确定算法效率的高低。

4.3.2 事前分析估算方法

事前分析估算方法:在计算机程序编制前,依据统计方法对算法进行估算。
算法消耗时间因素

  1. 算法采用的策略、方法。
  2. 编译产生的代码质量。
  3. 问题的输入规模。
  4. 机器执行指令的速度。

4.4 算法时间复杂度

4.4.1 算法时间复杂度定义

定义:在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度,记作:T(n)= O(f(n))它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,乘作算法的渐近时间复杂度,简称为时间复杂度。其中f(n)是问题规模n的某个函数。

4.4.2 推导大O阶方法

用O[ ]来体现算法时间复杂度,例如O[1]叫常数阶、O[n]叫线性阶、O[n²]叫平方阶等。

推导大O阶

  1. 用常数1取代运行时间中的所有加法常数。
  2. 在修改后的运行次数函数中,只保留最高阶项。
  3. 如果最高阶项存在且不是1,则去除与这个项相乘的常数。
    得到的结果就是大O阶。

常用的时间复杂度所耗费时间从小到大依次是

O(1)<O(logn)<O(n)<O(nlogn)<O(n²)<O(2n)<O(n!)<O(nn)

4.5 算法空间复杂度

算法的空间复杂度通过计算算法所需的存储空间实现,算法空间复杂度的计算公式记作:S[n] = O[f[n]],其中,n为问题的规模,f[n]为语句关于n所占存储空间的函数。

5.线性表

线性表:零个或多个数据元素的有限序列。

5.1 线性表的抽象数据类型定义

线性表的抽象数据类型:线性表的数据对象集合为{a1,a2,……,an},每个元素的类型均为DataType。其中,除第一个元素a1外,每一个元素有且只有一个直接前驱元素(换言之就是前面没有数据了,它打头),除了最后一个元素an外,每一个元素有且只有一个直接后继元素。(换言之同上述后面没元素了它是队尾)。数据元素之间的关系是一对一的关系。
常用的基本操作方法(定义函数方法):

  • 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的元素个数。

5.2 线性表的顺序存储结构

5.2.1 顺序存储定义

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

5.2.2 顺序存储方式

把相同数据类型的数据元素依次存放在一定的内存空间,可以用一维数组来实现顺序存储结构。

5.2.3 数据长度与线性表长度区别

数据长度是指存放线性表的存储空间的长度,存储分配后这个量一般是不变的
线性表长度是指线性表中数据元素的个数,随着线性表插入和删除操作的进行,这个量是变化的。
在任意时刻,线性表的长度应该小于等于数组的长度。

5.2.4 地址计算方法

存储器中的每个存储单元都有自己的编号,这个编号称为地址。
假设一个数据占用c个存储单元则第a(i+1)元素位置为LOC(ai+1)=LOC(ai)+c
对于第i个数据元素ai的存储位置可以由a1推算得出:LOC(ai)=LOC(a1)+(i-1)xc

5.3 顺序存储结构的插入与删除

5.3.1 插入操作

插入算法思路

  • 如果插入位置不合理,抛出异常;
  • 如果线性表长度大于等于数组长度,则抛出异常或动态增加容量;
  • 从最后一个元素开始向前遍历到第i个位置,分别将它们都向后移动一个位置;
  • 将要插入元素填入位置i处;
  • 表长加1;

5.3.2 删除操作

删除算法思路

  • 如果删除位置不合理,抛出异常;
  • 取出删除元素;
  • 从删除元素位置开始遍历到最后一个元素位置,分别将它们都向前移动一个位置;
  • 表长减一;

5.3.3 线性表顺序存储结构的优缺点

优点

  • 无需为表示表中元素之间的逻辑关系而增加额外的存储空间
  • 可以快速地存取表中任一位置的元素

缺点

  • 插入和删除操作需要移动大量元素
  • 当线性长度变化较大时,难以确定存储空间的容量
  • 造成存储空间的碎片

5.4 线性表的链式存储结构

为了表示每个数据元素ai与其直接后继数据元素ai+1之间的逻辑关系,对数据元素ai来说,除了存储其本身的信息之外,还需存储一个指示其直接后继的信息(即直接后继的存储位置)。我们把存储数据元素信息的域称为数据域,把存储直接后继位置的域称为指针域。指针域中存储的信息称作指针或链。这两部分信息组成数据元素ai的存储映像昂,称为结点。 n个结点链接成一个链表,即为线性表(a1,a2,…,an)的链式存储结构,因为此链表的每个节点中只包含一个指针域,所以叫做单链表

5.4.1 头指针与头结点

头指针:链表中第一个结点的存储位置叫做头指针。
头结点:单链表的第一个结点前附设一个结点,称为头结点
二者异同

头指针

  • 头指针是指链表指向第一个结点的指针,若链表有头结点,则是指向头结点的指针。
  • 头指针具有标识作用,所以常用头指针冠以链表的名字。
  • 无论链表是否为空,头指针均不为空。头指针是链表的必要元素。

头结点

  • 头结点是为了操作的统一和方便而设立的,放在第一元素的结点之前,其数据域一般无意义(也可存放链表的长度)
  • 有了头结点,对在第一元素结点前插入结点和删除第一结点,其操作与其它结点的操作就统一了。
  • 头结点不一定是链表必须要素。

《数据结构学习笔记》-持续记录相关推荐

  1. 重拾CCNA,学习笔记持续更新ing......(4)

    重拾CCNA,学习笔记持续更新ing......(4) 路由器作用功能的经典解说(笑)(非原创) 假设你的名字叫小不点,你住在一个大院子里,你的邻居有很多小伙伴,在门口传达室还有个看大门的李大爷,李大 ...

  2. 谷粒商城商品规格数据结构学习笔记(SPUSKU)

    谷粒商城商品规格数据结构学习笔记(SPU&SKU) SPU Standard Product Unit (标准产品单位) ,一组具有共同属性的商品集 SKU Stock Keeping Uni ...

  3. 【郝斌老师数据结构学习笔记 day 3】

    目录 前言 一.连续存储数组的算法演示 二.typedef 的用法 总结 前言 数据结构的学习笔记,记录第三天 一.连续存储数组的算法演示 线性结构[把所有的结点用一根直线穿起来] 连续存储[数组] ...

  4. 数据结构学习笔记(王道)

    数据结构学习笔记(王道) PS:本文章部分内容参考自王道考研数据结构笔记 文章目录 数据结构学习笔记(王道) 一.绪论 1.1. 数据结构 1.2. 算法 1.2.1. 算法的基本概念 1.2.2. ...

  5. 【郝斌老师数据结构学习笔记 day 6】

    目录 前言 一.算法 二.几种常见存储结构浅析 三.非循环单链表算法演示合集 总结 前言 数据结构的学习笔记,记录第六天 一.算法 算法: 狭义:算法和数据的存储方式密切相关 广义:算法和数据的存储方 ...

  6. 【郝斌老师数据结构学习笔记 day 7】

    目录 前言 一.栈的定义 二.栈的分类 三.栈的一些算法 四.栈的日常应用 总结 前言 数据结构的学习笔记,记录第七天 一.栈的定义 定义:一种可以实现 "先进后出" 的存储结构 ...

  7. 数据结构学习笔记(3-5):树

    附录:所有blog的链接 数据结构学习笔记(1):基本概念 数据结构学习笔记(2):线性结构 数据结构学习笔记(3-5):树 数据结构学习笔记(6-8):图 数据结构学习笔记(9-10):排序 数据结 ...

  8. Perl 数据结构学习笔记

    Perl 数据结构学习笔记 Perl 脚本常用数据结构的学习总结用于以后自己参考,包括数组.散列.散列的数组.数组的散列.混合结构的使用,参考资料:Perl数据结构,Perl 教程 数组,二维数组(数 ...

  9. 数据结构学习笔记(七):哈希表(Hash Table)

    目录 1 哈希表的含义与结构特点 1.1 哈希(Hash)即无序 1.2 从数组看哈希表的结构特点 2 哈希函数(Hash Function)与哈希冲突(Hash Collision) 2.1 哈希函 ...

最新文章

  1. ModuleNotFoundError: No module named ‘scipy.spatial.transform._rotation_groups‘
  2. LeetCode N-Queens
  3. 印度初创公司开发了下一代区块链网络安全解决方法
  4. 【经验总结】VS2010下建立MFC程序
  5. boost::phoenix::delete和using boost::phoenix::new_相关的测试程序
  6. LeetCode 2000. 反转单词前缀
  7. SonarQube代码质量管理平台C++插件sonar-cxx的安装
  8. Address already in use:JVM_Bind:8080
  9. python压缩文件操作_python处理zip压缩文件 | 学步园
  10. matlab 贝塞尔曲线,matlab实现贝塞尔曲线绘图pdf查看
  11. 如何在java中把两个PDF拼接到一个
  12. 来LAMP兄弟连的日子
  13. IBM Websphere CEI Configuration
  14. 学习Python必备的8本书
  15. 活动回顾|Derek做客Staking Mondays
  16. 管程(Moniter) 并发编程的基本心法
  17. 《操作系统——精髓与设计原理(第八版)》复习题抄录
  18. vue汉字转拼音-pinyin.js
  19. 转义字符的意义何在?
  20. 34. 在排序数组中查找元素的第一个和最后一个位置——二分法的魔鬼细节 小记

热门文章

  1. 小四川#TPP#谭平平越南游记谭之二 国穷民富
  2. Arduino超声波传感器使用
  3. 【MQTT基础篇(五)】发布、订阅和取消订阅
  4. docker-compose up命令
  5. 我是如何学习数据结构与算法的?
  6. mysql行转列简单例子_mysql行转列、列转行示例
  7. 大牛养成指南(1):吃的草够多,你也能成为大牛
  8. 同wifi,手机控制电脑以及智能家具实现代码
  9. 微信小程序上传多张图片
  10. 【shell】test用法