【问题标题】:Algorithm to find bijection between arrays查找数组之间双射的算法
【发布时间】:2011-06-06 13:47:04
【问题描述】:

我有两个数组,比如A={1, 2, 3}B={2, 4, 8}(数组项数和数量可能会有所不同)。如何找到数组之间的双射。

在这种情况下,它将是f:A->B; f(x)=2^(x)

【问题讨论】:

  • 家庭作业有机会吗??
  • 显然没有通用的方法可以做到这一点,除非有额外的限制。有吗?

标签: algorithm wolfram-mathematica bijection


【解决方案1】:

我不认为这个问题有一个通用的解决方案。您可以尝试FindSequenceFunction,但它并不总能找到解决方案。对于手头的情况,您需要更长的列表:

In[250]:= FindSequenceFunction[Transpose[{{1, 2, 3}, {2, 4, 8}}], n]

Out[250]= FindSequenceFunction[{{1, 2}, {2, 4}, {3, 8}}, n]

但是

In[251]:= FindSequenceFunction[Transpose[{{1, 2, 3, 4}, {2, 4, 8, 16}}], n]

Out[251]= 2^n

如果你对双射有一些猜测,你也可以玩FindFit

In[252]:= FindFit[Transpose[{{1, 2, 3}, {2, 4, 8}}], p*q^x, {p, q}, x]

Out[252]= {p -> 1., q -> 2.}

【讨论】:

  • 这个功能网上有算法吗?我需要制作和申请。
  • @Martynas 不幸的是,我不知道FindSequenceFunction 中使用了什么算法。希望这里有更多知识渊博的人对此发表评论。
  • 是的,这些都很好,但事实上,我需要编写自己的应用程序 :) 它的任务;]
  • @belisarius 感谢您的链接,看起来很有趣。我想知道这确实可以在多大程度上实现自动化。但无论如何,Mathematica 绝对是适合这项工作的工具。
【解决方案2】:

正如其他人所说,这个问题定义不明确。

给出相同结果的其他可能函数是(可能还有无数其他函数):(8 x)/3 - x^2 + x^3/3, x + (37 x^2)/18 - (4 x ^3)/3 + (5 x^4)/18 和 (259 x^3)/54 - (31 x^4)/9 + (35 x^5)/54。

我使用以下方法找到了这些解决方案:

n = 5; (* try various other values *)
A = {1, 2, 3} ; B = {2, 4, 8}
eqs = Table[
  Sum[a[i] x[[1]]^i, {i, n}] == x[[2]], {x, {A, B}\[Transpose]}]
sol = Solve[eqs, Table[a[i], {i, n}], Reals]
Sum[a[i] x^i, {i, n}] /. sol

有时并不是所有的 a[i] 都是完全确定的,您可能会想出自己的值。

[提示:在 Mathematica 中最好不要使用以大写字母开头的变量,以免与保留字发生冲突]

【讨论】:

  • 可能(我猜)标题应该是 Find ONE bijection ... 在这种情况下任何插值都可以做
  • 我需要一个算法,而不是一个具体的解决方案,如果我的问题不清楚,请原谅。
  • @martynas 上面蓝色代码块中的代码可以认为是一种算法,可以找到一些连接两个系列的规则。改变 n 提供了各种解决方案。
【解决方案3】:

由于您标记了 Mathematica,我将使用 Mathematica 函数作为参考。

如果您对使用平滑函数任意拟合数据感兴趣,可以使用插值法。例如

a = {1, 2, 3}; b = {2, 4, 8};
f = Interpolation[Transpose[{a, b}]];

(* Graph the interpolation function *)
Show[Plot[f[x], {x, 1, 3}], Graphics[Point /@ Transpose[{a, b}]], 
   PlotRange -> {{0, 4}, {0, 9}}, Frame -> Automatic, Axes -> None]

插值使用分段多项式。如果您碰巧知道或愿意学习一点数值方法,尤其是 B 样条曲线,您可以使用自己喜欢的编程语言来做同样的事情。

如果您对自己的数据有所了解,例如它的形式为 c d^x,那么您可以进行最小化以找到未知数(在这种情况下为 c 和 d)。如果您的数据实际上是从 c d^x 形式生成的,那么拟合将是公平的,否则在最小二乘意义上将误差最小化。所以对于你的数据:

FindFit[Transpose[{a, b}], c d^x, {c, d}, {x}]

报告:

{c -> 1., d -> 2.}

表明你的函数是 2^x,正如你一直知道的那样。

【讨论】:

  • +1。在您的示例中可能无关紧要,但 Mark McClure 向我指出 here 从版本 6 开始您可以使用 Point@Transpose[{a, b}](而不是 Point /@ Transpose[{a, b}]),而且这种语法效率更高.您可能已经意识到这一点。 (我不是,直到马克指出)
  • @TomD 谢谢!我不知道!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-09
  • 2015-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多