使用 Kolmogorov 不可压缩性方法的平均案例算法分析

Posted

技术标签:

【中文标题】使用 Kolmogorov 不可压缩性方法的平均案例算法分析【英文标题】:Average case algorithm analysis using Kolmogorov Incompressibility Method 【发布时间】:2014-08-28 10:54:21 【问题描述】:

据说不可压缩性方法可以简化平均情况下的算法分析。据我了解,这是因为不需要计算该算法的所有可能输入组合,然后得出平均复杂度。相反,将一个不可压缩的字符串作为输入。由于不可压缩字符串是典型的,我们可以假设该输入可以作为平均情况的准确近似值。

我对将不可压缩性方法实际应用于算法感到迷茫。顺便说一句,我不是数学家,但认为这个理论在日常编程中有实际应用。

最终,我想了解如何推断任何给定算法的平均情况,无论是微不足道的还是复杂的。有人可以向我演示如何将该方法应用于简单的算法吗?例如,给定一个输入字符串 S,将所有唯一字符存储在 S 中,然后单独打印每个字符:

void uniqueChars(String s) 
    char[] chars = chars[ s.length() ];
    int free_idx = 0;

    for (int i = 0; i < s.length(); i++) 
        if (! s[i] in chars) 
           chars[free_idx] = s[i];
           free_idx++;
        
    

    for (int i = 0; i < chars.length(); i++) 
        print (chars[i]);
    

只是为了争论。我认为伪代码就足够了。假设进行线性搜索以检查数组是否包含元素。

当然,可以证明理论的更好算法是可以接受的。

这个问题可能是荒谬和不切实际的,但我宁愿问也不愿抱有误解。

【问题讨论】:

您可能想查看(本文)[homepages.cwi.nl/~paulv/papers/sorting.pdf] 以获取此方法的应用示例。但我不得不想知道你的目标是什么。您是否有要分析其运行时的算法?附带说明一下,您提供的代码可能难以分析,因为Set.add 的运行时间取决于Set 的实现。 这个问题可能更适合Computer Science Stack Exchange 我的目标是学习如何将不可压缩性方法应用于平均运行时间分析。这只是个人学习的一部分,而不是当务之急。 murgatroid99,你指的是这个链接吗? homepages.cwi.nl/~paulv/course-kc/Tao-AverageNotes.pdf 在 CS StackExchange 上问了一个类似的问题:cs.stackexchange.com/q/35622/26108 【参考方案1】:

在CS.Se question 上复制我的答案,以供相互参考

    Kolmogorov 复杂性(或 算法复杂性)处理“字符串”的最佳描述(一般意义上的 字符串作为符号序列)

    如果字符串的(算法)描述(kolmogorov 复杂性 K ) 不小于其(字面)大小。换句话说字符串的最佳描述,就是字符串本身

    该理论的主要结果是大多数字符串(算法上)是随机的(或典型的)(通过 Chaitin 的工作,这也与 Goedel 定理等其他领域有关)

    Kolmogorov 复杂度概率(或香农)熵有关,实际上熵是 KC 的上限。这将基于描述复杂性的分析与基于概率的分析联系起来。它们可以互换。

    有时使用概率分析可能更容易,而另一些则使用描述性复杂性(可以说是相同的视图)

因此,鉴于上述情况,假设算法随机输入算法,则假设如下:

    输入是典型,因此分析描述了平均情况(以上第 3 点) 输入大小与其概率有某种关系(以上第 2 点) 可以将从算法视图传递到概率视图(以上第 4 点)

【讨论】:

以上是关于使用 Kolmogorov 不可压缩性方法的平均案例算法分析的主要内容,如果未能解决你的问题,请参考以下文章

柯尔莫可洛夫-斯米洛夫检验(Kolmogorov–Smirnov test,K-S test)

Kolmogorov-Smirnov 测试 MATLAB 中的正态性 - 数据归一化?

使用 Kolmogorov Smirnov 检验的 Pi 分布数字

MySql 子查询经典案列

如何在 SciPy 中正确使用 Kolmogorov Smirnov 测试?

R语言之正态性检验