博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Tcp packet Receive and reOrder
阅读量:2334 次
发布时间:2019-05-09

本文共 1139 字,大约阅读时间需要 3 分钟。

已知一个消息流会不断地吐出整数1~N,但不一定按照顺序吐出。如果上次打印的数为i,那么当i+1出现时,请打印i+1及其之后接收过的并且连续的所有数,直到1~N全部接收并打印完,请设计这种接收并打印的结构。

消息流吐出 2,一种结构接收而不打印 2,因为 1 还没出现。
消息流吐出 1,一种结构接收 1,并且打印:1,2。
思路:维护一组连续的链,以及每个链的头和尾的map, 每次收到一个新的包,创建一个单元素的链,然后看有没有可以接上的。

class TCPReceiver {private:	int last;	struct Node {		int seq;		Node* next;		Node(int seq) : seq(seq), next(NULL) {}	};	unordered_map
headMap, tailMap;public: TCPReceiver() : last(0) {}; void receive(int seq) { Node* node = new Node(seq); headMap[seq] = node; tailMap[seq] = node; auto it = tailMap.find(seq - 1); if (it != tailMap.end()) { it->second->next = node; tailMap.erase(it); headMap.erase(seq); } it = headMap.find(seq + 1); if (it != headMap.end()) { node->next = it->second; tailMap.erase(seq); headMap.erase(it); } if (headMap.find(last + 1) != headMap.end()) { auto p = headMap[last + 1]; headMap.erase(last + 1); for (; p; ++last) { cout << p->seq << ' '; auto next = p->next; delete p; p = next; } tailMap.erase(last); cout << endl; } }};
后续:之前的讨论太面向过程了。这个问题没那么玄,就是维护一堆连续的段,两个索引,使得通过头、尾都能查找到段,新来一个 seq, 用seq - 1查 段尾索引,用seq + 1去查 段头索引,找到相邻的段做合并。

转载地址:http://vhapb.baihongyu.com/

你可能感兴趣的文章
linux内核模块传参
查看>>
Ubuntu修改用户名的问题
查看>>
Copy_from&to_user详解
查看>>
关于bash命令
查看>>
编译内核模块 .ko文件的注意事项 缺少:mmzone.h bounds.h
查看>>
Android开发:检测耳机的插入状态
查看>>
Netty 源码分析-服务端
查看>>
Netty 源码分析-ChannelPipeline
查看>>
分库分表的起源
查看>>
【深入理解JVM虚拟机】第1章 走进java
查看>>
【深入理解JVM虚拟机】第2章 java内存区域与内存溢出异常
查看>>
【深入理解JVM虚拟机】第3章 垃圾收集器与内存分配策略
查看>>
性能优化-jvm
查看>>
性能优化-mysql
查看>>
性能优化-tomcat
查看>>
JVM内存模型、指令重排、内存屏障概念解析
查看>>
【java基础】集合框架总结
查看>>
Elasticsearch-基础介绍及索引原理分析
查看>>
【深入理解JVM虚拟机】第7章 虚拟机类的加载机制
查看>>
【C++】二、指针数组与数组指针
查看>>