数据结构与算法的学习

12.11

昨天12.10通过了实验室的第一次面试,今天开始进行数据结构和算法的学习。资料《大话数据结构》。

这本书的讲解方式很新颖,是把学生带到一个模拟上课的真实情景中来学习。先了解了数据结构的起源,接着正式介绍了一些相关概念。

由这些概念,从而得到数据结构的定义:数据结构是相互之间存在一种或多种特定关系的数据元素的集合。不同的结构从不同的角度,方向来讨论,有不同的分类。

逻辑结构:数据对象中数据元素之间的相互关系,分四种:

1.集合结构,与数学中集合的概念类似,集合中的各个元素都是一样的,不存在优劣。

2.线性结构:元素之间是一对一的关系。

3.树形结构:一对多的层次关系。

4.图形结构:多对多的关系。

逻辑结构是针对具体问题的,为了解决某个问题,选择一个合适的数据结构表示数据元素之间的逻辑关系。

物理结构:数据的逻辑结构在计算机中的存储形式,即如何把数据元素存储到计算机的存储器中。分两种

1.顺序存储结构:把数据存放在地址连续的存储单元里

2.链式存储结构:把数据放在任意的存储单元里,存储单元可以连续,也可以不连续,需要通过指针查找

逻辑结构面向问题,物理结构面向计算机,基本目标是把数据及其逻辑关系存储到计算机的内存中。

抽象数据类型(ADT)

数据类型:指一组性质相同的值的集合及定义在此集合上的一些操作的总称。分为两类:原子类型:不可以再分割的基本类型。结构类型:由若干个类型组合而成,可以继续分解。

抽象数据类型:指一个数学模型及定义在该模型上的一组操作。定义仅仅取决于它的一组逻辑特性,与其在计算机内部如何表示和实现无关。

标准格式如下

12.12

今天看的是第二章算法。

算法定义:什么是算法?算法是解决特定问题求解步骤的描述,在计算机中为指令的有限序列,并且每条指令表示一个或多个操作。

算法特性:有穷性,确定性,可行性,输入输出。

算法设计的要求:正确性,可读性,健壮性,高效率和低储存量等要求。

算法的度量方法:事后统计方法(不科学,不准确),事前分析估算方法。

函数的渐近增长:

算法时间复杂度:

推导大O阶方法:

常见的时间复杂度所耗时间大小排列

12.13线性表

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

当线性表的元素的个数n定义为线性表的长度,n=0时,称为空表。

线性表的抽象数据类型:

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

这里可以得到描述顺序存储结构需要三个属性:

存储空格的起始位置数组data,他的存储位置就是存储空间的存储位置。

线性表的最大存储容量:数组长度MaxSize。

线性表的当前长度:length。

数组长度与线性表长度区别:

数组长度是存放线性表的存储空间的长度,存储分配后这个量一般是不变的。线性表的长度是线性表中元素的个数,这个量是变化的。在任意时刻,线性表的长度小于数组长度。

地址计算方法:

数据元素的序号和存放它的数组下标之间存在对应关系,

由于线性表可能会进行插入和删除操作,所以数组长度要大于线性表长度。

 LOC表示获得存储位置的函数。

对于第i个元素ai的存储位置可以推算出来,得到通项公式。

顺序存储结构的插入和删除

获得元素操作:

插入操作:

代码不难理解,但想要写出来确实不容易。

删除操作:

插入和删除的时间复杂度都是o(n)。

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

线性表的链式存储。

特点:用一组任意的存储单元存储线性表的数据元素,存储单元可以是连续的也可以是不连续的。

把存储数据元素信息的域称为数据域,把存储直接后继位置的域称为指针域。指针域中存储的信息称作指针或链。这两部分信息组合数据元素的存储映像,称为结点。n个结点链接成一个链表,即线性表的链式存储结构。

把链表中第一个节点的存储位置叫做头指针,线性链表的最后一个结点指针为空指针用NULL或者^表示

头结点:头结点的数据域可以不存储任何信息,头结点的指针域指向第一个节点的指针

头结点与头指针的区别

线性表链式存储结构代码描述

1.若为空表,则头结点的指针域为空

这张图很形象的标明了各个概念之间关系。

单链表中,可以用C语言的结构指针来描述

单链表的读取

思路如下:

即从头开始找,直到第i个结点为止

时间复杂度为o(n),核心思想“工作指针后移”。

单链表的插入与删除:

单链表的插入:假设存储元素e的结点为s,要实现结点p,p-nxet和s之间的逻辑关系变化,只要把结点s插入到结点p和p-next之间即可

即把p的后继结点改成s的后继结点,再把结点s变为p的后继结点

单链表表头表尾的操作是相同的

单链表第i个数据插入结点的算法思路:

代码如下:

单链表的删除:设存储元素ai的结点为q,要实现将结点q删除单链表的操作,其实就是将他的前继结点的指针绕过,指向它的后继结点

单链表中第i个数据删除结点的算法思路:

代码

这段代码使用的时插队的方法,始终让新结点在第一的位置,这种算法简称为头插法,也有尾插法

这些代码能看懂,但目前无法自己写出来

  • 14
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
学习数据结构与算法的路径可以根据个人的学习能力和兴趣进行调整,但以下是一种常见的学习路径: 1. 掌握基本的编程知识:在学习数据结构与算法之前,需要具备一定的编程基础。如果你已经有一定的编程经验,可以跳过这一步。 2. 学习基本数据结构:开始学习常见的数据结构,如数组、链表、栈、队列和树等。了解它们的特点、操作和应用场景。 3. 学习基本算法:学习常见的算法,如排序、搜索和递归等。了解它们的思想、实现和时间复杂度。 4. 深入学习高级数据结构:进一步学习高级数据结构,如图、堆、哈希表和红黑树等。了解它们的原理、操作和应用场景。 5. 深入学习高级算法:学习高级算法,如动态规划、贪心算法和回溯算法等。了解它们的思想、实现和应用。 6. 刷题练习:通过刷题来加深对数据结构与算法的理解和应用。可以使用在线刷题平台如LeetCode、HackerRank等。 7. 实际项目应用:将所学的数据结构与算法应用到实际项目中,提高解决问题的能力和代码质量。 8. 持续学习和进阶:数据结构与算法是一个广阔的领域,持续学习和深入研究可以提升自己的技术水平。 记住,学习数据结构与算法需要持续的实践和探索,不断地编写代码并解决实际问题。同时,参考优秀的教材、在线教程和视频课程也是很有帮助的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值