当前位置:首页 > 力扣 > 力扣3508题:队列+哈希表+时间戳索引解决路由器设计

力扣3508题:队列+哈希表+时间戳索引解决路由器设计

3周前 (08-27)

力扣3508题:队列+哈希表+时间戳索引解决路由器设计 力扣题解 C++ 队列 哈希表 第1张

一、题目解读

力扣3508题要求设计一个路由器类,支持添加数据包与转发操作。每个数据包包含源地址、目标地址和时间戳,需满足:

1. 内存容量限制,超出时需删除最早数据包;

2. 相同源-目标-时间戳的数据包仅允许添加一次;

3. 转发时返回最早待处理的数据包。题目核心在于平衡内存约束与数据包唯一性,同时优化时间戳索引效率。

二、解题思路

队列+哈希表+时间戳索引”的组合策略:

1. 队列(packetQueue):按时间戳顺序存储数据包,头部为最早待转发数据;

2. 哈希表(packetSet):键为拼接的源-目标-时间戳,快速判定重复;

3. 时间戳索引(destTimeMap):按目标地址分组,维护每个地址的时间戳有序列表,便于O(logN)删除操作。

内存超限时,从队列头部弹出数据包并同步更新哈希表与索引;添加新包时,利用upper_bound插入保持有序,降低维护成本。

三、解题步骤

1. 初始化:构造函数接收内存容量,初始化队列、哈希表及索引映射

2. 添加数据包(addPacket):

○ 生成唯一键,若存在则直接返回false;

○ 若队列超容,弹出头部包并删除对应键及时间戳索引;

○ 插入新包至队列,更新哈希表与目标地址的时间戳列表。

3. 转发数据包(forwardPacket):

○ 若队列为空则返回空向量;

○ 弹出头部包,删除对应键及时间戳索引,返回包信息。

4. 时间戳维护:利用lower_bound定位待删时间戳,结合erase实现精准删除,避免遍历。

四、代码与注释

class Router {
private:
    struct Packet {
        int src;
        int dest;
        int ts;
    };
    
    int capacity;
    queue<Packet> packetQueue;
    unordered_set<string> packetSet;
    unordered_map<int, vector<int>> destTimeMap;
    
    string makeKey(int src, int dest, int ts) {
        return to_string(src)+","+to_string(dest)+","+to_string(ts);
    }
public:
    Router(int memoryLimit) : capacity(memoryLimit) {} // 初始化容量
    
    bool addPacket(int src, int dest, int ts) {
        string key = makeKey(src, dest, ts); // 生成唯一键
        if (packetSet.count(key)) return false; // 重复包过滤
        
        // 处理内存限制
        while (packetQueue.size() >= capacity) {
            auto p = packetQueue.front(); // 获取最早包
            string oldKey = makeKey(p.src, p.dest, p.ts);
            packetSet.erase(oldKey); // 删除哈希表记录
            
            // 从索引中删除对应时间戳
            auto& times = destTimeMap[p.dest];
            auto it = lower_bound(times.begin(), times.end(), p.ts);
            if (it!= times.end() && *it == p.ts) {
                times.erase(it); // 精准删除
            }
            packetQueue.pop(); // 弹出旧包
        }
        
        // 添加新数据包
        packetQueue.push({src, dest, ts});
        packetSet.insert(key);
        auto& times = destTimeMap[dest];
        auto it = upper_bound(times.begin(), times.end(), ts);
        times.insert(it, ts); // 有序插入时间戳
        return true;
    }
    
    vector<int> forwardPacket() {
        if (packetQueue.empty()) return {}; // 空队列直接返回
        
        auto p = packetQueue.front();
        string key = makeKey(p.src, p.dest, p.ts);
        packetSet.erase(key); // 删除哈希表记录
        
        // 更新索引
        auto& times = destTimeMap[p.dest];
        auto it = lower_bound(times.begin(), times.end(), p.ts);
        if (it!= times.end() && *it == p.ts) {
            times.erase(it);
        }
        packetQueue.pop(); // 弹出已转发包
        return {p.src, p.dest, p.ts}; // 返回包信息
    }
    int getCount(int dest, int start, int end) {
        if (!destTimeMap.count(dest)) return 0;
        
        const auto& times = destTimeMap[dest];
        auto left = lower_bound(times.begin(), times.end(), start);
        auto right = upper_bound(times.begin(), times.end(), end);
        return right - left;
    }
};

五、总结

本解法通过队列与时间戳索引的双向维护,实现了内存约束下的高效数据包管理。关键在于:

1. 空间优化:哈希表确保唯一性,队列控制内存上限;

2. 时间优化:利用有序列表与二分查找,将删除与插入操作降为O(logN);

3. 工程性:代码结构清晰,注释明确,可扩展至实际网络路由场景。



原创内容 转载请注明出处

分享给朋友:

相关文章

力扣746:三步通关最小花费爬楼梯

力扣746:三步通关最小花费爬楼梯

题目解析:站在楼梯的某个台阶时,需要支付当前台阶对应的体力值cost[i],之后可以选择向上爬1或2个台阶。最终目标是到达‌楼层顶部‌(即数组末尾之后的位置),且初始位置可选择下标0或1的台阶作为起点...

NOIP2005 普及组 洛谷P1408 背包问题的空间优化技巧与实战应用

NOIP2005 普及组 洛谷P1408 背包问题的空间优化技巧与实战应用

题目重解想象你是一名药师,有t分钟在山上采集m种草药。每种草药需要time分钟采集,价值为num。这就像考试时分配时间做题,要选择收益最大的题目组合。题目要求计算在规定时间内能获得的最大草药价值。解题...

力扣144:递归之美 轻松掌握二叉树前序遍历

力扣144:递归之美 轻松掌握二叉树前序遍历

题目解读二叉树的前序遍历是一种基础但重要的树遍历方式,其遍历顺序为:先访问根节点,然后递归地前序遍历左子树,最后递归地前序遍历右子树。给定一个二叉树的根节点,我们需要按照这个顺序访问所有节点,并将它们...

力扣3112题解法:带时间限制的最短路径问题解析(C++代码)

力扣3112题解法:带时间限制的最短路径问题解析(C++代码)

一、题目解读力扣3112题要求解决带时间限制的最短路径问题:给定一个有向图,节点具有消失时间,需计算从起点到各节点的最短路径,且路径总时间不能超过节点的消失时间。题目难点在于需在传统最短路径算法(如D...

【洛谷1184题解析】用C++高效解决地点匹配问题(附代码与解题思路)

【洛谷1184题解析】用C++高效解决地点匹配问题(附代码与解题思路)

一、题目解读洛谷1184题要求处理一组地点列表与行程记录,统计其中匹配的天数。题目难点在于高效处理带有空格的字符串输入,以及快速判断每日行程是否在高手可去地点集合中。需要兼顾输入格式解析与算法效率。二...

洛谷1220题解:动态规划与区间DP优化解法(附代码注释)

洛谷1220题解:动态规划与区间DP优化解法(附代码注释)

一、题目解读洛谷1220题要求计算在n个位置放置灯的情况下,通过关闭连续区间灯并移动至区间端点,使得总耗电量最小。需考虑灯的功率与位置差异,设计高效的算法求解最优策略。二、解题思路1. 动态规划 +...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。