如何计算将一个排序顺序转换为另一个排序顺序的绝对最小变化量?

时间:2010-01-15 19:56:07

标签: algorithm optimization sorting computer-science

目标

如何编码描述如何使用尽可能少的字节数将静态列表从一个订单重新排序到另一个订单的数据?

原始动机

最初,在使用昂贵的卫星通信处理传感器数据的问题时出现了这个问题。一台设备列出了他们正在监控的大约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

假设

  • 起始列表和结束列表由完全相同的项目组合
  • 组成
  • 每个传感器都有一个唯一的id(32位整数)
  • 列表的大小约为1,000个项目
  • 每个传感器可能每分钟发射多次或根本不发射数天
  • 只需要中继ID排序顺序的更改。
  • 用于计算最佳解决方案的计算资源是廉价/无限的
  • 数据成本很高,大约每千字节一美元。
  • 数据只能以整个字节(八位字节)为增量发送
  • 第0天订单由发件人和收件人知道
  • 现在假设系统功能完美,无需进行错误检查

正如我所说,项目/硬件不再如此,现在这只是一个学术问题。

挑战!

定义编码器

  • 鉴于A. Day N排序顺序
  • 鉴于B. Day N + 1排序
  • 返回C.一组字节,描述如何使用尽可能少的字节数将A转换为B

定义解码器

  • 鉴于A. Day N排序顺序
  • 鉴于B.字节集合
  • 返回C. Day N + 1排序

让每个人都开心。

1 个答案:

答案 0 :(得分:1)

作为一个学术问题,一种方法是查看Knuth的第二卷的算法P第3.3.2节,计算机编程的艺术,它将N个对象的每个排列映射到0到N!-1之间的整数。如果每个可能的排列在任何时候都同样可能,那么您可以做的最好的事情就是计算并传输这个(多精度)整数。实际上,给每个传感器一个10位数字,然后将这10个数字打包,这样就可以得到在5个字节的每个块中打包4个数字几乎也可以。

基于差异或现成压缩的方案利用了并非所有排列都具有同等可能性的知识。您可能已根据设备了解此情况,或者您可以通过查看以前的数据来查看是否是这种情况。很好,如果它的工作。在某些使用传感器和卫星的情况下,您可能需要担心罕见的异常,在这种情况下,您会遇到压缩方案的最坏情况,并且突然有比您讨价还价更多的数据传输。