基本上我有一个大的(可以达到100,000-150,000个值)4字节输入数据集及其相应的4字节输出。输入不保证是唯一的(这不是一个真正的问题,因为我想我可以生成伪随机数来添加或xor输入,以便它们确实变得唯一),但输出不保证也是唯一的(因此两组不同的输入可能具有相同的输出)。
我正在尝试创建一个有效模拟数据集中值的函数。我不需要它有效插值,甚至根本不需要它(我的意思是我永远不会给它提供一个未包含在这个静态数据集中的输入)。但它确实需要尽可能高效。我研究了插值,发现它并不适合我正在寻找的东西。例如,大量的值意味着样条插值不会这样做,因为它会为每个间隔创建一个多项式。
另外,根据我的理解,多项式插值在计算上太昂贵了(n值意味着多项式可以包括与pow(x,n-1)一样高的项。对于x = 4字节数和n = 100,000这是不可行的)。我已经尝试过在网上寻找一段时间了,但我对数学不是很强,并且一定不知道要搜索的正确术语,因为到目前为止我还没有遇到类似的事情。
我可以看到,这并非完全(温和地说)一个编程问题,我提前道歉。我不是在寻找确切的解决方案,甚至不是完整的答案。我只需要指出我需要阅读的主题,以便我可以自己解决这个问题。谢谢!
TL; DR - 我需要一种插值变体,只需要适合最初给定的数据点,但计算效率很高。
编辑: 一些澄清 - 我确实需要输出准确而不是近似值。这是我正在进行的一些研究工作的优化,我需要实现这种查找,而不会在我的程序中存在输出的实际字节。我目前还不能真正说清楚它,但我会说,出于我的工作目的,加密(或压缩或任何其他形式的混淆)不是隐藏表格的选项。我需要一个可以重新创建输出的数学函数,只要它可以访问输入。我希望能稍微澄清一下。
答案 0 :(得分:0)
由于你没有对函数施加任何限制(连续,平滑等),你可以简单地进行分段常数插值:
或线性插值:
我假设您可以毫不费力地弄清楚如何构建这样的函数。
编辑:根据您的额外要求,此类功能应“隐藏”数据点...
对于分段常数插值,应该将常数间隔随机化,以便不显示数据点的位置。因此,例如在图片中,间隔以其内插的数据点为中心。相反,您可能想要执行以下操作:
[0 , 0.3) -> 0
[0.3 , 1.9) -> 0.8
[1.9 , 2.1) -> 0.9
[2.1 , 3.5) -> 0.2
etc
当然,这只隐藏了x坐标。要隐藏y坐标,也可以使用线性插值。
只需将其设为“尖”部分不是数据点的位置。选择随机x值,使得每个相邻数据点之间具有这些x值之一。然后进行插值,使“尖”部分处于这些x值。
答案 1 :(得分:0)
这是一个想法。使函数成为所有4字节整数的线性函数的和(mod 2 32 ),一个分段线性函数,其片段取决于第一位的值,另一个分段线性函数的片段取决于前两位的值,依此类推。
实际输出值无处可见,您必须将线性项加在一起才能得到它们。您也没有直接记录您的输入值。 (有人可以总结一下这些输入值,但不是它们的实际值。)
您需要的各种系数可以存储在哈希中。您在散列中找不到的任何查找都假定为0。
如果在开始对数据集进行相当有效的编码之前向数据集添加一定量的随机“噪声”,则很难分辨出输入值是什么,并且很难在不知道的情况下判断输出是什么输入。
答案 2 :(得分:0)
我建议使用大量Lookup Table个未使用的条目。它是一种蛮力方法,具有一个有序的输出表,按输入的每个可能值排序(不仅是数据集,还包括所有其他可能的4字节值)。
虽然您的所有数据都存在,您可以使用随机,任意或随机(随机可能复杂的约束)数据填充未使用的输入。如果你让它有说服力,没有人可以从中挑选你的真实数据。如果是真实的"函数内插了你的所有数据,它还包含"包含"您的实际数据的所有信息,有权访问它的任何人都可以使用它来生成如上所述的LUT 。
LUT闪电般快,但内存很饥渴。你的情况处于可行性的边缘,需要(2 ^ 32)* 32 = 16千兆字节的RAM,这需要64位机器才能运行。这仅适用于数据,而不适用于程序,操作系统或其他数据。对have 24, just to be sure来说更好。如果你负担得起,它们就是你要走的路。