改进算法Java

时间:2018-03-24 15:25:46

标签: java performance function optimization

我想到了一个函数,它将String类型的消息(例如:“hello”)作为输入,并检查字符串类型的随机字母(例如:“sdgjkahjkdghkjsaeasdflasfdo”),如果字母存在使得消息可以重建。

我的问题是我是否以及如何改进此算法以提高效率。

public static void main(String[] args) {

    String letters = "asfhgsaihgaojmbpapojtnmaiuwbqapweqfbsjadsheeadsaslasfaslasasopz";

    String message ="helloc";

    System.out.println(seaOfLetters(message, letters));

}

public static boolean check(char[] a, char[] b) {
    CHECK: for (int i = 0; i < a.length ; ++i) {
        if (a[i] == b[i]) {
            continue CHECK;
        } else {
            return false;
        }
    }
    return true;
}

public static boolean seaOfLetters(String m, String l) {

    char[] message = m.toCharArray();
    char[] letters = l.toCharArray();

    char[] newchar = new char[message.length];

    for (int i = 0; i < message.length ; i++) {
        CHECK: for (int j = 0; j < l.length() ; j++) {
            if (message[i] == letters[j]) {
                newchar[i] = message[i];
                break CHECK;
            }

        }
    }

    return check(message, newchar);

3 个答案:

答案 0 :(得分:1)

您可以分析算法以查看在最佳/最差情况下必须执行的操作数量,以尝试了解复杂性。

你也可以尝试运行它来获取一系列值并计算时间。在算法启动之前设置启动计时器的东西,并在完成后输出通过的时间。然后你可以运行它来增加集合的大小,看看时间如何变化,然后绘制它。确保为&#34; sea&#34;运行几个数量级(1,10,100,1000等)。和&#34;消息&#34;了解真正推动复杂性的因素。

要改进算法,可以考虑使用HashSet。它们具有O(1)复杂度,用于&#34;包含&#34;检查。所以你的程序基本上有两个步骤,1。添加&#34; sea&#34;到HashSet,然后2.迭代&#34;消息&#34;并查看字母是否在集合中。

答案 1 :(得分:0)

您可以使用字母长度的数组。

  1. 浏览您的消息,并为每封信件更新字母数,以及总字母数。
  2. 贯穿&#34; sea&#34;并且对于您找到的包含在原始邮件中的每个字母,递减相应的计数器和总计数器。
  3. 当总计数器为0时,或者&#34; sea&#34;完了。
  4. O(n + m)最坏的情况。

答案 2 :(得分:0)

使用正则表达式,您可以轻松地从源中删除目标中不存在的所有字母,从而为您提供更简单的解析文本:

letters.replaceAll ("[^"+message+"]", "")
"hhooeheello"

现在你仍然需要检查正确的字符数(两个 &#39; l&#39;)和正确的顺序。它有多快,我还没有测试过,但我想这第一步非常快。