目标
如何编码描述如何使用尽可能少的字节数将静态列表从一个订单重新排序到另一个订单的数据?
原始动机
最初,在使用昂贵的卫星通信处理传感器数据的问题时出现了这个问题。一台设备列出了他们正在监控的大约1,000个传感器。传感器列表无法更改。每个传感器都有一个唯一的ID。所有数据都在内部记录以进行最终分析,最终用户每天唯一需要的是哪个传感器以哪种顺序触发。
整个项目都被取消了,但这个问题似乎太有趣了,不容忽视。此外我之前谈过“掉期”,因为我正在考虑排序算法,但实际上整个订单很重要,达到该订单所需的步骤可能无关紧要。
如何订购数据
在SQL术语中,你可以这样想。
**Initial Load**
create table sensor ( id int, last_detected datetime, other stuff )
-- fill table with ids of all sensors for this location
Day 0: Select ID from Sensor order by id
(initially data is sorted by the sensor.id because its a known value)
Day 1: Select ID from Sensor order by last_detected
Day 2: Select ID from Sensor order by last_detected
Day 3: Select ID from Sensor order by last_detected
假设
正如我所说,项目/硬件不再如此,现在这只是一个学术问题。
挑战!
定义编码器
定义解码器
让每个人都开心。
答案 0 :(得分:1)
作为一个学术问题,一种方法是查看Knuth的第二卷的算法P第3.3.2节,计算机编程的艺术,它将N个对象的每个排列映射到0到N!-1之间的整数。如果每个可能的排列在任何时候都同样可能,那么您可以做的最好的事情就是计算并传输这个(多精度)整数。实际上,给每个传感器一个10位数字,然后将这10个数字打包,这样就可以得到在5个字节的每个块中打包4个数字几乎也可以。
基于差异或现成压缩的方案利用了并非所有排列都具有同等可能性的知识。您可能已根据设备了解此情况,或者您可以通过查看以前的数据来查看是否是这种情况。很好,如果它的工作。在某些使用传感器和卫星的情况下,您可能需要担心罕见的异常,在这种情况下,您会遇到压缩方案的最坏情况,并且突然有比您讨价还价更多的数据传输。