使用 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 分布数字