tcp和udp的区别?

tcp和udp的区别?

  1. (基于连接vs无连接)tcp是面向连接的(三次握手;四次挥手);udp不是面向连接的
  2. (重量级vs轻量级)tcp是一个重量级的协议;udp则是轻量级的协议。一个tcp数据报的报头大小最少20字节,udp数据报的包头固定8个字节
  3. (可靠性)tcp交付保证:如果消息在传输中丢失,那么它将重发;udp没有交付保证,一个数据包在运输过程中可能丢失。
  4. (有序性)消息到达网络的另一端可能是无序的,tcp协议将为你拍好序。Udp不提供任何有序性的保证。
  5. (速度)tcp慢,适合传输大量数据;udp快,适合传输少量数据。
  6. (流量控制和拥塞控制)TCP有流量控制和拥塞控制,udp没有。
  7. tcp面向字节流,udp面向报文
  8. tcp只能单播,不能发送广播和组播;udp可以广播和组播。

Tcp应用:邮件传输     udp应用:qq聊天、qq视频

 

流量控制和拥塞控制:

流量控制:就是让发送方发送速率不要太快,要让接收方来的及接收。

拥塞控制:防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载拥塞控制所要做的都有一个前提:网络能够承受现有的网络负荷。拥塞控制是一个全局性的过程,涉及到所有的主机、路由器,以及与降低网络传输性能有关的所有因素。

### 如何用Python实现线段树 线段树是一种专门用于处理区间查询和修改问题的数据结构,能够高效完成范围内的查询和更新操作[^2]。以下是基于Python实现线段树的核心方法。 #### 1. 定义节点类 为了便于管理和扩展功能,通常会先定义一个`Node`类来存储每个区间的最小值、最大值或其他属性。如果仅需简单数组形式,则可省略此部分并直接通过列表索引来管理数据。 ```python class Node: def __init__(self, start, end): self.start = start # 当前节点代表的左端点 self.end = end # 当前节点代表的右端点 self.total = 0 # 存储该区间上的某种聚合结果(如求和) self.left = None # 左子树指针 self.right = None # 右子树指针 ``` #### 2. 构建线段树 构建过程采用递归方式完成,每次将当前区间分为两半直到不能再分为止(即到达叶子结点),此时每片叶对应原始序列的一个元素位置。 ```python def build_tree(nums, l, r): if l > r: return None root = Node(l, r) if l == r: # 如果是单个元素的情况 root.total = nums[l] else: mid = (l + r) // 2 root.left = build_tree(nums, l, mid) root.right = build_tree(nums, mid+1, r) # 合并左右孩子的总和作为父节点的结果 root.total = root.left.total + root.right.total return root ``` #### 3. 实现区间查询 对于给定的一组连续下标的集合 `[ql, qr]`, 我们希望快速得到这些数之和或者其他统计量。同样采取自顶向下的策略访问可能覆盖目标区域的部分或者全部路径上的节点来进行累加计算得出最终答案。 ```python def query_sum(root, ql, qr): if not root or qr < root.start or ql > root.end: return 0 # 不相交则返回零贡献度 elif ql <= root.start and root.end <= qr: return root.total # 若完全包含于询问范围内就直接返回其保存的信息 else: # 部分重叠情况继续向下探索两侧分支寻找匹配项 left_sum = query_sum(root.left, ql, qr) right_sum = query_sum(root.right, ql, qr) return left_sum + right_sum ``` #### 4. 更新某个特定位置的数值 当需要改变原数组某一处的取值时,也需要同步调整整棵线段树相应部位所记录的状态信息以保持一致性。 ```python def update_point(root, idx, val): if not root or idx < root.start or idx > root.end: return if root.start == root.end: # 找到了要更改的那个具体单元格 root.total = val # 修改它的值即可 else: mid = (root.start + root.end)//2 if idx <= mid: update_point(root.left, idx, val) else: update_point(root.right, idx, val) # 自底向上重新计算新的汇总值 root.total = root.left.total + root.right.total ``` 以上就是一种标准意义上的使用Python语言去搭建起属于自己的动态维护版本线段树框架体系[^1]。 ### 示例应用案例分析 假设现在有一个长度为8的初始状态全为零的数组arr=[0]*8 ,我们按照上述流程一步步建立起一棵完整的二叉形态呈现出来的线段树之后就可以方便快捷地执行如下两种典型的操作命令啦: - 查询任意指定闭合区间内部所有成员合计起来的数量; - 单独定位某一固定坐标处单独存在的个体成分加以修正替换掉原先旧有的设定参数值;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值