​T​P​一​面​

news2024/12/22 6:26:06

male
20min

1. 请尽可能详细地说明,浏览器盒模型是什么?有哪几种,区别是什么?IE浏览器和现代浏览器默认的盒模型是哪种?你的回答中不要写出示例代码。

盒模型是CSS中一个非常重要的概念,它定义了元素在网页上的布局和尺寸。盒模型包括四个主要部分:内容(Content)、内边距(Padding)、边框(Border)和外边距(Margin)。这些部分共同决定了一个元素在页面上的总宽度和高度。

盒模型的两种模式

  • 标准盒模型(Standard Box Model):在标准盒模型中,元素的widthheight属性仅指内容区域的尺寸。内边距和边框的尺寸是额外增加的。这是W3C制定的规范,也是现代浏览器的默认盒模型。
  • IE盒模型(IE Box Model 或 Quirks Mode Box Model):在IE盒模型中,元素的widthheight属性包括内容、内边距和边框的尺寸。这种模型主要在早期版本的Internet Explorer中使用。

盒模型的计算公式

  • 标准盒模型:总宽度 = 内容宽度 + 左内边距 + 右内边距 + 左边框 + 右边框 + 左外边距 + 右外边距;总高度 = 内容高度 + 上内边距 + 下内边距 + 上边框 + 下边框 + 上外边距 + 下外边距。
  • IE盒模型:总宽度 = 内容宽度 + 左内边距 + 右内边距 + 左边框 + 右边框;总高度 = 内容高度 + 上内边距 + 下内边距 + 上边框 + 下边框。

盒模型的控制

CSS3引入了box-sizing属性,它可以控制盒模型的行为:

  • content-box(默认值):使用标准盒模型。
  • border-box:使用IE盒模型,即元素的总宽度和总高度包括了内边距和边框。

盒模型对布局的影响

盒模型的理解对于正确控制和布局网页非常重要。通过调整元素的宽度、内边距和边框的属性值,可以实现各种不同的布局效果。同时,还可以利用外边距和内边距的特性,控制元素之间的距离和间隔。

浏览器默认的盒模型

  • IE浏览器:默认使用的是IE盒模型(怪异盒模型),即元素的widthheight属性包括内容、内边距和边框的尺寸。
  • 现代浏览器:默认使用的是标准盒模型,即元素的widthheight属性仅指内容区域的尺寸。

通过上述信息,我们可以看出,盒模型是网页布局中不可或缺的基础概念,而理解盒模型的不同类型及其区别,对于实现精确和灵活的网页布局至关重要。

2. 请尽可能详细地说明,有哪些排序算法?请按时间复杂度和空间复杂度进行分类。你的回答中不要写出示例代码。

[](@replace=排序算法是计算机科学中的一个基本问题,用于将一组元素按照特定的顺序进行排列。根据不同的分类标准,排序算法可以分为多种类型。以下是一些常见的排序算法,按照它们的时间复杂度和空间复杂度进行分类:

时间复杂度

O(n^2) 时间复杂度
  1. 冒泡排序(Bubble Sort):通过不断交换相邻的逆序元素,直到没有逆序元素为止。
  2. 选择排序(Selection Sort):每次从未排序的部分选择最小(或最大)的元素,放到已排序部分的末尾。
  3. 插入排序(Insertion Sort):将每个元素插入到已排序部分的适当位置。
  4. 希尔排序(Shell Sort):冒泡排序的改进版,通过设置间隔序列,减少元素的移动次数。
O(n log n) 时间复杂度
  1. 快速排序(Quick Sort):通过选择一个基准元素,将数组分为两部分,一部分小于基准,另一部分大于基准,然后递归地对这两部分进行排序。
  2. 归并排序(Merge Sort):将数组分为两半,分别对它们进行排序,然后将两个有序的子数组合并成一个有序数组。
  3. 堆排序(Heap Sort):利用堆这种数据结构,通过构建最大堆或最小堆,然后交换堆顶元素与最后一个元素,再调整堆结构,重复此过程直到整个数组有序。
O(n) 时间复杂度
  1. 计数排序(Counting Sort):适用于整数排序,统计每个整数出现的次数,然后根据计数结果重新构造有序数组。
  2. 基数排序(Radix Sort):按照数字的位数进行排序,从最低位开始,逐位进行计数排序。
  3. 桶排序(Bucket Sort):将数据分布到有限数量的桶中,然后对每个桶中的数据进行排序,最后按顺序合并所有桶中的数据。

空间复杂度

O(1) 空间复杂度(原地排序)
  1. 冒泡排序
  2. 插入排序
  3. 选择排序
  4. 希尔排序
O(log n) 空间复杂度
  1. 快速排序(递归调用栈的深度)
  2. 归并排序(需要额外的空间来合并数组)
O(n) 空间复杂度
  1. 计数排序
  2. 基数排序
  3. 桶排序

需要注意的是,不同的排序算法在不同的数据集上表现可能会有很大差异。例如,对于已经部分排序的数据,插入排序的性能可能会优于快速排序。因此,在实际应用中,选择合适的排序算法需要根据具体的数据特性和需求来决定。

3. 请尽可能详细地说明,快速排序算法的原理是什么?时间复杂度为什么是nlogn?为什么快速排序不稳定?你的回答中不要写出示例代码。

[](@replace快速排序(Quick Sort)是一种高效的排序算法,由C.A.R. Hoare于1960年提出。它的基本思想是通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,然后分别对这两部分记录继续进行排序,以达到整个序列有序的目的。

快速排序的原理

  1. 分区(Partition):从数列中挑出一个元素,称为“基准”(pivot)。将数组分成两个子数组,使得左边的元素都比基准小,右边的元素都比基准大。这个过程称为分区操作。

  2. 递归排序:递归地将小于基准值的子数组和大于基准值的子数组排序。

时间复杂度为nlogn的原因

快速排序的平均时间复杂度为O(n log n),这是因为:

  1. 分区的平均情况:在平均情况下,每次分区操作会将数组分成两个大致相等的部分。这意味着每次分区操作大约需要处理一半的数据。

  2. 递归树:快速排序的过程可以看作是在构建一棵二叉树,树的每个节点代表一次分区操作。理想情况下,这棵树会是一个平衡的二叉搜索树,其高度大约为log n。

  3. 时间复杂度分析:每次分区操作的时间复杂度为O(n),因为需要遍历整个数组来重新排列元素。由于递归树的深度大约为log n,所以总的时间复杂度为O(n log n)。

快速排序的不稳定性

快速排序是一种不稳定的排序算法,原因如下:

  1. 分区过程中的元素交换:在分区过程中,相同值的元素可能会因为分区操作而改变它们的相对顺序。例如,如果两个相同的元素分别位于基准的左侧和右侧,那么在分区后,它们的位置可能会互换。

  2. 递归调用:由于快速排序是递归进行的,如果在递归的某一层中两个相同值的元素交换了位置,那么这种交换会影响到后续的所有递归层次,从而导致这些元素的最终位置与原始顺序不同。

不稳定性的概念是指在排序过程中,相等元素的相对顺序可能会发生改变。由于快速排序在分区时可能会导致相等元素的相对顺序改变,因此它被认为是不稳定的排序算法。

4. 请尽可能详细地说明,TCP三次握手的原理。为什么不是两次握手?你的回答中不要写出示例代码。

TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层协议。在TCP/IP协议中,建立连接时使用三次握手过程,而不是两次或四次。以下是TCP三次握手原理的详细说明以及为什么不是两次握手的原因:

TCP三次握手原理

  • 第一次握手:客户端发送一个SYN(同步序列号)报文给服务器,请求建立连接。客户端进入SYN_SENT状态,等待服务器的确认。
  • 第二次握手:服务器收到SYN报文后,发送一个SYN+ACK(同步确认)报文给客户端,确认收到SYN报文,并请求客户端的确认。服务器进入SYN_RCVD状态。
  • 第三次握手:客户端收到SYN+ACK报文后,发送一个ACK(确认)报文给服务器,确认收到服务器的SYN+ACK报文。客户端进入ESTABLISHED状态,服务器也进入ESTABLISHED状态,连接建立成功。

为什么不是两次握手

  • 避免资源浪费:如果只有两次握手,服务器在收到SYN报文后会进入ESTABLISHED状态,但如果客户端的SYN请求在网络中阻塞,客户端没有收到ACK报文,就会重新发送SYN。由于没有第三次握手,服务器不清楚客户端是否收到了自己发的ACK,因此每收到一个SYN就只能先主动建立一个连接,这会导致服务端的资源迅速被消耗殆尽。
  • 避免历史连接:三次握手的主要原因是为了防止旧的重复连接初始化造成混乱。TCP为了保证数据的可靠性,会重复发送数据,这些数据包往往并不是如我们期望的一样,先发送的数据包,就先到达目标主机,可能会由于网络拥堵等原因,会使得旧的数据包,先到达目标主机,那么这种情况下 TCP 三次握手是如何避免的呢?客户端连续发送多次 SYN 建立连接的报文:旧SYN比新SYN早到达了服务端;那么此时服务端就会回一个 SYN + ACK 报文给客户端;客户端收到SYN+ACK后会根据序列号,或者超时时间判断这是一个过期的报文,那么客户端就会发送 RST,重置连接。如果是两次握手连接,就不能判断当前连接是否是历史连接,三次握手则可以在客户端(发送方)准备发送第三次报文时,客户端有足够的上下文来判断当前连接是否是历史连接:如果是历史连接(序列号过期或超时),则第三次握手发送的报文是 RST 报文,以此中止历史连接;如果不是历史连接,则第三次发送的报文是 ACK 报文,通信双方就会成功建立连接。
  • 同步双方初始序列号:TCP协议的通信双方都必须维护一个序列号,序列号是可靠传输的一个关键因素。当客户端发送携带初始序列号的SYN报文的时候,需要服务端回一个ACK应答报文,表示客户端的SYN报文已被服务端成功接收。当服务端发送初始序列号给客户端的时候,依然也要得到客户端的应答回应,这样一来一回,才能确保双方的初始序列号能被可靠的同步。

为什么不是四次握手

TCP是全双工的,在客户端发送SYN的时候,服务端就需要回复ACK的确认报文,告诉客户端你发的SYN包我收到了;服务端也是需要发送SYN包,携带自己的初始序列号信息,那客户端也需要对这个SYN包回复ACK表示,服务端你发的SYN我也收到了。从上图可以看到服务端发送ACK和SYN是可以合并到一个数据包中的,也就是我们常说的SYN+ACK。也就是合并成了三次握手。

通过三次握手,TCP协议能够确保两端都准备好发送和接收数据,并且双方的初始序列号都已经被对方确认,从而建立一个可靠的连接。三次握手的设计考虑了网络的不确定性,确保了连接的可靠性和资源的有效利用。

5. 请尽可能详细地说明,http3的原理。quic协议是什么?TCP和UDP协议的区别是什么?你的回答中不要写出示例代码。

HTTP/3是基于QUIC协议的,而QUIC是一种基于UDP的传输层协议,旨在提高网络传输的性能和效率。以下是HTTP/3的原理、QUIC协议的定义、以及TCP和UDP协议的区别:

HTTP/3的原理

HTTP/3是基于QUIC协议的,它通过使用QUIC协议来实现快速、可靠且安全的网络通信。QUIC协议通过以下特性提高了HTTP/3的性能:

  • 0-RTT连接建立:允许在之前的连接上进行过通信的客户端和服务器可以在短时间内重新建立连接,从而减少建立连接所需的时间。
  • 多路复用:允许多个请求和响应在一个连接上进行,避免了HTTP/2中的队头阻塞问题。
  • 头部压缩:使用QPACK头部压缩算法,进一步减少了网络传输的数据量。

QUIC协议是什么

QUIC(Quick UDP Internet Connections)是一种由Google开发的传输层协议,它基于UDP,旨在提供比TCP更好的性能,特别是在高延迟和不稳定网络条件下。QUIC的主要目标是通过基于UDP的传输来减少连接建立时间、提高传输效率,并改善整体网络性能。

TCP和UDP协议的区别

  • 连接性:TCP是面向连接的协议,需要建立连接后才能传输数据;而UDP是无连接的,可以直接发送数据包,无需建立连接。
  • 可靠性:TCP提供数据的可靠传输,确保数据包按顺序到达,有丢包重传机制;UDP不提供可靠性保证,数据包可能会丢失。
  • 传输方式:TCP是面向字节流的,将数据视为一连串的字节流进行传输;UDP是面向数据报文的,每个数据报文都是一个独立的信息单位。
  • 通信方式:TCP通常只支持点对点通信;而UDP可以支持一对多或多对多的通信方式。
  • 头部开销:TCP的头部信息较多,因为它需要携带序列号、确认号、窗口大小等多种信息;而UDP的头部信息简洁得多,只有端口号和校验和等少量信息。
  • 效率:由于TCP需要进行数据包排序和确认,这增加了额外的开销,使得其传输效率相对较低;而UDP没有这些繁琐的过程,它的传输效率自然更高。
  • 适用场景:TCP适用于对数据完整性要求高的场合,如网页浏览、电子邮件传输等;而UDP适用于对速度要求高而对数据完整性要求不高的场合,如在线视频流、实时游戏和VoIP电话。

HTTP/3通过使用QUIC协议,解决了TCP协议在高延迟和不稳定网络条件下的性能问题,同时提供了更好的安全性和效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2092268.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Django异步查询并下载CSV文件

Django异步查询并下载CSV文件 通过循环遍历数据库,自动生成CSV文件的表头和内容. Django V5.1 1. 视图 1.1 将同步的数据库查询转换为异步 async def get_blogs():# 使用sync_to_async包装Queryset方法blog_list await sync_to_async(Blog.objects.all)()return blog_list…

心觉:你的潜意识信念系统符合第一性原理吗

想要释放潜意识的力量,以及想要吸引力法则发挥作用 每天进行积极的自我暗示非常重要 自我暗示辅以视觉化目标及实现目标后的喜悦,其实就是重塑潜意识的过程 举个例子,比如你现在月收入5000,你想实现月入5万 怎么做到 你现在月…

5.11 飞行控制——定点飞行

文章目录 5.11 飞行控制——定点飞行5.11.1 加入三轴位置的飞行硬件系统 FLY(s)5.11.2 数学模型——三轴位置系统(1)x、y轴位置系统的微分方程(2)z轴位置系统的微分方程(3)三轴位置系统的状态空间方程 5.11…

MybatisPlus的基本使用

文章目录 介绍特性工作流程图添加依赖Spring Boot2Spring Boot3 配置定义Mapper接口并继承BaseMapperServer 接口自定义 Service 接口继承 IServie 接口自定义 Service 实现类,实现自定义接口并继承 ServiceImpl 添加Config类常用注解:TableNameTableIdTableFieldTa…

css中 display block属性的用法

前言 display:block是一个css属性,用于控制元素的显示方式。当元素的display属性设置为block时,元素会以块级元素的方式进行显示。 块级元素(block-level element)是指在HTML中以块的形式展示并独占一行的元素。与块级元素相对的…

MyBatis-Plus 入门与进阶教程

本教程将带领你快速上手 MyBatis-Plus&#xff0c;涵盖其基本功能、常用注解以及插件的使用。我们将通过代码实例一步步展示如何在实际项目中应用 MyBatis-Plus。 1. 快速开始 1.1 添加依赖 在 pom.xml 中添加以下依赖&#xff1a; <dependency><groupId>com.b…

【Hexo系列】【7】Butterfly主题使用及美化

本期将为大家讲解Hexo Butterfly主题的使用。 1. 主题介绍 hexo-theme-butterfly是基于 Molunerfinn 的 hexo-theme-melody 的基础上进行开发的&#xff0c;当前版本是v4.13.0。 主题官网&#xff1a;https://github.com/jerryc127/hexo-theme-butterfly 官网效果图&#x…

Unity(2022.3.41LTS) - 3D关节

目录 零. 简介 一、关节的类型及特点 二、关节的使用方法 三、关节的应用场景 四. 实例效果 零. 简介 在 Unity 中&#xff0c;关节&#xff08;Joints&#xff09;是实现物理模拟和复杂交互效果的重要组件。以下是对 Unity 关节更详细的介绍&#xff1a; 一、关节的类型…

JDBC中的execute, executeQuery, 和 executeUpdate方法区别

JDBC中的execute, executeQuery, 和 executeUpdate方法区别 1、execute(String sql)2、executeQuery(String sql)3、executeUpdate(String sql) &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1、execute(String sql) 功能&#xff1a;执…

Day89 代码随想录打卡|贪心算法篇---划分字母区间

题目&#xff08;leecode T763&#xff09;&#xff1a; 给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段&#xff0c;同一字母最多出现在一个片段中。 注意&#xff0c;划分结果需要满足&#xff1a;将所有划分结果按顺序连接&#xff0c;得到的字符串仍然是 s …

国产数据库打败Oracle?不存在的!

XC背景下国产数据库替代工程进行的如火如荼&#xff0c;数据库圈特别是Oracle的从业人员&#xff0c;既感受到深深的危机感&#xff0c;又带着些许的不甘&#xff0c;这种不甘主要来自于技术层面。 技术人员也有武士道精神&#xff0c;谁能打败我我服谁&#xff0c;谁的技术比…

如何判断儿童是否患有自闭症

自闭症&#xff0c;也被称为孤独症&#xff0c;是一种复杂的神经发育障碍&#xff0c;其症状通常在儿童早期就开始显现。面对孩子的成长过程&#xff0c;家长和教育者如何准确判断孩子是否患有自闭症&#xff0c;是一个至关重要的问题。 我们需要关注孩子的社交行为。自闭症儿童…

java之浅拷贝、深拷贝

1、java数据类型 java数据类型分为基本数据类型和引用数据类型 基本数据类型&#xff1a;byte、short、int、long、float、double、boolean、char。 引用类型&#xff1a;常见的有类、接口、数组、枚举等。 2、浅拷贝、深拷贝 以下探讨的浅拷贝、深拷贝是通过Object类中的cl…

Python matplotlib绘图 plt.barh 水平条形图调整顺序逆序排列

使用matplotlib 中的 plt.barh 绘制水平条形图时&#xff0c;数据的排列顺序默认由小到大排列&#xff0c;即数据条由短到长排列展示&#xff0c;如果想让数据条由长到短排列展示&#xff0c;可尝试以下代码。 import matplotlib.pyplot as plt import pandas as pd import nu…

MySQL——基础操作

一、数据库的创建 1.1 库的创建 在使用数据库时&#xff0c;最先操作的是创建一个数据库。使用语法如下&#xff1a; CREATE DATABASE [IF NOT EXISTS] database_name [[DEFAULT] CHARSETcharset_name] [[DEFAULT] COLLATEcollation_name]; 对上述语句进行简单说明&#xf…

【秋招笔试题】讨厌冒泡排序

题解&#xff1a;免费的操作是分别在奇偶下标进行排序&#xff0c;收费的操作会改变他们下标的奇偶性&#xff0c;那么直接统计在排序后有多少元素的下标发生变化了即可。 #include <iostream> #include <vector> #include <algorithm> #include "map&…

猫头虎 分享:Python库 XGBoost 的简介、安装、用法详解入门教程

猫头虎 分享&#xff1a;Python库 XGBoost 的简介、安装、用法详解入门教程 &#x1f3af; ✨ 引言 今天猫头虎收到一位粉丝的提问&#xff1a;“猫哥&#xff0c;我在项目中需要用到 XGBoost&#xff0c;可是对它的了解不够深入&#xff0c;不知道从哪开始&#xff0c;能否详…

线性查找表的应用:用户登录注册程序

线性查找表是很简单的数据结构和算法。网站的用户登录注册时是基本的功能。本文首先给出线性查找表的基本实现&#xff0c;然后给出在用户登录注册的程序流程图&#xff0c;并将线性查找表应用到用户查询这一具体任务&#xff0c;并基于 Python 语言在控制台实现用户注册、登录…

ComfyUI使用Flux模型

ComfyUI是一个强大的用户界面&#xff0c;支持多种图像处理和生成模型&#xff0c;而Flux是一系列由Black Forest Labs开发的扩散模型。 准备工作 1. 下载所需文件 下载地址&#xff1a; comfyanonymous/flux_text_encoders at main (hf-mirror.com)https://hf-mirror.com/…

django企业开发实战-学习小结

写在前面 初次阅读此书是三年前&#xff0c;当时没经历过完整的项目 觉得这书就是扯淡 后来经历过项目加班与毒打 今天再翻开此书 觉得实乃不可多得之物 花些时间啃下来吧 需求 需求文档 写文档&#xff0c;列举需要实现的功能&#xff0c;详细列举&#xff0c;不考虑技术实…