Frame Of Reference压缩算法

news2025/4/12 13:58:39

文章目录

  • 1_概述
  • 2_算法基本步骤
  • 3_过程优化
  • 4_优势以及局限
  • 5_模拟实现
  • 6_总结

1_概述

Frame of Reference(FoR)压缩算法 是一种用于压缩数值数据的算法,特别是在处理大规模数据集时,利用数据的局部性和重复性来减少存储和传输的开销。

该算法通常应用于数据库、数据压缩、信号处理、以及大数据分析等领域。

Frame of Reference压缩算法 的核心思想是,通过将数据的最小值作为参考点,将所有数据与这个参考点进行偏移,然后存储相对值(即“偏移量”)。

这样可以有效地减少需要存储的数字位数,尤其是在数据的范围比较小且有较多重复值时,能够显著提高压缩率。

2_算法基本步骤

可以分为如下四个步骤:

选择参考值
计算偏移量
存储偏移量
解压缩

选择参考值:从数据集中的所有值中选择一个最小值(或称为“参考点”),这个值作为参照,用于后续的压缩过程。

计算偏移量:对数据集中的每个数值,计算它与参考值的差(即偏移量)。如果数据集中的数值接近参考值,那么它们的偏移量会较小,所需的存储空间也会较少。

存储偏移量:将所有的偏移量存储下来,而不直接存储原始数据。由于偏移量通常较小,可以使用较少的比特数进行编码,从而达到压缩的效果。

解压缩:解压时,使用存储的参考值将偏移量还原为原始数值。

举个例子——假设我们有一个数值数据集:

[10, 12, 14, 11, 13, 10, 10]

选择数据中的最小值 10 作为参考值,计算偏移量

  • 10 -> 10 - 10 = 0
  • 12 -> 12 - 10 = 2
  • 14 -> 14 - 10 = 4
  • 11 -> 11 - 10 = 1
  • 13 -> 13 - 10 = 3
  • 10 -> 10 - 10 = 0
  • 10 -> 10 - 10 = 0

得到的结果是偏移量数组:

[0, 2, 4, 1, 3, 0, 0]

由于偏移量范围较小(0到4),我们可以用较少的比特数来存储这些值。例如,我们可以使用3位二进制数来表示每个偏移量。这样,存储的空间将比存储原始数据(每个数值可能需要至少4个字节)要小。

解压时,我们将偏移量恢复到原始值,再加上参考值 10,得到原始数据集。

3_过程优化

经过上面的分析我们已经了解到了算法的整个逻辑,但是这里还不是极限,我们还可以进一步优化。

优化一

以数组中的最小值作为参考得到的差值并不是最小的,反而是最大的。所以我们希望得到更小的差值以减少存储差值的内存大小。

怎么做呢?

我们让数组中所有存储的元素变得有序(需要看使用场景),存储第一个元素的值,且每一个元素选取上一个元素作为参照存储差值,然后再根据差值数组中最大值的bit位选择合适的存储类型。

过程如下

[10, 12, 14, 11, 13, 10, 10] -> [10, 10, 10, 11, 12, 13, 14] -> 10 [0, 0, 1, 1, 1, 1]

这里示例减少的空间可能不是很明显,但是如果在初始值特别大且数据特别密集的情况下优化会很明显(比如第一个数 65535,差值一直为 1:用 int 表示初始值,byte 数组存储差值)。

优化二

如果经过优化一的过程之后存在一个数组的差值和其他元素相比差距过大,显得十分突兀,导致差值数组不能选择更小更合适的存储类型,影响编码效率该怎么办呢?如下情况:

[10, 12, 14, 650, 651, 652] -> 10 [2, 636, 1, 1, 1]

我们可以对数组进行拆分,将其拆分成多份存储,每块单独使用自己的基准值和差值集合,如下:

10 [2, 2] 650 [1, 1]

经过如上优化可以有效的将其压缩到合适的大小。

另外:由于还需要解压,所以别忘了使用一定空间指出每个数组占用的空间大小。

4_优势以及局限

优势:

  • 空间效率:如果数据集中有很多相同的数值或者数值差异较小,FoR压缩能够显著减少存储需求。

  • 简单高效:该算法的实现相对简单,适用于某些类型的连续数值数据。

局限性:

  • 对数据的分布有依赖:当数据差异较大或分布不均匀时,FoR压缩可能效果不佳,因为参考值的选取并不能有效压缩整个数据集。

  • 适用场景限制:这种算法通常适用于数值类型较为接近且重复性较高的数据,若数据值较为分散或随机,FoR压缩的效果就不如其他复杂的压缩算法(如Huffman编码、LZ77等)。

较为稀疏的数组就不适合选用此算法,可能需要其他的算法(如 Roaring Bitmaps 算法):

[1000W, 2000W, 3003W, 5248W, 9548W]

5_模拟实现

Java模拟实现

import java.util.*;

public class FrameOfReferenceCompressor {

    static class Block {
        int base;           // 当前块的起始基准值
        List<Integer> deltas;  // 差值集合

        Block(int base) {
            this.base = base;
            this.deltas = new ArrayList<>();
        }

        public String toString() {
            return base + " " + deltas.toString();
        }
    }

    /**
     * 压缩主方法
     */
    public static List<Block> compress(int[] input, int maxDeltaThreshold) {
        List<Block> blocks = new ArrayList<>();
        if (input == null || input.length == 0) return blocks;

        Block currentBlock = new Block(input[0]);
        blocks.add(currentBlock);
        int prev = input[0];

        for (int i = 1; i < input.length; i++) {
            int delta = input[i] - prev;

            if (delta > maxDeltaThreshold) {
                // 如果当前差值过大,新建一个块
                currentBlock = new Block(input[i]);
                blocks.add(currentBlock);
                prev = input[i];
            } else {
                currentBlock.deltas.add(delta);
                prev = input[i];
            }
        }

        return blocks;
    }

    /**
     * 解压缩方法
     */
    public static List<Integer> decompress(List<Block> blocks) {
        List<Integer> result = new ArrayList<>();

        for (Block block : blocks) {
            int base = block.base;
            result.add(base);
            for (int delta : block.deltas) {
                base += delta;
                result.add(base);
            }
        }

        return result;
    }

    public static void main(String[] args) {
    	// 有序数组
        int[] input = {10, 12, 14, 650, 651, 652, 900, 1000, 1010};

        // 设置一个差值阈值,超过则拆块(比如这里设置为100)
        List<Block> compressed = compress(input, 100);

        System.out.println("🔒 压缩结果:");
        for (Block block : compressed) {
            System.out.println(block);
        }

        System.out.println("\n🔓 解压后恢复:");
        List<Integer> decompressed = decompress(compressed);
        System.out.println(decompressed);
    }
}

可以看到这里使用的是有序数组,至于应用场景,也就是我写这篇博客的初衷了,ES存储倒排索引时可能会使用 Frame Of Reference 压缩算法,倒排表中 term 对应的就是 id 有序数组,总体过程如下(跟我们模拟的差不多):

在这里插入图片描述

6_总结

应用场景:

  1. 数据库压缩:对于表中数值类型的数据,FoR压缩可以减少存储空间,尤其是在数值差异不大的情况下(ES)。

  2. 图像和视频压缩:在一些图像和视频压缩算法中,FoR也可用于对某些图像区域的亮度或色彩信息进行压缩。

  3. 科学计算与模拟:在模拟计算中,FoR可以减少大规模数据集的存储需求,尤其是在需要存储数值型模拟结果时。

总结来说,Frame of Reference压缩算法 是一种通过引用最小值来减少数据存储需求的技术,适用于有一定规律性或重复性的数值数据。

虽然它的应用场景有限,但在特定情况下,它能够大幅提高压缩效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2329399.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

esp32cam 开发板搭载ov3660摄像头在arduino中调用kimi进行图像识别

首先呢,最近搞一个项目,需要一个摄像头拍摄图片 就买了个ov3660开发板,用的esp32S芯片 淘宝商家给的教程是arduino的,所以先用arduino跑起来 arduino配置esp32-cam开发环境 - 简书1、安装arduino https://www.arduino.cc/en/Main/Software?setlang=cn 2、配置esp32 打开…

二十种中药果实识别分类系统,Python/resnet18/pytorch

二十种中药果实识别分类系统,Python/resnet18/pytorch 基于pytorch训练, resnet18网络&#xff0c;可用于训练其他分类问题&#xff0c;也可自己重新训练 20类中药材具体包括&#xff1a;(1) 补骨脂&#xff0c;(2) 草豆蔻&#xff0c;(3) 川楝子&#xff0c;(4) 地肤子&…

如何实现两个视频融合EasyCVR平台的数据同步?详细步骤指南

有用户咨询&#xff0c;现场需要数据库同步&#xff0c;如何将两个EasyCVR平台的数据进行同步呢&#xff1f; 这篇文章我们将详细介绍如何通过简单的接口调用&#xff0c;高效完成两个平台的数据同步操作。 1&#xff09;获取token 使用Postman调用登录接口&#xff0c;获取…

WindowsPE文件格式入门05.PE加载器LoadPE

https://bpsend.net/thread-316-1-1.html LoadPE - pe 加载器 壳的前身 如果想访问一个程序运行起来的内存,一种方法就是跨进程读写内存,但是跨进程读写内存需要来回调用api,不如直接访问地址来得方便,那么如果我们需要直接访问地址,该怎么做呢?.需要把dll注进程,注进去的代码…

使用Cusor 生成 Figma UI 设计稿

一、开发环境 系统&#xff1a;MacOS 软件版本&#xff1a; Figma&#xff08;网页或APP版&#xff09; 注&#xff1a;最好是app版&#xff0c;网页版figma 没有选项 import from manifest app下载地址&#xff1a;Figma Downloads | Web Design App for Desktops & …

Golang的文件同步与备份

Golang的文件同步与备份 一、Golang介绍 也称为Go语言&#xff0c;是谷歌开发的一种编程语言&#xff0c;具有高效的并发编程能力和出色的内存管理。由于其快速的编译速度和强大的标准库&#xff0c;Golang在网络应用、云平台和大数据等领域得到了广泛应用。 二、文件同步与备份…

如何用人工智能大模型,进行作业批改?

今天我们学习人工智能大模型如何进行作业批改。手把手学习视频请访问https://edu.csdn.net/learn/40402/666452 第一步&#xff0c;进入讯飞星火。打开google浏览器&#xff0c;输入百度地址后&#xff0c;搜索”讯飞星火”&#xff0c;在搜索的结果中&#xff0c;点第一个讯飞…

MATLAB之数据分析图系列 三

三维堆叠柱状图 Bar3StackPlot.m文件 clc; clear; close all; %三维堆叠柱状图 %% 数据准备 % 读取数据 load data.mat % 初始化 dataset X; s 0.4; % 柱子宽度 n size(dataset,3); % 堆叠组数%% 图片尺寸设置&#xff08;单位&#xff1a;厘米&#xff09; figureUnits c…

python爬虫:DrissionPage实战教程

如果本文章看不懂可以看看上一篇文章&#xff0c;加强自己的基础&#xff1a;爬虫自动化工具&#xff1a;DrissionPage-CSDN博客 案例解析&#xff1a; 前提&#xff1a;我们以ChromiumPage为主&#xff0c;写代码工具使用Pycharm&#xff08;python环境3.9-3.10&#xff09; …

一、STM32简介

一、实验器材介绍 二、STM32简介 1.STM32 名词解释 STM32是ST公司基于ARM Cortex-M内核开发的32位微控制器。 ST&#xff0c;指ST公司&#xff08;意法半导体&#xff09;;M&#xff0c;MicroController 微控制器&#xff08;MCU,MicroController Unit 微控制器单元/单片机&…

[ctfshow web入门] web2

前置知识 js是可以写在网页中&#xff0c;用于控制网页行为&#xff0c;例如现在表现出无法使用F12&#xff0c;常见用法校验前台登录时输入的邮箱格式是否正确 ‌view-source‌协议是一种早期就存在的协议&#xff0c;基本上所有主流浏览器都支持这一协议&#xff0c;因此用户…

PyQt5和OpenCV车牌识别系统

有需要请加文章底部Q哦 可远程调试 PyQt5和OpenCV车牌识别系统 一 介绍 此车牌识别系统基于PyQt5和OpenCV开发&#xff0c;蓝牌&#xff0c;新能源(绿牌)&#xff0c;黄牌&#xff0c;白牌均可以准确识别&#xff0c;支持中文识别&#xff0c;可以导出识别结果(Excel格式)。此…

【Android Studio 下载 Gradle 失败】

路虽远行则将至&#xff0c;事虽难做则必成 一、事故现场 下载Gradle下载不下来&#xff0c;没有Gradle就无法把项目编译为Android应用。 二、问题分析 观察发现下载时长三分钟&#xff0c;进度条半天没动&#xff0c;说明这个是国外的东西&#xff0c;被墙住了&#xff0c;需…

Xshell Plus 6下载与安装

文章目录 Xshell Plus 6 简介&#xff08;一&#xff09;网络连接与协议支持&#xff08;二&#xff09;会话管理&#xff08;三&#xff09;安全特性&#xff08;四&#xff09;文件传输功能&#xff08;因集成Xftp 6 &#xff09;&#xff08;五&#xff09;个性化与便捷功能…

九、重学C++—类和函数

上一章节&#xff1a; 八、重学C—动态多态&#xff08;运行期&#xff09;-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/147004745?spm1001.2014.3001.5502 本章节代码&#xff1a; cpp/cppClassAndFunc.cpp CuiQingCheng/cppstudy - 码云 - 开源中国…

使用MCP服务器实现AI任务完成通知:让Cursor更智能

0. 简介 在使用AI工具进行长时间任务时&#xff0c;常常需要等待结果。MCP&#xff08;Model Context Protocol&#xff09;服务器"mcp_server_notify"提供了一个优雅的解决方案&#xff0c;让AI在完成任务后通过系统通知提醒你。本文将介绍如何在Cursor中配置和使用…

解决 Hugging Face SentenceTransformer 下载失败的完整指南:ProxyError、SSLError与手动下载方案

问题背景 在使用 Hugging Face 的 SentenceTransformer 加载预训练模型 all-MiniLM-L6-v2 时&#xff0c;遇到了以下错误&#xff1a; 代理连接失败&#xff08;ProxyError / SSLError: KRB5_S_TKT_NYV&#xff09;大文件下载中断&#xff08;unexpected EOF while reading&a…

Linux | I.MX6ULL开发板固件烧录所需文件详述(9)

01 搞清楚手里的开发板是 EMMC 还是 NAND FLASH 。默认我的商业级是EMMC ,开关:10011010 终结者i.MX6ULL 开卡板分为工业级和商业级两种不同的开发板。 商业级的核心板,它的存储是 EMMC 的,EMMC 的存储是类似于正方形的芯片,旁边是 NAND FLASH的一个封装,因为我们这里…

论文阅读笔记:Denoising Diffusion Implicit Models (5)

0、快速访问 论文阅读笔记&#xff1a;Denoising Diffusion Implicit Models &#xff08;1&#xff09; 论文阅读笔记&#xff1a;Denoising Diffusion Implicit Models &#xff08;2&#xff09; 论文阅读笔记&#xff1a;Denoising Diffusion Implicit Models &#xff08…

【AI论文】GPT-ImgEval:一个用于诊断GPT4o在图像生成方面的综合基准

摘要&#xff1a;OpenAI的GPT4o模型最近的突破在图像生成和编辑方面展现了令人惊讶的良好能力&#xff0c;引起了社区的极大兴奋。 本技术报告介绍了第一眼评估基准&#xff08;名为GPT-ImgEval&#xff09;&#xff0c;定量和定性诊断GPT-4o在三个关键维度的性能&#xff1a;&…