Nagle's Algorithm

Nagle算法是以他的发明人John Nagle的名字命名的,它用于自动连接许多的小缓冲器消息;这一过程(称为nagling)通过减少必须发送包的个数来增加网络软件系统的效率。Nagle算法于1984年定义为福特航空和通信公司IP/TCP拥塞控制方法,这是福特经营的最早的专用TCP/IP 网络减少拥塞控制,从那以后这一方法得到了广泛应用。Nagle的文档里定义了处理他所谓的小包问题的方法,这种问题指的是应用程序一次产生一字节数据, 这样会导致网络由于太多的包而过载(一个常见的情况是发送端的"愚蠢窗口综合症")。从键盘输入的一个字符,占用一个字节,可能在传输上造成41字节的 包,其中包括1字节的有用信息和40字节的标题数据。这种情况转变成了4000%的消耗,这样的情况对于轻负载的网络来说还是可以接受的,但是重负载的福 特网络就受不了了,它没有必要在经过节点和网关的时候重发,导致包丢失和妨碍传输速度。吞吐量可能会妨碍甚至在一定程度上会导致连接失败。Nagle的算 法通常会在TCP程 序里添加两行代码,在未确认数据发送的时候让发送器把数据送到缓存里。任何数据随后继续直到得到明显的数据确认或者直到攒到了一定数量的数据了再发包。尽 管Nagle的算法解决的问题只是局限于福特网络,然而同样的问题也可能出现在ARPANet。这种方法在包括因特网在内的整个网络里得到了推广,成为了 默认的执行方式,尽管在高互动环境下有些时候是不必要的,例如在客户/服务器情形下。在这种情况下,nagling可以通过使用TCP_NODELAY 插座选项关闭。 

转:http://blog.csdn.net/stanyang/archive/2006/11/09/1375434.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是参考代码,使用了 C++ STL 中的 sort 函数和双指针来实现: ```c++ #include <iostream> #include <vector> #include <algorithm> #include <cmath> using namespace std; const double EPS = 1e-9; struct Vector { double x, y; double angle; // 极角 }; // 计算点 P 的极角 double polar_angle(double x, double y) { return atan2(y, x); } // 计算向量 AB 的极角 double polar_angle(double Ax, double Ay, double Bx, double By) { return atan2(By - Ay, Bx - Ax); } // 计算向量 AB 的长度 double length(double Ax, double Ay, double Bx, double By) { return hypot(Bx - Ax, By - Ay); } // 计算向量 AB 和向量 CD 的交点 bool intersection(double Ax, double Ay, double Bx, double By, double Cx, double Cy, double Dx, double Dy, double& Px, double& Py) { double d = (Bx - Ax) * (Dy - Cy) - (By - Ay) * (Dx - Cx); if (abs(d) < EPS) return false; // 平行或重合 double t = ((Cx - Ax) * (Dy - Cy) - (Cy - Ay) * (Dx - Cx)) / d; Px = Ax + t * (Bx - Ax); Py = Ay + t * (By - Ay); return true; } // 将向量按照极角排序 bool cmp(const Vector& a, const Vector& b) { return a.angle < b.angle; } int main() { int T; cin >> T; while (T--) { int N; cin >> N; vector<Vector> cucumbers; for (int i = 0; i < N; ++i) { double x1, y1, x2, y2; cin >> x1 >> y1 >> x2 >> y2; double len = length(x1, y1, x2, y2); double angle = polar_angle(x1, y1, x2, y2); cucumbers.push_back({x1, y1, angle}); cucumbers.push_back({x2, y2, angle + (angle < 0 ? 2 * M_PI : 0)}); } sort(cucumbers.begin(), cucumbers.end(), cmp); int ans = 0; int left = 0, right = 0; while (left < cucumbers.size()) { while (right < cucumbers.size() && cucumbers[right].angle - cucumbers[left].angle <= M_PI) { ++right; } ans = max(ans, right - left); ++left; } cout << ans << endl; } return 0; } ``` 这个算法的时间复杂度为 $O(n \log n)$,其中 $n$ 是黄瓜的数量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值