负相关程序的示例

时间:2019-05-10 07:34:34

标签: c++ c algorithm

我要构造2个负相关的函数,这意味着例如

void program()
{
   f1(x);
   f2(x);
}

f1 f2 函数都依赖于输入 x ,我希望在 f1 执行时间>在增加, f2 应该在减少,反之亦然。

我认为参数 x 是随机生成的数组,而 f1 是排序算法。但是,我想不出 f2 的示例。

有人可以给我一个这样的函数对的例子吗?

编辑1:实际上,我为自己的需求找到了 f1 f2 的示例。最初,我忘记提到那些功能需要现实,这意味着我并不是在每个功能中简单地调用 sleep()。我还写了 x 以便表示一些“抽象”输入,它可以是现实中的任何东西。

我分别构建 f1 f2 如下:

void f1(x)
{
   //sort first x elements of an array
}

void f2(x)
{
   //sort last MAXSIZE - x elements of an array
}

这样,如果我在每个试验中随机创建一个数组和一个 x ,则 f1 f2 将执行完全负相关且 f1 f2 成为现实程序。下面分别是f1和f2执行时间的相关图。

Negative correlated functions

1 个答案:

答案 0 :(得分:1)

如果f1()是O(nlogn)排序过程,则这将要求f2()是O(1 /(nlogn))过程。随着输入大小的增加,此过程将变得更加容易。我从未听说过这样的算法(不是说不存在这样的算法)。

如果总执行时间f2()有某个自然上限,则可以等待一段时间= UPPER_BOUND-估计f1()的执行时间。如果f1()的执行时间knlogn约为k,则

void f2(x)
{
sleep (UPPER_BOUND - k * size(x) * log(size(x)));
}

似乎会起作用。

f1()和f2()不是独立程序而是一起在某些程序上工作的情况是不同的。在这里,我想到了诸如AI搜索之类的问题,该问题可能以正向链接方式或向后链接方式进行。

如果f1()是通过前向链接https://en.wikipedia.org/wiki/Forward_chaining到达目标节点的尝试,而f2()是通过向后链接https://en.wikipedia.org/wiki/Backward_chaining使目标节点在公理集中的尝试,因此f1()和f2()尝试解决搜索问题,然后可能会希望说f1()和f2()具有所需的行为。

如果f1()和f2()并行运行,则很可能如果问题对f1()很容易,那么对f2()就会很困难,反之亦然,因为搜索难度不会对称。

>

这类似于双向搜索问题。实际上,与反思相比,这是一个比乍看起来更具挑战性的问题,因为它可以深入了解整个双向搜索问题的行为。

双向搜索的动机是f1()和f2()将以某种方式“在中间相遇”(请参见Bratko https://slideplayer.com/slide/3351420/),这暗示着它们之间的通信

enter image description here

在您描述的情况下,我认为f1()和f2()不能在sime进行通信,而是成为不同的程序,但是如果一个方向的分支因子与另一方向非常不同,但您所寻找的现象就会出现一开始就不知道最便宜的方向。