小编LKT*_*LKT的帖子

在 2 个最大堆的并集中查找第 k 个最大元素

这个问题来自采访:

假设第 k 个元素出现在两个堆中,则在 2 个最大堆的并集中查找第 k 个最大元素,时间复杂度为 O(k log n)。

这是我想出的算法:

While k is not zero
 if(root of max-heap #1 > root of max-heap #2)
 {
    extract-max(heap #1)
 }
 else if(root of max-heap #1 < root of max-heap #2)
 {
    extract-max(heap #2)
 }
 else //case of duplicates
 {
    extract-max(heap #1)
    extract-max(heap #2)
 }
 k--
Run Code Online (Sandbox Code Playgroud)

因此,当 k = 0 时,extract-max 函数将提取第 k 大的值。

我认为该算法将在 O(k log n) 时间内运行,因为 extract-max 操作将在 O(log n) 中运行,并且我执行了 k 次。

这是正确的方法吗?看来我没有使用给定的信息“这个第k个元素出现在两个堆中”?有没有更好的方法利用这些信息?

algorithm heap data-structures

5
推荐指数
1
解决办法
605
查看次数

用于检查命令行是否重定向到 /dev/null 的 C 代码

我正在编写一个 C 程序,输出stdoutstderr. 该程序采用如下命令:

./myprogram function_to_run file_to_read
Run Code Online (Sandbox Code Playgroud)

我的程序可以输出到stdout或被定向到输出一个文件,但它不能被重定向到/dev/null. 例如:

./myprogram function_to_run file_to_read //OK
./myprogram function_to_run file_to_read > file.txt //OK
./myprogram function_to_run file_to_read > /dev/null // NOT OK, should produce error in stderr
Run Code Online (Sandbox Code Playgroud)

我尝试使用isatty(1),但它只能检测是否stdout正在输出到终端。因此,它在stdout重定向到文件的情况下失败,这在我的情况下是可以接受的

有没有办法在 C 中检查这个?如果没有,我有什么建议可以检查 /dev/null 场景吗?

c io-redirection dev-null

4
推荐指数
1
解决办法
2349
查看次数

IP和TCP报头校验和在c中计算

我正在编写一个简单的程序来发送/接收TCP数据包并将其合并到一个更大的项目中.我卡在校验和部分,我计算的数字与wireshark数字不匹配.

对于校验和功能,我重新使用Mike Muss的代码如下:

static int
in_cksum(u_short *addr, int len)
{
    register int nleft = len;
    register u_short *w = addr;
    register int sum = 0;
    u_short answer = 0;

    /*
     * Our algorithm is simple, using a 32 bit accumulator (sum), we add
     * sequential 16 bit words to it, and at the end, fold back all the
     * carry bits from the top 16 bits into the lower 16 bits.
     */
    while (nleft > 1)  {
        sum += *w++; …
Run Code Online (Sandbox Code Playgroud)

c ip checksum network-programming tcp

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

使用参数在 perl 脚本中执行 perl 脚本

当我尝试在我的 perl 脚本中执行 perl 脚本时遇到了一个问题。这是我正在进行的一个更大项目的一小部分。

下面是我的 perl 脚本代码:

use strict;
use warnings;
use FindBin qw($Bin);

#There are more options, but I just have one here for short example
print "Please enter template file name: "
my $template = <>;
chomp($template);

#Call another perl script which take in arguments
system($^X, "$Bin/GetResults.pl", "-templatefile $template");
Run Code Online (Sandbox Code Playgroud)

“GetResults.pl”接受多个参数,例如我在这里只提供一个。基本上,如果我单独使用 GetResults.pl 脚本,我会在命令行中输入:

perl GetResults.pl -templatefile template.xml
Run Code Online (Sandbox Code Playgroud)

我在上面的系统函数调用中遇到了两个问题。首先,当我运行我的 perl 脚本导致 GetResults.pl 中的无效参数错误时,它似乎删除了我的参数前面的破折号。

然后我尝试了这个

system($^X, "$Bin/GetResults.pl", "/\-/templatefile $template");
Run Code Online (Sandbox Code Playgroud)

看起来没问题,因为它没有抱怨早期的问题,但现在它说它找不到 template.xml,尽管我将该文件与我的 perl 脚本以及 GetResults.pl 脚本放在同一位置。如果我只是单独运行 GetResults.pl 脚本,它工作正常。

我想知道当我使用变量 $template 和位于我的 …

perl arguments

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