想象一下,有两组相同大小的数字。
是否有可能以及如何创建一个函数一个算法或一个将输入项精确映射到输出项的子程序?像:
Input = 1, 2, 3, 4
Output = 2, 3, 4, 5
,功能如下:
f(x): return x + 1
而“功能”是指比[1]更复杂的东西:
f(x):
if x == 1: return 2
if x == 2: return 3
if x == 3: return 4
if x == 4: return 5
这对于创建特殊散列函数或函数近似非常有用。
更新
我想要问的是找出是否有一种方法压缩来自上面[1]的那个简单的映射示例。
答案 0 :(得分:10)
找到输出一些字符串(序列,函数等)的最短程序等同于查找不可判定的Kolmogorov complexity。
如果“不可能”不是一个令人满意的答案,你必须限制你的问题。在所有适当限制的情况下(多项式,有理函数,线性递归),只要您了解自己在做什么,找到最优算法将很容易。例子:
多项式 - Lagrange interpolation
理性功能 - Pade approximation
布尔公式 - Karnaugh map
近似解决方案 - regression,线性案例:linear regression
数据的一般打包 - data compression;一些技术,如游程编码,是无损的,有些则不是。
在多项式序列的情况下,通常有助于考虑序列b n = a n + 1 -a n ;这减少了与线性关系的二次关系,并将线性关系减少到一个常数序列等。但是没有银弹。您可以使用遗传算法,随机猜测,检查许多内置序列及其组合等来构建一些启发式算法(例如,Mathematica有FindSequenceFunction - 检查该页面以获得对此有多复杂的印象)。无论如何,任何这样的程序 - 理论上 - 由于Kolmogorov复杂性的不确定性而与完美无限。在实践中,你可能会得到满意的结果,但这需要很多人年。
另见another SO question。您也可以在应用程序中为OEIS实现一些包装器。
字段:
大多数情况下,可以做的限制在
中描述复杂性理论 - 描述哪些问题可以“快速”解决,比如在图中找到最短路径,哪些不能,比如播放跳棋的通用版本(它们是EXPTIME完成的)。
< / LI>信息理论 - 描述随机变量携带多少“信息”。例如,扔硬币扔。通常,对结果进行编码需要1位,对n进行编码需要n位(使用长0-1序列)。假设你现在有一个有偏见的硬币,它给出了90%的尾巴时间。然后,有可能找到另一种描述n个结果的方法,这些方法平均得到更短的序列。最佳编码所需的每次投掷的比特数(在这种情况下小于1!)称为entropy; plot in that article显示了携带了多少信息(1 / 2-1 / 2为1位,偏置硬币为1位,如果硬币始终位于同一侧则为0位)。
算法信息理论 - 试图加入复杂性理论和信息理论。 Kolmogorov复杂性属于这里。如果它具有大的Kolmogorov复杂度,你可以认为字符串是“随机的”:aaaaaaaaaaa不是随机字符串,f8a34olx可能是。因此,随机字符串是不可压缩的(Volchan's What is a random sequence是一个非常易读的介绍。)。 Chaitin的algorithmic information theory书籍可供下载。引用:“[...]我们构造一个只涉及整数和加法,乘法和取幂的方程,其特性是如果一个参数改变一个参数并询问解的数量是有限的还是无穷大的,那么这个问题的答案就是与独立投掷公平硬币的结果无法区分。“ (换句话说,没有算法能够以概率> 1/2来猜测该结果)。但是我还没看过那本书,所以不能评价它。
与信息理论密切相关的是编码理论,它描述了纠错码。示例结果:可以将4位编码为7位,这样就可以检测并纠正任何单个错误,或检测到两个错误(Hamming(7,4))。
“积极”方面是:
拉格朗日插值和Pade近似的符号算法是computer algebra/symbolic computation的一部分; von zur Gathen,Gerhard“现代计算机代数”是一个很好的参考。
数据压缩 - 在这里你最好向别人询问参考资料:)
答案 1 :(得分:4)
好的,我不明白你的问题,但我会试一试。
如果您只有2组数字并且想要找到f,其中y = f(x),那么您可以尝试curve-fitting为您提供近似的“地图”。
在这种情况下,它是线性的,因此曲线拟合可行。您可以尝试使用不同的模型来查看最适合的模型,并根据最小化误差指标进行选择。
这是你的想法吗?
以下是curve-fitting的另一个链接以及该文章中的图片:
答案 2 :(得分:1)
在我看来,你想要hashtable。它们基于散列函数,并且已知的散列函数比其他函数更好,具体取决于预期的输入和所需的输出。
如果您想要一种将任意输入映射到任意输出的算法,那么在一般情况下这是不可行的,因为它完全取决于输入和输出集。
例如,在那里的普通样本中,函数很明显,f(x): x+1
。在其他情况下,生成描述映射的精确函数可能非常困难甚至不可能,您必须近似或直接使用地图。
答案 3 :(得分:0)
在某些情况下(例如您的示例),linear regression或类似的统计模型可以找到输入和输出集之间的关系。
答案 4 :(得分:0)
在一般情况下这样做是非常困难的。例如,考虑在ECB模式中使用的块密码:它将输入整数映射到输出整数,但是 - 通过设计 - 从特定示例导出任何一般映射是不可行的。事实上,对于一个好的密码,即使输入和输出块之间有完整的映射集,你仍然无法确定如何在一般基础上计算该映射。
显然,密码是一个极端的例子,但它可以说明没有(已知的)一般程序来做你所要求的。
答案 5 :(得分:0)
从输入和输出数据中识别底层地图正是神经网络的意义所在!你无意中偶然发现了计算机科学研究的一个重要分支。