Algorithm 在给定范围内寻找最可压缩向量?

Algorithm 在给定范围内寻找最可压缩向量?,algorithm,math,compression,Algorithm,Math,Compression,我已将正在处理的压缩问题简化为以下问题: 输入两个n长度的浮点值向量: float64 L1, L2, ..., Ln; float64 U1, U2, ..., Un; 就我所知 0.0 <= Li <= Ui <= 1.0 这样,对于所有人,我: L1 <= Xi <= Ui 那会很小 有人能提出一个策略、算法或架构来解决这个问题吗?这个简单的启发式方法非常快,如果边界允许非常好的压缩,那么应该提供非常好的压缩: 在所有候选值上准备任意(虚拟)二叉搜索树f

我已将正在处理的压缩问题简化为以下问题:

输入两个n长度的浮点值向量:

float64 L1, L2, ..., Ln;
float64 U1, U2, ..., Un;
就我所知

0.0 <= Li <= Ui <= 1.0
这样,对于所有人,我:

L1 <= Xi <= Ui
那会很小


有人能提出一个策略、算法或架构来解决这个问题吗?

这个简单的启发式方法非常快,如果边界允许非常好的压缩,那么应该提供非常好的压缩:

在所有候选值上准备任意(虚拟)二叉搜索树
float64
s与
signed int64
s共享排序顺序,因此您可以任意选择(更接近根)具有更多尾随零的值

  • 对于每对边界
    • 从根开始
    • 当当前节点大于两个边界或小于两个边界时,
      • 从树上下来
    • 将当前节点追加到向量中
对于上面提到的树,这意味着

  • 用于每对边界
    • 在指定范围内找到有效位尽可能少的(唯一)编号。也就是说,找到两个边界不同的第一位;将其设置为
      1
      ,并将以下所有位设置为
      0
      ;如果设置为
      1
      的位是符号位,则将其改为
      0
然后,您可以将其提供给
deflate
ing库进行压缩(并构建自解压存档)


如果您分析数据并构建不同的二元搜索树,则可能实现更好的压缩。由于数据集非常大,并且以数据流的形式到达,因此可能不可行,但这是一种启发式方法:

  • 而输出没有完全定义
    • 查找符合最未确定边界的任何值:
      • 将所有边界排序在一起:
        • 具有较低值的边界在具有较高值的边界之前排序
        • 下界排序在具有相同值的上界之前
        • 不可区分的边界被分组在一起
      • 计算打开间隔的运行总数
      • 选择最大的总数。上限或下限都可以。您甚至可以尝试通过使用最少的有效位分割间隔来做出“明智的选择”
    • 将此值设置为可使用的所有位置的输出

不必重新计算排序顺序,您可以缓存排序顺序并仅从中删除,甚至还可以缓存运行总数(或者从重新计算运行总数切换到在运行时缓存运行总数)。这不会改变结果,只会提高运行时间。

如果在此处找不到答案,请尝试。
deflate
擅长压缩数据。也许您可以使用
deflate
搜索易于压缩的数据,然后使用.zip库将其包装到自解压存档中。当然,但是我们如何确定哪个X是deflate最可压缩的?你接受启发式还是需要最优解?如果没有精确解,近似解是可以的。
L1 <= Xi <= Ui
for i in 1 to n
    output 0.35