Algorithm 29位有序序列的无损压缩(每个0到5 Likert标度)

Algorithm 29位有序序列的无损压缩(每个0到5 Likert标度),algorithm,compression,Algorithm,Compression,我有一个29个问题的调查,每个问题都有一个5分的Likert量表(0表示没有一个问题;4表示大部分时间)。我希望将整个响应集压缩为少量的字母或字母数字字符,并在末尾添加一个校验位 因此,响应集00101244231023110242231421211将变成类似于A2CR7HW4的内容。此输出将是打印输出的一部分,非技术用户将在网站上输入该打印输出作为输入整个字符串的快捷方式。我希望避免使用模棱两可的字符,例如0、O、d、I、l、5、S,这样我就可以使用21或22个字符(仅大写)。或者,我可以只使

我有一个29个问题的调查,每个问题都有一个5分的Likert量表(0表示没有一个问题;4表示大部分时间)。我希望将整个响应集压缩为少量的字母或字母数字字符,并在末尾添加一个校验位

因此,响应集
00101244231023110242231421211
将变成类似于
A2CR7HW4
的内容。此输出将是打印输出的一部分,非技术用户将在网站上输入该打印输出作为输入整个字符串的快捷方式。我希望避免使用模棱两可的字符,例如
0、O、d、I、l、5、S
,这样我就可以使用21或22个字符(仅大写)。或者,我可以只使用大写字母alpha并使用全部26个字符

我想把每一对数字转换成一个字母(5^2=25,这样整个字母表就足够了)。这将把序列减少到15个字符,这仍然是渴望输入没有错误

关于如何最小化输出长度的任何其他建议


编辑:顺便说一句,调查询问了29个关于精神健康症状的问题,产生了4种精神疾病的预测风险。需要一个表示所有响应的代码。

您使用的是特定语言吗

如果你想节省精力,你可能需要考虑在比特级别上对数据进行编码。 由于每个问题只有5个可能的答案,因此您只需3位即可完成此操作:

000
001
010
011
100
您的最终结果将是一个位串,每个答案3位,因此总共87位或10位字节

编辑-稍微误读问题,有5个可能的答案,不是4个,我的错误

现在唯一的问题是,在你的5个答案中,有4个是浪费了一点…你不会从这么多麻烦中受益,我不会说,但这是值得考虑的

编辑:

我一直在玩弄它,很难找到一种机制让你同时使用2位和3位值

由于您的输出是97位二进制值,因此在转换回原始值时,您需要能够区分2位和3位值

如果您使用的是大量的值,那么可以使用一些方法,例如为每个值保留一个保留位,用于对值类型进行排序并赋予它某种意义。但是使用如此少的钻头工作,很难剃掉任何东西

您97位的输出可以填充到128位,如果您想简化它,这将为您提供4个32位的值。这个128位的值就像一个代表一组特定答案的唯一指纹。有很多方法可以表示128位


但最终,位级的压缩和编码与实际数据压缩和编码一样好……如果你能在不到3位的时间内表达5个唯一值,我会印象深刻。

首先,选择一组允许的字符,即

characters = "ABC..."
然后,用1作为输入数字的前缀,并将其解释为五进制数:

100101244231023110242231421211
现在,将此五进制数转换为基数中的数字-“strlen(characters)”,即base26,如果要使用26个字符:

02 23 18 12 10 24 04 19 00 15 14 20 00 03 17
然后,使用这些数字作为“字符”中的索引,您就有了编码:

CVSMKWETAPOUADR

对于解码,只需颠倒步骤。

如果五个答案的可能性都相同,那么最好的方法是
上限(29*log(5)/log(n))
符号,其中
n
是字母表中的符号数。(对数的底数无关紧要,只要它们都相同。)

所以对于你的22个符号,你能做的最好的是16个。对于26个符号,最好的是15个,正如您在25个符号中所描述的那样。如果使用49个字符(例如,一些大小写字符和数字的子集),则可以减少到12个。对于可打印的ASCII字符,您最多只能使用11个字符,使用94个字符中的70个


唯一的办法是,如果回答的可能性不尽相同,并且严重倾斜,那么答案就会变小。如果是这样的话,那么调查可能有问题。

如何用两位表示5值范围?请原谅,你不能-你可能能够找到一种处理2位和3位值的方法,如果可能的话,这需要一点眉头紧锁,但可能不值得努力。@Nunchy您不能在小于3位的时间内表达5个值,但可以在小于n*3位的时间内表达n5个值。@Nunchy目前没有特定的语言。首先,在Excel(!)中创建原型。最终将出现在.net或java中。我想到了四分之五的可能答案中浪费的部分,但不会弄乱2和3的混合;我最终不太可能省很多钱,而且可能不值得为此付出那么多努力。不确定为什么这些调查的结果需要以这样的格式手动输入,但似乎这更多的是关于如何方便地表示一整套答案,以便于用户阅读和输入。有很多方法可以做到这一点。你以一种实用的方式充实了我最初的想法,所以这很有帮助。但它能进一步缩短吗?(我不认为它可以。)我认为仅仅使用编码是不行的。而且数据可能太少,无法使用真正的压缩算法。如果数字经常重复,运行长度编码可能会带来一些好处,但情况似乎并非如此。我研究了RLE,但运行时间不够长,无法使其可行。@HITshrink此方案的缺点是,通过损坏单个字母,可能损坏多个答案。我知道你打算用一个校验位,但是…@DavidEisenstat当然,你在一个字符中传递的信息越多,如果该字符被破坏,那么被破坏的信息就越多。也就是说,用阿尔法