找到反向算法以返回初始值

时间:2016-06-09 08:18:50

标签: algorithm math

我遇到了问题并尝试解决了几个小时。这是一个伪代码:

x = 30

if x > 100 then max(function_1(x), function_2(x))
elseif x > 50 then max(function_3(x), function_4(x))
elseif x > 20 then max(function_5(x), function_6(x))
elseif x < 10 then function_7(x)
else function_8(x)

这是我使用x的不同值运行的代码。然后函数是数学公式。现在,我对每个x都有上述结果,我想恢复并再次返回x

我找到了所有相反的函数数学公式。例如,对于function_1(x),我有一个rev_function_1(y)来获得结果,并会给我初始x

但是,由于原始代码有很多情况,加上MAX,我不知道如何为每个值运行一个代码并返回原始代码。

修改:所有功能都是一对一的

Edit2:似乎整个函数都不是one-to-one,而每个函数都是x。因此,每y我有两个def join("users:" <> user_id, _params, socket) do {user_id, _} = Integer.parse(user_id) %{id: id} = socket.assigns[:user] #prevent connection to solo channel of other users, but allow in development case id == user_id || Mix.env == :dev do true -> {:ok, socket} false -> {:error, "This is not your solo channel!"} end end ,我无法将其还原。

5 个答案:

答案 0 :(得分:2)

您需要研究函数的结果空间(或域)。

只有当每个x导致对于x的任何其他值无法获得的唯一f(x)时,才存在逆。此属性称为one-to-one

让我举个例子:

我们说f(1) == 8f(10) == 8。 那么您不知道8的倒数是1还是10

如果函数是one-to-one,则逆将是唯一值。如果它不是一对一,则逆可能不止一个值。

下一步是找出要调用的反转。

一种方法是调用所有子功能的反转。 对于您获得的每个x值,请计算f(x)。如果f(x)返回您想要反转的值,则保留x,否则将其丢弃。

当您浏览完所有值后,您将拥有一个(或多个)匹配的x值。

修改

另一种方法是预先计算对应于某个输出值间隔的函数。您可以将它们作为元组存储在数据库中:

lowerbound, upperbound, inverse_function

然后,您可以找到要使用的函数(假设SQL):

SELECT inverse_function FROM lookup_table 
 WHERE :fx > lowerbound and :fx < upperbound

:fx是您要反转的值。

答案 1 :(得分:0)

每个x都有一个输出y。如果两个x产生相同的y,那么你就无法撤消映射,因为y可能来自x。如果没有两个x产生相同的y,那么你知道它来自y的x。

答案 2 :(得分:0)

NOTE: Since a reverse algorithm is required and OP have not made mandatory to use the original functions or their corresponding reverse functions so following method can be used.

“现在,我对每个x都有上述结果,我想恢复并再次回到x。”。它似乎是[Key] =&gt;的一个例子。 [数值]。

//one-to-many case.
if x > 100 then max(function_1(x), function_2(x))
elseif x > 50 then max(function_3(x), function_4(x))

上面的代码告诉我们,多个不同的输入"x"可以产生相同的输出"y"

因此,如果您使用的是C ++,则可以使用std::multimap

现在multimap可以直接在输入输出级别使用,也就是说,如果给定输入"x"并且在运行所有公式之后产生输出"y",则{{1} }

因此,现在给出输出multimap.insert(std::pair<int,int>(y,x));,您可以找到所有可能产生输出"y"的预期输入"x",如下所示:

"y"

如果输入std::pair <std::multimap<int,int>::iterator, std::multimap<int,int>::iterator> ret; ret = multimap.equal_range(y); for (std::multimap<int,int>::iterator it=ret.first; it!=ret.second; ++it) std::cout << ' ' << it->second; 与其对应的"x"之间的关系为"y",则可以使用std::map

答案 3 :(得分:0)

我认为这是不可能的,让我们来看看这个例子 function_1(x)= x - 200
function_2(x)= x - 201
function_7(x)= x - 5
那么对于x = 200 =&gt; y = 0且x = 5 =&gt; y = 0
因此,对于给定的y值,我们可以有多个x

答案 4 :(得分:-1)

一般情况下没有解决方案。想想这套公式:

function_1(x)  { return x }
function_2(x)  { return x }
function_3(x)  { return x }
....

我想很明显为什么它不起作用。