这个问题来自我给的家庭作业。您可以将存储系统基于以下三种格式之一:
DD MM SS.S
DD MM.MMM
DD.DDDDD
您希望使用尽可能少的字节来最大化您可以存储的数据量。
我的解决方案基于第一种格式。我使用3个字节作为纬度:DD为8比特(-90到90),MM为0比特(0-59),SS.S为10比特(0-59.9)。然后我使用25位经度:DDD为9位(-180到180),MM为6位,SS.S为10位。这个解决方案并不适合在字节边界上,但我认为下一个读数可以紧跟在前一个读数之后存储,而8个读数只能使用49个字节。
我很好奇其他人可以采用什么方法。是否有更有效的方法来存储这些数据?作为一个注释,我考虑了一个基于偏移的存储,但问题没有说明读数之间的值可能会有多大变化,所以我假设任何变化都是可能的。
答案 0 :(得分:2)
您建议的方法不是最佳方法。您正在使用10位(1024个可能的值)来存储范围(0..599)中的值。这是浪费空间。
如果您将3个字节用于纬度,则应将范围[0,2 ^ 24-1]映射到范围[-90,90]。因此,2 ^ 24个值中的每一个代表180/2 ^ 24度,这是0.086秒。
如果你只需要0.1秒的精度,那么纬度需要23位,经度需要24位(准确度为0.077秒)。总共47位而不是49位,精度更高。
我们能做得更好吗?
0.1秒精度所需的确切位数是log2(180 * 60 * 60 * 10 * 360 * 60 * 60 * 10)< 46.256。这意味着您可以使用46256位(5782字节)来存储1000(lat,lon)对,但所涉及的数学将需要处理非常大的整数。
我们能做得更好吗?
这取决于。如果您的数据集具有浓度,则可以使用较少的位仅存储这些点的某些点和相对距离。应该使用聚类算法。
答案 1 :(得分:1)
坚持现有技术:
如果您使用half precision floating point numbers仅存储DD.DDDDD数据,那么您可以获得更高的空间效果,但您必须接受exponent bias的15 ,表示:存储的坐标可能不准确,但偏离原始值。
这是由于浮点数的存储方式,基本上是:标准化的有效乘以指数得到一个数字,而不仅仅是存储一个单个值(如整数,计算解决方案的数字的方式)。
下一个最常用的浮点数机制使用32位(许多编程语言中的“float”类型) - 仍然有效,但比自定义格式大。
但是,如果您也设计自己的自定义浮点类型,并且逐渐添加更多位,则结果会更精确,并且它仍然比您最初找到的解决方案更有效。只需使用用于显着和指数的位数,并找出你的fp近似值接近所需结果的程度!
答案 2 :(得分:0)
那么,如果这是针对大量读数的话,那么您可以尝试差分方法。从绝对位置开始,然后开始保存增量更改,理想情况下需要更少的位,具体取决于更改的性质。这有效地压缩了流。但不知怎的,我不认为这是家庭作业的内容。