【数据结构】第二章小结

ps:第一次用博客园写,记录第一次

一、数据结构第二章主要为:顺序表和链表的构造及其增删查改的一些基本操作,以及粗略计算它们的时间or空间的复杂度。

1、顺序表:

(1)  特点:逻辑结构上相邻,物理存储上也是相邻的,属于随机存储;

(2)  优点:便于使用下标进行查找,例如:查找某数组的第6项的数据是几;

存储密度为1;

(3)    缺点:由于其物理存储相邻,故无法将空间中零零散散的碎片空间利用起来;

2、链表:

(1)   特点:逻辑结构上相邻,物理存储上不一定相邻的,属于顺序存储;

单链表有头指针指向;

含头结点的空表:L->next=NULL//(头结点的指针域为空)

无头结点的空表:L==NULL//(L为单链表的头指针)

(2)    优点:可以充分利用碎片空间;

可以便于增删--改变指针的指向;

(3)    缺点:存储密度小于1;

需要为指针腾出空间;

3、链表vs顺序表:

(1)在增删工作为主的问题中,主要使用链表,时间复杂度较低;

(2)在查询工作中,且使用下标查询为主的问题中,使用顺序表为好;

(3)时间复杂度:

顺序表:

取值算法:O(1) 、 查找算法:O(n)、增加or删除算法:O(n)

空间复杂度S(n)=O(1)    均没有占用辅助空间;

链表:

取值算法:O(n)、查找算法:O(n)、增加or删除算法:O(n)

空间复杂度S(n)=O(1)    均没有占用辅助空间;

二、做题过程中遇到的其他问题

1、心理上:上个学期c++打题过少,对于使用一些函数,指针类型的代码充满恐惧与抗拒,甚至于数组都有那么一点

2、现实中:书本给的代码不够详细,得自己上网搜代码

3、题目上:【1】new运算符的应用:

(1)、开辟单变量地址空间

指针在初始化时需要动态申请空间 int*a=new int [空间大小] 等同于int*a; a = new int [空间大小],

例如:int *a = new int(5) 作用同上,但是同时将整数赋值为5;

(2)、开辟数组空间

要访问new所开辟的结构体空间,无法直接通过变量名进行,只能通过赋值的指针进行访问。

(3)、C++中使用new的注意事项:

1、、用户是无法主动调用构造函数的,所以需要借助placement new,但是用户可以主动调用析构函数,所以用完这些对象后,调用析构函数,然后用对应分配内存的方法去释放内存。

2、、事实上malloc并不一定比operatornew节省多少时间,用placement new常常是为了考虑性能,所以会配合内存池一起使用。 (ps: 内存池(Memory Pool)是一种内存分配方式。通常我们习惯直接使用new、malloc等API申请分配内存,这样做的缺点在于:由于所申请内存块的大小不定,当频繁使用时会造成大量的内存碎片并进而降低性能。)

补充:malloc的全称是memory allocation,中文叫动态内存分配,用于申请一块连续的指定大小的内存块区域以void*类型返回分配的内存区域地址,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存。

3、、new与malloc、operator new、placement new 的区别:

从本质上来说,malloc(Linux上具体实现可以参考man malloc,glibc通过brk()&mmap()实现)是libc里面实现的一个函数,如果在source code中没有直接或者间接include过stdlib.h,那么gcc就会报出error:‘malloc’ was not declared in this scope。如果生成了目标文件(假定动态链接malloc),如果运行平台上没有libc(Linux平台,手动指定LD_LIBRARY_PATH到一个空目录即可),或者libc中没有malloc函数,那么会在运行时(Run-time)出错。new则不然,是c++的关键字,它本身不是函数。new不依赖于头文件,c++编译器就可以把new编译成目标代码(g++4.6.3会向目标中插入_Znwm这个函数,另外,编译器还会根据参数的类型,插入相应的构造函数)。

在使用上,malloc 和 new 至少有两个不同: new 返回指定类型的指针,并且可以自动计算所需要大小。第一、malloc 函数返回的是 void * 类型。第二、函数的实参为 sizeof(int) ,用于指明一个整型数据需要的大小。

.......

(此后省略,直接放网址,因为发现越查越深入,待以后化成自己知识的时候再写几篇关于这些函数不同的博客)

参考资料来源:https://zhidao.baidu.com/question/393285989.html(new的运算符的作用)

https://baike.baidu.com/item/%E5%86%85%E5%AD%98%E6%B1%A0/8577153?fr=aladdin(内存池)

https://baike.baidu.com/item/malloc%E5%87%BD%E6%95%B0/8582146?fr=aladdin(malloc函数(含有其与new的区别))

https://blog.csdn.net/caimagic/article/details/51493741(operator new与new的区别)

https://blog.csdn.net/songchuwang1868/article/details/81353577(较为简单的解释了一下其区别:new、operator new、::new、placement new)

【2】关于sort函数的应用及其compare函数的机制:

1、、sort的定义:用于C++中,对给定区间所有元素进行排序。头文件是#include <algorithm>

2、、

Sort函数包含在头文件为#include<algorithm>的c++标准库中

Sort函数有三个参数:

(1)第一个是要排序的数组的起始地址。

(2)第二个是结束的地址(最后一位要排序的地址的下一地址)

(3)第三个参数是排序的方法,可以是从大到小也可是从小到大,还可以不写第三个参数,此时默认的排序方法是从小到大排序。

ps:如果要改变排序方法:需要加入一个比较函数compare(),如:

                          bool compare(int a,int b)

                               {

                                 return a>b;

                                }

参考资料:https://baike.baidu.com/item/sort%E5%87%BD%E6%95%B0/11042699?fr=aladdin

https://www.cnblogs.com/argenbarbie/p/5266603.html

三、接下来

当然是好好的打代码,与同学多多交流

原文地址:https://www.cnblogs.com/JeffKing11/p/10541010.html

时间: 2024-10-10 01:44:26

【数据结构】第二章小结的相关文章

数据结构第二章小结

第二章主要学习的是线性表,其中包含了顺序表以及链表,顺序表有两种结构体定义,一种是指针,再申请相应数组空间,一种是直接定义数组,前者数组为堆空间,后者则为栈空间,如果数组长度过大,得考虑空间是否充足问题,因而前者适用性更好: 链表主要为单链表,循环链表,双向链表:主要涉及到删除.查找.插入等操作,在学习链表过程中,主要问题是没能充分理解语句的意思,在插入语句中,类似p=s(p为辅助指针.s为指向新结点的指针)总是理解为这一步就插入成功了,插入应该是通过辅助指针来改变所指向的结点的数据域,这样才是

第二章小结

第二章小结 早听说数据结构要比程序设计要难,我早早就做好了心理准备,可是现实好像比我想象的还要难一些.这个星期基本结束了第二章关于线性表的学习.对于顺序表,上学期接触的比较多学起来还算比较顺利.链表就有一点困难了.书上没有完整的代码段,只是一些算法,不得不说一开始我真的有点蒙圈的感觉.但后面经过了预习以及上网查找资料就开始慢慢接受了单链表. 和顺序表不同,单链表是存储在连续或者不连续的空间里面的.每一个数据都必须跟着一个地址,指向下一个数据.虽然可能空间利用率比不上顺序表,但在插入删除操作时就显

C++ 编程第二章小结

switch()用法的注意事项 1:switch语句中的表达式只能是整形数据,字符型数据和枚举型数据,case后面的产量表达式的类型必须与switch括号后面的类型相匹配 2:各个case(包括default)的出现次序可以任意,每个case在带有break的前提下,case的次序不影响执行结果 循环设计 循环设计的几种分类方法这里介绍几种 1:字符图形类 2:素数判断类 3:逻辑判断类 4:级数逼近类 a:对于图形类的基本循环格式一般是 for(int i = 1; i < 10 ;i ++)

[看书][CSS精粹(第2版)]第二章小结

刚看完CSS精粹的第二章,主要讲了跟文字样式相关的操作方面的东西. 虽然这本书貌似挺遭嫌弃(豆瓣上都没什么人标记),也的确内容有些过时,但我还是觉得有些基础的东西可以学习下,CSS方面比较基础又比较实用的东西. 重点是链接a.列表ul.标题行h和基本元素段落p的文字布局东西. a元素的伪类定义,下划线 列表ul的第一个列表项伪类first-child的定义,列表项的项目符号(符号修改和使用图片),列表项水平显示 标题行h的背景色,下划线,与后续段落之间的大间隔去除 段落p的行高,水平线,缩进,首

汇编语言程序设计第二章小结

一.通用寄存器:AX.BX.CX和DX.(均为16位,可存放2个字节).都可以分为两个独立的8位寄存器.(eg:AH和AL,其中AL为低8位,AH为高8位.) 二.字在寄存器中的存储 1字节(byte)=8bit,1个字=2字节=高位字节+地位字节,分别对应存在高位寄存器和低位寄存器中. 三.汇编指令 注意:在写一条汇编指令或一个寄存器名称时不用区分大小写. 引入:mov和add 溢出问题:AH和AL是两个不相关到的寄存器,当操作AL中有进位时,AL不会向AH进位. (eg: mov ax,00

数据结构第二章总结

    顺序表存储位置是相邻连续的,可以随即访问的一种数据结构,顺序表在使用前必须指定其长度,一旦分配内存,则在使用中不可以动态的更改.所以,其优点是访问数据是比较方便,可以随即访问表中的任何一个数据,缺点是定义的长度不可更改造成存储空间的浪费.      链表是通过指针来描述元素关系的一种数据结构,可以是物理地址不连续的物理空间.其优点是:对于数组,可以动态的改变数据的长度,分配物理空间:缺点是不能随即访问链表元素,必须从表头开始,一步一步搜索元素.      建议:如果一个数组在使用中,查询

信号完整性第二章小结

信号的上升时间通常是从终值的10%~90%的时间 理想方波的频谱幅度以速率1/f下降 如果去掉方波中较高的频率分量,上升时间久会增加 信号的带宽是0.35/(信号的上升时间) 只要减小信号带宽,上升时间就会增加 测量带宽是指具有较好测量精度时,信号的最高频率分量 模型的带宽是指模型的预测值与互连线的实际性能的测量值能很好吻合时候最高正弦波频率分量 互连线的带宽是指信号的性能依然能满足指标时的最高正弦波频率

数据结构第二章

如果存在正常数c和n0使得当N>=n0时,T(N)<=c*f(N),则记为T(N) = O(f(N)).   小于等于 读作:大O 如果存在正常数c 和n0 使得当N>=n0,T(N) >= c*f(N),则记为T(N) = Ω((f(N))  大于等于 读作:omega T(N) = Θ(h(N)) 当且仅当T(N)= O(h(N))且T(N) = Ω(h(N)) 等于 读作:theta 如果T(N)=O(p(N))且T(N) != Θ(h(N)) ,则T(N) = o(p(N)

数据结构第二章实验

1)使用Debug,用E命令和A命令以两种方式将指令写入内存 机器码        汇编指令 b8 20 4e    mov ax,4e20h 05 16 14    add ax,1416h bb 00 20    mov bx,2000h 01 d8         add  ax,bx 89 c3         mov bx,ax 01 d8         add  ax,bx b8 1a 00    mov ax,001ah bb 26 00    mov bx,0026h 00 d