我正在寻找一种算法,可以计算给定输入字符串的Kolmogorov复杂性的近似值。因此,如果K是一个字符串S的Kolmogorov复杂性,t代表时间,那么该函数的行为应该类似于这样... 限制(t->inf)[K_approx(t,S)] = K。
理论上,随着运行时间趋近于无限,一个程序可以收敛于其输入字符串的科尔莫戈洛夫复杂度。 它可以通过并行运行每个长度等于或小于输入字符串的可能程序来实现。当找到给定长度的程序时,该长度被标识为当前已知的最小长度,并被打印出来,不再尝试其它长度大于等于该长度的程序。该算法(很可能)会永远运行下去,打印出越来越短的长度,并在无限时间内收敛于给定的科尔莫戈洛夫复杂度。
当然,运行指数级别的程序非常难以处理。一种更有效的算法是在 StackOverflow 上发布一个 代码高尔夫竞赛。 但是这种方法也存在一些缺点:
我认为这可能有效?如果有人发现错误,请指出。
function KApprox(S:string,t:integer,TapeSizeMax:integer) : Turing Machine of size k
begin
// An abstract data type that represents a turing machine of size k
var TM(k:integer) : Turing Machine of size k;
var TMSmallest(k:integer) : Turing Machine of size k;
var j : integer;
var i : integer;
for (j = t to 0 step -1) // reduce the time counter by 1
begin
for (i = TMax to 1 step -1) // go to the next smaller size of TM
begin
foreach (TM(i)) // enumerate each TM of size i
begin
if (TM(i).halt(TapeSizeMax) == true) and (TM(i).output() == S) then
begin
if (sizeof(TM(i)) < sizeof(TMSmallest(i))) then
TMSmallest(i): = TM(i);
end;
end;
end;
end;
return TMSmallest;
end;
TM[i].output()
可能永远不会返回。 - Gabehalts()
函数这样的东西。你可以编写一个适用于某些机器的函数,但并非所有机器都适用。 - Gabe那么简短的答案是“很容易,只需使用Joey的算法”,但从任何实用性的角度来看,答案是“你没有机会”。正如rwong所建议的那样,最好使用重型压缩算法。
Kolmogorov复杂性的wikipedia page有一个名为“Kolmogorov复杂性的不可计算性”的子部分,位于“基本结果”部分下。这并不是一个旨在计算甚至近似计算的基本度量。
毫无疑问,有更好的方法来实现您想要的。如果您想要一种随机性度量,可以尝试二进制熵函数。使用标准算法之一进行压缩也可能符合要求。
*/~1+i.9
)内生成一个 9x9 的乘法表。由此可知,相对于 J 编程语言,一个 9x9 的乘法表的 Kolmogorov 复杂度为 8 或更低。 - Joey Adams