繁体   English   中英

递归函数慢。 我如何加快速度?

[英]Slow recursive function. How can I speed it up?

下面是一个不执行任何操作的递归函数。 real函数进行了一些检查,这些检查实际上可以删除一些递归调用,但这只是简化问题的一个示例。

public void speedtest2(char[] s) {
    int a, c;
    int l, lmax;
    int arrlength = Array.getLength(s);
    for (a = 0; a < arrlength; a++) {
        if ((a == 0) || (s[a]) != s[a - 1]) {
            if (s[a] == '*') {
                lmax = 26;
            } else {
                lmax = 1;
            };
            for (l = 1; l <= lmax; l++) {
                tot++;
                char[] tmp = new char[arrlength - 1];
                int p = 0;
                for (c = 0; c < arrlength; c++) {
                    if (c != a) {
                        tmp[p++] = s[c];
                    };
                };
                speedtest2(tmp);
            }

        }
    }
}

在我低调的HTC Flyer安卓平板电脑上,使用包含“ srrieca *”的数组调用speedtest最多需要5秒钟。 在这个极端的例子中,该函数被称为1 274 928次,但仍然如此。

我敢肯定,有一些事情可以提高这个例子的速度。

内存分配是一项昂贵的操作。 new声明降低了您的速度。 尝试为工作区域分配一个大块并留在其中。

另外,您将经常触发垃圾收集器,这是一个更大的减速。

您可以通过合并tmp数组来减少垃圾回收器的开销。 当然,在检查完这您遇到的瓶颈之后。

一种可能性涉及通过具有某种可以存储可重用而不是递归的结果的缓存来减少递归调用的数量。 尽管在您想像的示例中,尚不清楚会是什么。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM