关于环

本文探讨了一致性Hash算法及令牌环在网络通讯中的应用。一致性Hash通过引入虚拟节点解决了数据散列不均衡的问题,而令牌环则确保了网络通讯中的资源有序竞争。
最近碰到两种环,它们所要解决的问题并不属于同一范畴,之所以放在一起,只因为都是环,呵呵。

[size=large][b]1、一致性hash算法的环[/b][/size]
解决的是:更好的解决数据集合散列的问题;多使用于分布式存储场景。
普通的hash算法,数据是按照存储、桶来做hash,hash值与桶的位置对应起来,这样有一个缺点:数据的hash值会受桶的变化影响,桶的增加、减少会改变绝大多数数据的hash值和对应桶的位置。一致性hash算法可以解决这个问题。

解决办法:一致性hash算法固定hash函数的“分母”,“待写入的数据”和“被写入的存储节点”使用同一套hash函数,并且从0到分母的数值串成了环形。这样,待写入和被写入的数据经过hash函数后,都会被散列到这个环形的具体数值点上。
这样“写入的数据”不依赖“被写入的存储节点”的个数做hash计算,即“写入的数据”的hash值不受“被写入的存储节点”个数影响。“写入的数据”在环中按顺时针找离它最近的“存储节点”,并存储进去即可。

[img]http://dl.iteye.com/upload/attachment/266413/b74dac88-c0fc-3b25-a5e1-6777683582d8.bmp[/img]

[img]http://dl.iteye.com/upload/attachment/266415/acb1d627-73d7-3ce4-b674-8f5ae87c2519.bmp[/img]

如果简单的按照上述方法处理,那么在存储/桶的数据比较少的情况下,很容易出现数据散列不均衡的情况(Hash 算法的另一个指标是平衡性Balance)。平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利用。

为了解决这种情况, consistent hashing 引入了“虚拟节点”的概念,它可以如下定义:
“虚拟节点”( virtual node )是实际节点在 hash 空间的复制品( replica ),一个实际节点对应了若干个“虚拟节点”,这个对应个数也成为“复制个数”,“虚拟节点”在 hash 空间中以 hash 值排列。

[img]http://dl.iteye.com/upload/attachment/266422/a9ca3689-e700-31ff-b33b-afd6922622bb.bmp[/img]


[img]http://dl.iteye.com/upload/attachment/266424/49e53530-f44c-3e00-a266-e9772bdbaa72.bmp[/img]


[size=large][b]2、令牌环[/b][/size]
解决的是:网络通讯中的资源竞争问题。避免无序网状数据传输的情况发生,电信的基站也是按照这个方式搭建。
详述:一个称为令牌(Token)的特殊模式,使其沿着环路循环。规定只有获得令牌的站点才有权发送数据帧,完成数据发送后立即释放令牌以供其它站点使用。由于环路中只有一个令牌,因此任何时刻至多只有一个站点发送数据,不会产生冲突。而且,令牌环上各站点均有相同的机会公平地获取令牌。


[img]http://dl.iteye.com/upload/attachment/266444/61fa033f-fbce-3025-8a61-8b3905bfb1ce.bmp[/img]
<think>好的,用户想了解如何在状数组或链表中求最大值。首先,我需要回忆相关的数据结构知识。状结构通常有两种情况:数组形成形,或者链表存在。用户的问题可能涉及到这两种情况的最大值计算。 对于状数组,比如LeetCode 918题提到的形子数组最大值,我记得这通常需要处理数组的首尾相连的情况。常规的解法可能涉及动态规划或者滑动窗口。比如,当数组是形时,最大子数组可能出现在中间部分(此时处理方式与非形相同),或者跨越了数组的首尾。这时候可能需要计算总和减去最小子数组的和,类似于题解中的方法。需要确认这个思路是否正确,同时考虑边界情况,比如数组全为负数时如何处理。 关于状链表,用户可能指的是在存在的链表中寻找节点值的最大值。这种情况下,首先需要确定链表是否有,通常使用快慢指针法。找到中的一个节点后,可以遍历整个,记录最大值。但如果是单链表,的存在可能导致无限循,所以需要确保在遍历时能够正确终止,比如记录的起点,再次遇到时停止。 另外,用户提供的引用中有提到形子数组最大值的解法,使用滑动窗口维护最小值,这可能与求最大和的子数组有关。需要结合这些引用内容,确保回答正确引用相关的方法。 现在需要将思路整理成步骤,分情况讨论数组和链表的不同处理方法。对于数组,要区分形的影响,并给出具体的算法步骤,可能包括动态规划或滑动窗口的技巧。对于链表,则需要先检测的存在,然后遍历中的节点找出最大值。同时,要注意代码实现的正确性,比如如何处理全负数的情况,或者中节点的遍历终止条件。 可能还需要考虑时间复杂度和空间复杂度,比如使用快慢指针检测是O(1)空间,而遍历需要O(n)时间。对于数组的情况,动态规划通常是O(n)时间复杂度,空间复杂度O(1),如果采用总和减去最小子数组的方法。 最后,生成相关问题,可能需要围绕形结构的其他算法问题,比如求最小值、的入口检测,或者动态规划在形数组中的应用扩展。</think>### 状结构最大值计算方法 #### 1. 状数组最大值计算 **问题特点**:数组首尾相连,允许子数组跨越数组边界。例如数组$[5,-3,5]$的形子数组最大和是$10$(即$5 + (-3) + 5 + 5$的形连接效果)。 **算法步骤**: 1. **非形子数组最大值**:用动态规划计算常规最大子数组和$max\_normal$,例如$max\_normal = \max_{i} \sum arr[j...i]$ 2. **形子数组最大值**:总数组和$total$减去最小子数组和$min\_sum$(当$total \neq min\_sum$时有效) 3. **边界处理**:若数组全为负数,直接返回$max\_normal$ 数学表达式: $$ max\_circular = \max(max\_normal, total - min\_sum) $$ **代码示例**: ```python def maxSubarraySumCircular(arr): max_normal = current_max = arr[0] min_normal = current_min = arr[0] total = arr[0] for num in arr[1:]: current_max = max(num, current_max + num) max_normal = max(max_normal, current_max) current_min = min(num, current_min + num) min_normal = min(min_normal, current_min) total += num if total == min_normal: # 全为负数的情况 return max_normal return max(max_normal, total - min_normal) ``` **核心思想**:形子数组最大和可能出现在常规区间(与非形情况相同)或跨越首尾的区间(总和减去最小子数组和)[^4] --- #### 2. 状链表最大值计算 **问题特点**:链表存在结构,要求找到中节点的最大值。 **算法步骤**: 1. **检测的存在**:使用快慢指针法确定链表是否有 2. **定位入口**:当快慢指针相遇后,将慢指针重置到链表头,两指针以相同速度移动直到相遇点即为入口[^2] 3. **遍历内节点**:从入口出发,遍历整个并记录最大值 **代码示例**(检测并找最大值): ```python class ListNode: def __init__(self, val=0): self.val = val self.next = None def findMaxInCycle(head): slow = fast = head has_cycle = False # 检测 while fast and fast.next: slow = slow.next fast = fast.next.next if slow == fast: has_cycle = True break if not has_cycle: return None # 无链表 # 寻找入口 slow = head while slow != fast: slow = slow.next fast = fast.next # 遍历内节点 max_val = float('-inf') current = slow while True: max_val = max(max_val, current.val) current = current.next if current == slow: break return max_val ``` **时间复杂度**:检测$O(n)$,遍历$O(n)$,总体保持$O(n)$时间复杂度[^2] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值