首页
学习
活动
专区
圈层
工具
发布

控制局域网上网时间:基于 C# 红黑树的时段管控算法

在企业、校园等局域网场景中,控制局域网上网时间是保障网络资源合理分配、提升用户工作与学习效率的关键手段。传统管控方式多依赖线性遍历判断设备上网权限,在局域网设备数量超过百台时,易出现响应延迟问题。红黑树作为一种自平衡二叉搜索树,具备 O (log n) 的插入、查询与删除复杂度,能高效处理动态变化的上网时段数据,为控制局域网上网时间提供稳定的算法支撑。本文将从红黑树与管控场景的适配性、核心逻辑设计及 C# 实现三个维度,阐述其在控制局域网上网时间中的应用。

一、红黑树在控制局域网上网时间中的适配性分析

控制局域网上网时间的核心需求是,根据预设的设备上网时段规则(如 “设备 A 每日 8:00-18:00 可上网”),实时判断设备当前请求是否合规,并动态更新规则库。红黑树的特性与该需求高度契合:

首先,红黑树通过颜色规则(节点非红即黑、根节点为黑等)维持树的平衡,确保任意节点的左右子树高度差不超过两倍,查询时无需遍历所有节点,能快速定位设备对应的上网时段规则,满足控制局域网上网时间的实时性要求;其次,当新增或删除上网规则时,红黑树通过旋转与颜色调整,在 O (log n) 时间内恢复平衡,避免传统线性存储结构中数据变动导致的性能骤降,适配局域网内规则频繁更新的场景;最后,红黑树的中序遍历可按时间顺序输出规则,便于管理员批量核查时段设置,为控制局域网上网时间的规则优化提供数据支持。

二、控制局域网上网时间的红黑树核心逻辑设计

基于红黑树的管控逻辑需围绕 “设备 - 时段” 映射关系展开,关键设计包括:

节点结构定义:每个节点存储设备唯一标识(如 MAC 地址)、允许上网的起始时间(TimeSpan 类型)、结束时间(TimeSpan 类型),以及红黑树必要的颜色标记、左子节点、右子节点与父节点引用。其中,设备标识作为索引键,确保每个设备的规则唯一。

合规判断逻辑:当设备发起上网请求时,通过红黑树查询该设备对应的节点,提取允许上网时段,对比当前系统时间与时段范围。若当前时间在 [起始时间,结束时间] 内,则允许上网;反之则拦截,实现控制局域网上网时间的核心功能。

规则更新机制:新增规则时,按设备标识插入红黑树并自动平衡;删除或修改规则时,先定位节点再执行相应操作,确保规则库实时反映管控需求,避免因规则滞后导致控制局域网上网时间失效。

三、控制局域网上网时间的 C# 红黑树实现代码例程

以下为基于 C# 的红黑树管控模块实现,包含节点定义、树操作及合规判断功能,可直接集成到局域网管控系统中:

using System;

// 红黑树节点类:存储设备上网时段规则

public class TimeControlNode

{

public string MacAddress { get; set; } // 设备MAC地址(唯一标识)

public TimeSpan StartTime { get; set; } // 允许上网起始时间

public TimeSpan EndTime { get; set; } // 允许上网结束时间

public bool IsRed { get; set; } // 红黑树节点颜色(true为红,false为黑)

public TimeControlNode Left { get; set; } // 左子节点

public TimeControlNode Right { get; set; } // 右子节点

public TimeControlNode Parent { get; set; } // 父节点

public TimeControlNode(string mac, TimeSpan start, TimeSpan end)

{

MacAddress = mac;

StartTime = start;

EndTime = end;

IsRed = true; // 新节点默认红色

}

// 判断当前时间是否在允许上网时段内

public bool IsTimeAllowed(TimeSpan currentTime)

{

return currentTime >= StartTime && currentTime <= EndTime;

}

}

// 红黑树管理类:实现控制局域网上网时间的规则操作

public class TimeControlRedBlackTree

{

private TimeControlNode _root;

private readonly TimeControlNode _nilNode; // 哨兵节点(简化边界处理)

public TimeControlRedBlackTree()

{

_nilNode = new TimeControlNode(null, TimeSpan.Zero, TimeSpan.Zero) { IsRed = false };

_root = _nilNode;

}

// 插入设备上网规则(核心操作)

public void InsertRule(string mac, TimeSpan start, TimeSpan end)

{

var newNode = new TimeControlNode(mac, start, end);

newNode.Left = _nilNode;

newNode.Right = _nilNode;

TimeControlNode parent = null;

var current = _root;

// 找到插入位置

while (current != _nilNode)

{

parent = current;

if (string.Compare(mac, current.MacAddress) < 0)

current = current.Left;

else if (string.Compare(mac, current.MacAddress) > 0)

current = current.Right;

else

throw new InvalidOperationException($"设备{mac}的规则已存在,无需重复添加");

}

newNode.Parent = parent;

if (parent == null)

_root = newNode; // 树为空时,新节点为根

else if (string.Compare(mac, parent.MacAddress) < 0)

parent.Left = newNode;

else

parent.Right = newNode;

// 插入后修复红黑树平衡

FixInsert(newNode);

}

// 查询设备上网权限(控制局域网上网时间的关键判断)

public bool CheckAccess(string mac)

{

var node = SearchNode(mac);

if (node == _nilNode)

return false; // 无规则设备默认禁止上网

var currentTime = DateTime.Now.TimeOfDay;

return node.IsTimeAllowed(currentTime);

}

// 搜索指定MAC地址的节点

private TimeControlNode SearchNode(string mac)

{

var current = _root;

while (current != _nilNode)

{

var compareResult = string.Compare(mac, current.MacAddress);

if (compareResult == 0)

return current;

current = compareResult < 0 ? current.Left : current.Right;

}

return _nilNode;

}

// 插入后修复红黑树平衡(标准红黑树修复逻辑)

private void FixInsert(TimeControlNode node)

{

while (node.Parent.IsRed)

{

if (node.Parent == node.Parent.Parent.Left)

{

var uncle = node.Parent.Parent.Right;

// 情况1:叔叔节点为红色

if (uncle.IsRed)

{

node.Parent.IsRed = false;

uncle.IsRed = false;

node.Parent.Parent.IsRed = true;

node = node.Parent.Parent;

}

else

{

// 情况2:叔叔节点为黑色,且当前节点为右孩子

if (node == node.Parent.Right)

{

node = node.Parent;

LeftRotate(node);

}

// 情况3:叔叔节点为黑色,且当前节点为左孩子

node.Parent.IsRed = false;

node.Parent.Parent.IsRed = true;

RightRotate(node.Parent.Parent);

}

}

else

{

var uncle = node.Parent.Parent.Left;

// 对称情况:叔叔节点为红色

if (uncle.IsRed)

{

node.Parent.IsRed = false;

uncle.IsRed = false;

node.Parent.Parent.IsRed = true;

node = node.Parent.Parent;

}

else

{

// 对称情况:叔叔节点为黑色,且当前节点为左孩子

if (node == node.Parent.Left)

{

node = node.Parent;

RightRotate(node);

}

// 对称情况:叔叔节点为黑色,且当前节点为右孩子

node.Parent.IsRed = false;

node.Parent.Parent.IsRed = true;

LeftRotate(node.Parent.Parent);

}

}

if (node == _root)

break;

}

_root.IsRed = false; // 根节点始终为黑色

}

// 左旋操作

private void LeftRotate(TimeControlNode node)

{

var rightChild = node.Right;

node.Right = rightChild.Left;

if (rightChild.Left != _nilNode)

rightChild.Left.Parent = node;

rightChild.Parent = node.Parent;

if (node.Parent == null)

_root = rightChild;

else if (node == node.Parent.Left)

node.Parent.Left = rightChild;

else

node.Parent.Right = rightChild;

rightChild.Left = node;

node.Parent = rightChild;

}

// 右旋操作

private void RightRotate(TimeControlNode node)

{

var leftChild = node.Left;

node.Left = leftChild.Right;

if (leftChild.Right != _nilNode)

leftChild.Right.Parent = node;

leftChild.Parent = node.Parent;

if (node.Parent == null)

_root = leftChild;

else if (node == node.Parent.Right)

node.Parent.Right = leftChild;

else

node.Parent.Left = leftChild;

leftChild.Right = node;

node.Parent = leftChild;

}

// 示例:控制局域网上网时间的规则使用

public static void Main(string[] args)

{

var timeControlTree = new TimeControlRedBlackTree();

// 添加设备规则:MAC为"00:1A:2B:3C:4D:5E"的设备每日8:00-18:00可上网

timeControlTree.InsertRule("00:1A:2B:3C:4D:5E", new TimeSpan(8, 0, 0), new TimeSpan(18, 0, 0));

// 检查设备当前上网权限(模拟控制局域网上网时间的实际场景)

var macToCheck = "00:1A:2B:3C:4D:5E";

var isAllowed = timeControlTree.CheckAccess(macToCheck);

Console.WriteLine($"设备{macToCheck}当前是否允许上网:{isAllowed}");

}

}

四、红黑树管控模块的应用扩展建议

在实际部署中,为提升控制局域网上网时间的可靠性,可对红黑树模块进行两点优化:一是引入规则持久化机制,通过 C# 的序列化功能将红黑树节点数据存储到本地文件或数据库,避免系统重启后规则丢失;二是增加多线程安全控制,在 InsertRule 与 CheckAccess 方法中加入锁机制(如使用 lock 关键字),防止局域网内多设备并发请求时出现数据异常,确保控制局域网上网时间的准确性与稳定性。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OlOFQ9E9Xk1MRMSxdzz46LYw0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

相关快讯

领券