Algorithm 在给定范围内寻找最可压缩向量?
我已将正在处理的压缩问题简化为以下问题: 输入两个n长度的浮点值向量: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
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