我尝试了一种压缩算法。我对压缩理论有点了解,所以我知道我提出的这个方案很可能永远不会实现压缩。
目前它仅适用于没有连续重复字母/数字/符号的字符串。一旦正确建立,我希望将其推断为二进制数据等。但首先是算法:
假设只有4个字母:a,b,c,d;我们创建一个与字母对应的矩阵/数组。无论何时遇到字母,相应的索引都会递增,以便遇到的最后一个字母的索引始终最大。如果索引最初为零,我们会将索引增加2。如果它原来不是零,那么我们将它增加2+(矩阵中的第二大元素)。一个澄清的例子:
Array = [a,b,c,d]
Initial state = [0,0,0,0]
Letter = a
New state = [2,0,0,0]
Letter = b
New state = [2,4,0,0]
.
.c
.d
.
New state = [2,4,6,8]
Letter = a
New state = [12,4,6,8]
//Explanation for the above state: 12 because Largest - Second Largest - 2 = Old value
Letter = d
New state = [12,4,6,22]
and so on...
解压缩只是反过来的逻辑。
压缩的基本实现(在python中):
(这个函数非常简陋,所以不是最好的代码......我知道。一旦我的核心算法正确,我就可以优化它。)
def compress(text):
matrix = [0]*95 #we are concerned with 95 printable chars for now
for i in text:
temp = copy.deepcopy(matrix)
temp.sort()
largest = temp[-1]
if matrix[ord(i)-32] == 0:
matrix[ord(i)-32] = largest+2
else:
matrix[ord(i)-32] = largest+matrix[ord(i)-32]+2
return matrix
然后将返回的矩阵用于解压缩。现在是棘手的部分:
我根本无法真正调用此压缩,因为对于长度为50000的字符串,函数生成的矩阵中的每个数字的大小为10 ** 200。因此存储矩阵实际上比存储原始字符串占用更多空间。我知道......完全没用。但我曾希望在完成这一切之前我可以使用矩阵的数学属性来有效地用某种数学速记来表示它。我尝试了很多可能性并且失败了。我试过的一些事情:
矩阵的等级。失败,因为不是唯一的。
表示使用mod函数。由于商或余数
让我再次迭代,可以优化算法。例如而不是添加2我们可以添加1并继续。但是不要真的导致任何压缩。代码相同。稍后稍微优化......首先我想改进主算法。
此外,像我这样平庸和无所事事的这种产品很可能永远无法实现压缩。在这种情况下,我会希望您对这可能有用的内容有所帮助和想法。
TL; DR:检查描述压缩算法的编码部分。压缩结果比原始字符串长。这可以修复吗?如果是,怎么做?
PS:我的PC上有完整的代码。将在github上创建一个repo并在一段时间内上传。
答案 0 :(得分:3)
压缩本质上是一个预测过程。查找输入中的模式并使用它们来编码更有可能的下一个字符,而不是更不可能。我在你的算法中看不到任何试图建立预测模型的东西。