链表强化训练
2022-11-28 打卡
知识点总结
-
磁盘字节和比特的问题
- 文件分配表FAT是管理磁盘空间的一种数据结构,用在以链接方式存储文件的系统中记录磁盘分配和跟踪空白磁盘块。整个磁盘仅设一张FAT表,其结构如下图所示。如果文件块号为2,查找FAT序号为2的内容得知物理块2的后继物理块是5;再查FAT序号为5的内容得知物理块5的后继物理块是7;接着继续查FAT序号为7的内容为“^”,即该文件结束标志,所以该文件由物理块2、5、7组成。
- 假设磁盘物理块大小为1KB,并且FAT序号以4bits为单位向上扩充空间。请计算下列两块磁盘的FAT最少需要占用多大的存储空间?
1)一块540MB的硬盘
2)一块1.2GB的硬盘
1B = 8bit
序号只能是4的倍数。
- 物理块大小1KB,540MB,即540K个分区,计算 2^19 < 540K < 2^20,所以序号是20个bit,且20是4的倍数。每个序号需要20 / 8 = 2.5B的空间存储。
540MB需要540K * 2.5B = 1350KB即1.35M 。
- 1.2GB,即1200K个分区,2^20 < 1200K < 2^21,也就是需要21个bit才能存储,但是序号只能是4个倍数,所以需要24个bit,也就是3B的空间。
1.2GB需要1200K * 3B = 3600KB即3.6M
-
单链表
- 链表由头指针唯一确定,单链表可以用头指针的名字来命名
-
数据元素与数据项
- 线性表:零个或多个数据元素的有限序列
- 数据项:一个数据元素可以由多个数据项组成(例如:人由眼鼻手脚等组成)
- 数据元素是数据的基本单位,通常作为一个整体进行考虑和处理。一个数据元素可由若干个数据项组成,数据项是构成数据元素的不可分割的最小单位。例如,学生记录就是一个数据元素,它由学号、姓名、性别等数据项组成
2022-11-29 打卡
知识点总结
- 广义表的例子
- ① E=()
E是一个空表,其长度为0。 - ② L=(a,b)
L是长度为2的广义表,它的两个元素都是原子,因此它是一个线性表 - ③ A=(x,L)=(x,(a,b))
A是长度为2的广义表,第一个元素是原子x,第二个元素是子表L。 - ④ B=(A,y)=((x,(a,b)),y)
B是长度为2的广义表,第一个元素是子表A,第二个元素是原子y。 - ⑤ C=(A,B)=((x,(a,b)),((x,(a,b)),y))
C的长度为2,两个元素都是子表。 - ⑥ D=(a,D)=(a,(a,(a,(…))))
D的长度为2,第一个元素是原子,第二个元素是D自身,展开后它是一个无限的广义表。
- ① E=()
- 双链表的搜索速度与方差比较
- 如果链表数据是无序的,则单向搜索与双向搜索平均速度相同
- 如果链表是有序的,而要搜索的数据距离最小值(最大值)较近,这种情况下双向搜索平均速度更快。(双向搜索和单项搜索都是一个一个进行搜索,并不是双向搜索一次搜索两个值)
- 因此双向搜索更稳定,方差更小(有序的时候波动比较稳定,所以方差较小)
2022-11-30 打卡
知识点总结
- 什么是跳表?(引用博客外链作为学习使用,如有侵权请联系删除)
- 跳表是可以实现二分查找的有序链表。(跳表实现插入、删除、随机存取的时间复杂度和红黑树几乎相同。O(logn))。
- 跳表的原理
-
现在我们有个场景,想快速找到上图链表中的 10 这个元素,只能从头开始遍历链表,直到找到我们需要找的元素。查找路径:1、3、4、5、7、8、9、10。这样的查找效率很低,平均时间复杂度很高O(n)。那有没有办法提高链表的查找速度呢?如下图所示,我们从链表中每两个元素抽出来,加一级索引,一级索引指向了原始链表,即:通过一级索引 7 的down指针可以找到原始链表的 7 。那现在怎么查找 10 这个元素呢?
-
先在索引找 1、4、7、9,遍历到一级索引的 9 时,发现 9 的后继节点是 13,比 10 大,于是不往后找了,而是通过 9 找到原始链表的 9,然后再往后遍历找到了我们要找的 10,遍历结束。有没有发现,加了一级索引后,查找路径:1、4、7、9、10,查找节点需要遍历的元素相对少了,我们不需要对 10 之前的所有数据都遍历,查找的效率提升了。
-
那如果加二级索引呢?如下图所示,查找路径:1、7、9、10。是不是找 10 的效率更高了?这就是跳表的思想,用“空间换时间”,通过给链表建立索引,提高了查找的效率。
-
以此类推,当有巨大数据量时,跳表的查找速度无疑不是一个巨大的提升
Java 语言强化训练
2022-11-29 打卡
知识点总结
-
NumberList是一个顺序容器,以下代码执行后,NumberList里的元素依次为:
-
List<int> NumberList = new List<int>(){2,4,1,3,5}; for(int i = 0;i<NumberList.Count;++i) { int v = NumberList[i]; if(v%2 = = 0) { NumberList.Remove(v);//删除的是元素,而非下标 } }
-
初始时为
{2,4,1,3,5}
v=NumberList[0]=2; 2是偶数,删除2。{4,1,3,5}
-
v=NumberList[1]=1 1为奇数,NumberList不变。
-
v=NumberList[2]=3 3为奇数,NumberList不变。
-
v=NumberList[3]=5 5为奇数,NumberList不变。
-
最后NumberList中的元素为{4,1,3,5}
-
栈 强化训练
2022-12-01 打卡
知识点总结
-
关于栈的叙述中正确的是:
- 函数调用时,系统通常要用栈保存必要的信息
-
关于栈和堆的区别
- 栈的大小是固定的,堆的大小受限于系统中有效的虚拟内存
- 栈的空间由系统决定何时释放,堆需要自己决定何时去释放
- 堆的使用容易产生碎片,但是用起来最方便
-
关于堆内存和栈内存
- 两个术语虽然只有一字之差,但是所表达的意义还是有差别的,堆内存和栈内存的区别可以用如下的比喻来看出:
- 使用堆内存就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且 自由度 大。
- 使用栈内存就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。
- 操作系统中所说的堆内存和 栈内存 ,在操作上有上述的特点,这里的堆内存实际上指的就是(满足堆内存性质的) 优先队列 的一种数据结构,第1个元素有最高的 优先权 ;栈内存实际上就是满足先进后出的性质的数学或数据结构。
- 栈内存操作系统来分配,堆内存由程序员自己来分配。
- 栈有系统自动分配,只要栈 剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。
-
堆和栈的区别主要有五大点:
1)申请方式不同:栈由系统自动分配,而堆是人为申请开辟的;
2)申请大小不同:栈获得的空间较小,而堆获得的空间较大;
3)申请效率的不同:栈由系统自动分配,速度较快,而堆一般速度比较慢;
4)存储内容的不同:栈在函数调用时,函数调用语句的下一条可执行语句的地址第一个进栈,然后函数各个参数进栈,其中静态变量是不进栈的,而堆中一般是在头部用一个字节存放堆的大小,堆中的具体内容是人为安排的;
5)底层不同,栈是连续的空间,而堆是不连续的空间。
栈自动堆人为,栈小堆大,栈快堆慢,栈连续而堆不连。
2022-12-02 打卡
知识点总结
-
卡特兰数,计算按出栈的先后顺序组成不同的字符串,最多能有多少个
- f(n) =C(2n,n)/(n+1)
-
用俩个栈模拟实现一个队列,如果栈的容量分别是O和P(O>P),那么模拟实现的队列最大容量是多少?
- 答:2P+1个
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XmM6Ghab-1670118894993)(牛客网强化训练.assets/5138660_1563951105758_F85D9B59D712E39D2A727F0F3373E16C.png)]
-
在Windows中,关于栈和堆
-
栈区(stack)由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
-
堆区(heap)一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事。
区别:
-
管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生内存溢出。
-
空间大小:堆内存几乎是没有什么限制。栈一般都是有一定的空间大小。
-
碎片问题:对于堆来讲,频繁的new/delete会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题。
-
分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。
-
分配效率:栈的效率比较高。堆的效率比栈要低得多。
-
增长方向:堆的增长方向是从程序低地址到高地址向上增长,而栈的增长方向刚好相反(实际情况可能不是这样的,与CPU的体系结构有关)
注意:这里的堆和数据结构中的堆没啥关系。
-
2022-12-03 打卡
知识点总结
-
中缀转后缀的技巧->A + (B + C) * D
- 先将中缀表达式加括号:(A + ((B + C) * D));
2. 再把运算符移到括号后面(前缀移到前面):(A ((B C)+ D))+;
3. 把括号去掉:ABC+D+。
同样适用于中缀转前缀
- 先将中缀表达式加括号:(A + ((B + C) * D));
-
堆栈是一种
LIFO
的数据结构- LIFO: Last in First out 后进先出
2022-12-04 打卡
知识点总结
- 栈的链式存储结构:top指针相当于单链表中的头指针,入栈即在链头插入。栈的链式存储简称链栈,没有头结点。top=NULL表示栈为空
- 栈的顺序存储结构:即用一个StackSize大小的数组来存储整个栈,那么下标为0的元素就是栈底元素,用top变量来指示栈顶元素,因为数组的大小为StackSize,所以0<= top <StackSize。当top=0时表示该栈只有一个元素,top=StackSize-1时表示栈满,top=-1时,表示栈为空栈
计算机网络强化训练
2022-11-28 打卡
知识点总结
-
HTTP常见状态码及其原因(引用博客链接用于学习使用,如有侵权联系删除)
200
success 请求成功- 状态详细说明:HTTP 200 表示http请求成功。即正常的成功访问时响应的状态码。
- 常见应用案例:Status Code: 200 OK 表示网站访问正常,服务器工作稳定,这是最常见的一种状态码。
3xx 请求重定向
301
Moved Pemanently 永久跳转- 状态详细说明:HTTP 301 表示被请求的资源已永久移动到新位置,即我们常说的301跳转,并且将来任何对此资源的引用都应该使用本响应返回的URI。如果可能,拥有链接编辑功能的客户端应当自动把请求的地址修改为从服务器反馈回来的地址。
- 常见应用案例:Status Code: 301 Moved Permanently 表示URL发生跳转。通常是旧Url已经不在使用,内容已经移动到了新的Url时发生的。网站改版时通常会使用此状态码。
302
Moved Temporarily 临时跳转- 状态详细说明:HTTP 301 表示被请求的资源已永久移动到新位置,即我们常说的301跳转,并且将来任何对此资源的引用都应该使用本响应返回的URI。如果可能,拥有链接编辑功能的客户端应当自动把请求的地址修改为从服务器反馈回来的地址。
- 常见应用案例:Status Code: 301 Moved Permanently 表示URL发生跳转。通常是旧Url已经不在使用,内容已经移动到了新的Url时发生的。网站改版时通常会使用此状态码。
4xx 客户端请求发生错误
400
Bad Request 客户端请求错误- 状态详细说明:HTTP 400 表示请求包含语法错误。除非进行修改,否则客户端不应该重复提交这个请求。
- 常见应用案例:Status Code: 400 Bad Request 表示客户端发起了一个错误的请求,通常是域名未解析到正确的IP,或解析后,服务器端未绑定此域名导致。
403
Forbidden 客户端操作权限不够或者服务端禁止该IP进行访问- 状态详细说明:HTTP 403 表示服务器已经理解请求,但是拒绝执行它。与401的拒绝响应不同的是,这与身份验证无关,而且这个请求也不应该被重复提交。如果这不是一个HEAD请求,而且服务器希望能够讲清楚为何请求不能被执行,那么就应该在实体内描述拒绝的原因。当然服务器也可以返回一个404响应,假如它不希望让客户端获得任何信息。
- 常见应用案例:Status Code: 403 Forbidden 表示客户端发起了请求,但此请求被服务器端拒绝。通常是由客户端浏览器UA设置不正确,或所在IP不允许访问该服务器。
404
Not Found 客户端页面路径错误,找不到该文件- 状态详细说明:HTTP 404 表示请求失败,请求所希望得到的资源未被在服务器上找到,有可能网址内容根本不存在,或曾经存在,但当前已经被删除。没有信息能够告诉用户这个状况到底是暂时的还是永久的。404这个状态码被广泛应用于当服务器不想揭示到底为何请求被拒绝或者没有其他适合的响应可用的情况下。
5xx 服务端出现问题
500
Internet Server Error 服务端程序内部代码错误- 状态详细说明:HTTP 500 表示服务器端程序错误,导致了它无法完成对请求的处理。
- 常见应用案例:Status Code: 500 Internal Server Error 表示服务器端程序或配置发生致命错误,需要管理员检查服务器程序排除故障。在IIS中,通常配置错误也会触发此状态码。
502
Bad Gateway 服务端网关错误,请求发送到网关时服务器繁忙或者处于关闭状态- 状态详细说明:HTTP 502 表示作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。在webserver+后端脚本语言的环境中(如Nginx + php-fpm),通常由脚本处理语言未启动或宕机引起。
- 常见应用案例:Status Code: 502 Bad Gateway 表示服务器端脚本解释器或代理端,如PHP,ASP,JSP,Python等脚本语言端未启动或无响应,以及反向代理端无响应。需要管理员检查脚本配置,若配置正确,通常重启脚本端可排除故障。
504
Gateway Timeout 服务端请求超时- 状态详细说明:HTTP 504 表示作为网关或者代理工作的服务器尝试执行请求时,未能及时从上游服务器(URI标识出的服务器,例如HTTP、FTP、LDAP)或者辅助服务器(例如DNS)收到响应。注意:某些代理服务器在DNS查询超时时会返回400或者500错误。在webserver+后端脚本语言的环境中(如Nginx + php-fpm),通常由脚本处理语言超时引起。
- 常见应用案例:Status Code: 504 Gateway Timeout 表示服务器的脚本语言端或代理端,如PHP,ASP,JSP,Python等或反向代理端已接受请求,但在设定的时间内未完成响应,即响应超时。通常可调响应超时的时间,和排除程序无限循环的情况。