常面常新-1015
冒泡排序
冒泡排序是一种简单的排序算法,它通过重复遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。 遍历数列的工作是重复进行直到没有再需要交换,也就是说该数列已经排序完成。 这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
算法步骤:
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
- 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
B 树和 B+树
B 树(B+-Tree)
B 树是一种平衡的多路搜索树,它具有以下特点:
平衡性:所有叶子节点都位于同一层,这意味着从根到叶子的最长路径是相同的。
多路分支:每个节点可以有多个子节点,子节点的最大数量通常表示为
m
,最小数量为m/2
(在一些变种中,最小量可以是ceil(m/2)
或floor(m/2) + 1
。有序性:节点中的键值是有序的,并且每个键值的左子树中的所有值都小于它,右子树中的所有值都大于它。
键值分布:键值既可以出现在内部节点,也可以出现在叶子节点。
查找效率:由于树是平衡的,查找操作的最坏情况时间复杂度为
O(log n)
,其中 n 是树中键值的数量。动态调整:当插入或删除操作导致节点中的键值数量超出限制时,节点会分裂或合并以保持树的平衡。
B+树(B+-Tree)
B+
树是B
树的一种变体,它具有以下特点:
非叶子节点不存储数据:与
B
树不同,B+
树的所有数据都存储在叶子节点中,非叶子节点只存储键值和子节点的针。更大的节点容量:由于非叶子节点不存储数据,
B+
树的非叶子节点可以有更多键值,这意味着树的高度可以更低对于大量数据的存储和检索,这可以提高效率。所有叶子节点相连:
B+
树的叶子节点通过指针相连,形成一个链表,这使得范围查询更加高效。查询性能:由于所有数据都存储在叶子节点,并且叶子节点之间是相连的,
B+
树非常适合执行范围查询。写操作的挑战:由于数据只存储在叶子节点,插入和删除操作可能需要更多的分裂和合并操作,尤其是在树的上节点。
空间效率:由于非叶子节点不存储数据,B+树可以更有效地使用存储空间,尤其是在页式存储系统中。
B 树与 B+树的比较
查询性能:
B+
树在范围查询中表现更好,因为可以通过叶子节点的链表快速遍历。而B
树在点查询中可能更有势,因为可以在任何级别的节点中找到键值。存储效率:
B+
树由于非叶子节点不存储数据,可以有更高的存储效率。更新操作:
B
树在更新操作(插入和删除)中可能更有优势,因为可以在任何级别的节点中进行。应用场景:
B+
树通常用于数据库和文件系统的索引,因为它们提供了更好的范围查询性能。B
树则适用于需要平点查询和范围查询的场景。
TCP 和 UDP
TCP
(传输控制协议)和UDP
(用户数据报协议)是两种主要的传输层通信协议:
TCP
提供面向连接的、可靠的字节流服务。它确保数据正确无误地从源传送到目的地。TCP
通过三次握手建立连接,提供数据包排序、确认和重传机制,确保数据的完整性和顺序性。UDP
提供无连接服务,它在发送数据前不建立连接。UDP
发送的是数据报,它不保证数据的到达、顺序或完整性。UDP
适用于对实时性要求高的应用,如视频流和在线游戏。
GET 和 POST 的区别
GET
和POST
是HTTP
协议中的两种请求方法,它们在用途和行为上有所不同:
GET
请求用于从服务器检索数据。它应该是幂等的,意味着多次执行相同的GET
请求应该得到相同的结果,并且不会产生副作用。GET
请求的数据通常附加在URL
之后,以查询字符串的形式发送。POST
请求用于向服务器发送数据进行处理,比如上传文件或提交表单。POST
不是幂等的,多次执行相同的POST
请求可能会产生不同的结果,比如多次提交表单可能会导致多次数据插入。POST
请求的数据通常在请求体中发送。
数据库索引
主键索引
(Primary Key)
:唯一的标识,主键不可重复,且只能有一个列作为主键。唯一索引
(Unique Key)
: 也称为普通索引,用于提高查询效率,但可能会降低更新表的性能。常规索引
(Key/Index)
: 默认的,使用Index
或者Key
关键字来设置。哈希索引:适用于等值查询,但不适用于范围查询。
全文索引:用于文本搜索,支持复杂查询,如模糊查询和多关键字查询。
B-Tree
索引:最常用的索引类型,适用于全键值、键值范围和键值前缀查找。B+Tree
索引:在许多现代数据库系统中广泛使用,特别是对于大量数据的读操作。
数据库Groupby
是怎么做到的
查询解析:当执行包含
GROUP BY
子句的查询时,数据库首先解析查询,确定要分组的列和聚合函数。排序数据:数据库对
GROUP BY
子句中指定的列进行排序,以确保具有相同值的行彼此相邻。这一步是必要的,因为分组是在排序的基础上进行的。分组:数据库遍历排序后的数据,根据
GROUP BY
列的值将数据分成多个组。每个唯一的值对应一个组。应用聚合函数:对于每个组,数据库应用聚合函数(如
SUM
,COUNT
等)来计算组的汇总值。返回结果:数据库将每个组的聚合结果作为一个新的行返回,形成一个结果集。