小编Ada*_*ama的帖子

减少阵列的最大最小和2分区的时间复杂度

array[N]一个N非负值的数组.我们试图以两(2)个子阵列递归地对数组进行分区,这样我们就可以实现每个子数组的最大"最小和".解决方案由以下递归描述:

在此输入图像描述

我们想要计算opt[0][N-1].

c[x][y]表示sum{array[i]}x最高y(含).我已经设法使用动态编程在以下C++代码片段中展开递归:

for ( uint16_t K1 = 0; K1 < N; K1 ++ ) {
    for ( uint16_t K2 = 0; K2 < N-K1; K2 ++ ) {

        const uint16_t x = K2, y = K2 + K1;
        opt[x][y] = 0;

        for ( uint16_t w = x; w < y; w ++ ) {

            uint32_t left  = c[x][w]   + opt[x][w];
            uint32_t right = c[w+1][y] + …
Run Code Online (Sandbox Code Playgroud)

c++ algorithm recursion dynamic-programming

9
推荐指数
1
解决办法
239
查看次数

TCP接收窗口大小高于net.core.rmem_max

iperf在两台服务器之间运行测量,通过10Gbit链路连接.我试图将我观察到的最大窗口大小与系统配置参数相关联.

特别是,我观察到最大窗口大小为3 MiB.但是,我在系统文件中找不到相应的值.

通过运行sysctl -a我得到以下值:

net.ipv4.tcp_rmem = 4096        87380   6291456
net.core.rmem_max = 212992
Run Code Online (Sandbox Code Playgroud)

第一个值告诉我们最大接收器窗口大小为6 MiB.但是,TCP倾向于分配两倍的请求大小,因此最大接收器窗口大小应为3 MiB,正如我测量的那样.来自man tcp:

请注意,TCP实际上分配的次数是setsockopt(2)调用中请求的缓冲区大小的两倍,因此后续的getsockopt(2)调用将不会返回与setsockopt(2)调用中请求的缓冲区大小相同的缓冲区.TCP使用额外空间用于管理目的和内部内核结构,并且/ proc文件值反映了与实际TCP窗口相比更大的大小.

但是,第二个值net.core.rmem_max表示最大接收器窗口大小不能超过208 KiB.根据以下情况,这应该是硬限制man tcp:

tcp_rmem max:每个TCP套接字使用的接收缓冲区的最大大小.该值不会覆盖全局值net.core.rmem_max.这不用于限制在套接字上使用SO_RCVBUF声明的接收缓冲区的大小.

那么,为什么我会观察到最大窗口大小大于指定的窗口大小net.core.rmem_max

注意:我还计算了带宽 - 延迟产品:window_size = Bandwidth x RTT大约3 MiB(10 Gbps @ 2毫秒RTT),从而验证我的流量捕获.

linux performance tcp congestion-control iperf

8
推荐指数
2
解决办法
4682
查看次数

当转换为double然后返回uint64_t时,strtoull()的输出会失去精度。

考虑以下:

#include <iostream>
#include <cstdint>

int main() {
   std::cout << std::hex
      << "0x" << std::strtoull("0xFFFFFFFFFFFFFFFF",0,16) << std::endl
      << "0x" << uint64_t(double(std::strtoull("0xFFFFFFFFFFFFFFFF",0,16))) << std::endl
      << "0x" << uint64_t(double(uint64_t(0xFFFFFFFFFFFFFFFF))) << std::endl;
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

哪些打印:

0xffffffffffffffff
0x0
0xffffffffffffffff
Run Code Online (Sandbox Code Playgroud)

第一个数字只是将ULLONG_MAX,从字符串转换为的结果,uint64_t按预期方式运行。

但是,如果我将结果转换为double,然后又转换为uint64_t,则它将输出0第二个数字。

通常,我将其归因于浮点数的精度不准确,但令我感到困惑的是,如果我将ULLONG_MAXfrom转换uint64_tdouble,然后再转换回uint64_t,结果是正确的(第三个数字)。

为什么第二和第三结果之间存在差异?

编辑(@Radoslaw Cybulski撰写)有关此处发生的另一个问题,请尝试以下代码:

#include <iostream>
#include <cstdint>
using namespace std;

int main() {
    uint64_t z1 = std::strtoull("0xFFFFFFFFFFFFFFFF",0,16);
    uint64_t z2 = 0xFFFFFFFFFFFFFFFFull;
    std::cout << …
Run Code Online (Sandbox Code Playgroud)

c++ precision strtol strtoull

8
推荐指数
1
解决办法
73
查看次数