Algorithm 我需要帮助优化我自己提出的压缩算法

Algorithm 我需要帮助优化我自己提出的压缩算法,algorithm,optimization,compression,Algorithm,Optimization,Compression,我试着想出一个压缩算法。我对压缩理论做了一点研究,所以我意识到我提出的这个方案可能根本无法实现压缩 目前,它仅适用于没有连续重复字母/数字/符号的字符串。一旦正确建立,我希望将其外推到二进制数据等,但首先是算法: 假设只有4个字母:a、b、c、d;我们创建一个与字母对应的矩阵/数组。每当遇到一个字母时,相应的索引都会递增,以便遇到的最后一个字母的索引总是最大的。如果一个索引最初为零,我们将它增加2。如果它最初不是零,那么我们将它增加2+(矩阵中的第二大元素)。举例说明: Array = [a,b

我试着想出一个压缩算法。我对压缩理论做了一点研究,所以我意识到我提出的这个方案可能根本无法实现压缩

目前,它仅适用于没有连续重复字母/数字/符号的字符串。一旦正确建立,我希望将其外推到二进制数据等,但首先是算法:

假设只有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中):

(这个函数非常简单,所以不是最好的代码……我知道。只要核心算法正确,我就可以对它进行优化。)

然后使用返回的矩阵进行解压缩。现在是棘手的部分:

我根本不能称之为压缩,因为函数生成的矩阵中的每个数对于长度为50000的字符串来说都是10**200。因此,存储矩阵实际上比存储原始字符串占用更多的空间。我知道…完全没用。但在做这些之前,我希望我能利用矩阵的数学性质,用某种数学速记来有效地表示它。我尝试了许多可能性,但都失败了。我尝试过的一些事情:

  • 矩阵的秩。失败,因为不是唯一的

  • 表示使用mod函数。失败,因为商或余数

  • 将矩阵存储为位图文件,但整数太大,无法存储为颜色代码
  • 让我再次重申,算法是可以优化的。e、 g.我们可以添加1并继续,而不是添加2。但不会真正导致任何压缩。代码也一样。稍后进行小优化…首先我想改进主算法

    此外,像我这样一个平庸和懒惰的头脑的产物很可能永远无法实现压缩。在这种情况下,我希望你的帮助和想法,这可能是有用的


    TL;DR:检查描述压缩算法的编码部分。压缩结果比原始字符串长。这个问题能解决吗?如果是,如何进行?


    PS:我的电脑上有完整的代码。将在github上创建一个repo,并在一段时间内上载。

    压缩本质上是一个预测过程。在输入中查找模式,并使用它们来更有效地编码更可能的下一个字符,而不是不太可能的下一个字符。在您的算法中,我看不到任何试图构建预测模型的内容。

    “压缩结果比原始字符串长。这可以修复吗?”相当于“如何确保我的压缩算法实际压缩数据(或至少不会膨胀)”,
    排序
    /
    深度复制
    /
    [-1]
    逻辑可替换为
    最大=最大(矩阵)
    。此外,你真的必须把数学搞清楚<代码>10**200
    需要665位来表示。如果每个符号使用7位,则95个符号的字母表上的长度为50000的字符串大约需要350000位。@ritratt如何存储长度为
    10^200
    字节的文件?我想要你的硬盘
    10^20
    更可信,但仍然很大(100GB)。您的算法不是压缩算法。这甚至不是一种有效的编码。我甚至不认为它是其他编码的一个好的前置过滤器。“创建数组,每当遇到一个字母时,相应的索引都会递增[…]遇到的最后一个字母总是最大的”--听起来像是一种低效的前移编码变体,这是一种至少在20世纪80年代早期就已为人所知的技术,自BWT发明以来,它至少在1994年就被广泛应用于压缩领域。(实际上……保持最后看到的符号最大应视为向后移动编码)同意。但是没有预测的压缩是不可能的吗?我们现在离题了:(@ritratt:是的。这就是压缩的本质。如果它不需要预测,那么就有可能压缩随机噪声,这是众所周知的不可能的。@ritratt可以证明,没有压缩算法不会将任何文件压缩为更长的文件。@ritratt:我不认为这有什么离题的地方。这是t的核心“你的算法有问题。@ritratt:当然,但要小心,不要在表征形式(矩阵)的某些固有属性中寻找可预测性。这是你需要发现的信息内容的可预测性。”。
    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