java - 是否有更好的方法来分析作为示例给出的输入/输出数组之间的路径?

标签 java algorithm recursion

下面显示的示例是我目前正在进行的信号路径分析的简化版本。对于输入数组 (iArray) 中的每个索引,在同一索引处都有一个输出 (oArray)。正如您在结果中看到的那样,递归调用将具有重复的分析路径,这些路径并不重要(如结果所示)。问题是是否有更好(即更快)的分析解决方案?

代码:

import java.util.*;
import java.lang.*;
import java.io.*;

class Main {

    private static String[] iArray = new String[]{
        "a","a","a","b","b","b","b","b","c","c","c","c",
          "d","d","d","d","e","e","e","e","f","f","g","g","g","g",
            "h","h","k","l","l","m","n","n","n","n","n","o","o",
              "s","s","s","s","s","s"};

    private static String[] oArray = new String[]{
        "b","c","d","e","f","g","h","i","d","f","h","l","j","a","n",
          "s","a","f","g","i","s","b","b","n","a","c","i","j","e","s",
            "b","b","o","d","s","a","b","b","s","a","j","l","o","n","k"};

    public static void recPathAnalysis(String signal, int level, String path) {
        if (level < 10) {
            for (int i = 0; i < iArray.length; i++) {
                if (signal.equals(iArray[i])) {
                    if (!path.contains(oArray[i])) {
                        System.out.println("normal >> " + path + " " + oArray[i]);              
                        recPathAnalysis(oArray[i], level + 1 ,  path + " " + oArray[i]);
                    } else {
                        System.out.println("loop   >> " + path + " " + oArray[i]);              
                    }
                }
            }
        }
}

    public static void main (String[] args) {
        recPathAnalysis("a", 0, "a");
    }
}

结果:

    normal >> a b            **not needed**
    normal >> a b e          **not needed**
    loop   >> a b e a
    normal >> a b e f        **not needed**
    normal >> a b e f s      **not needed** 
    loop   >> a b e f s a
    normal >> a b e f s j
    normal >> a b e f s l    **not needed**
    loop   >> a b e f s l s
    loop   >> a b e f s l b
    normal >> a b e f s o    **not needed**
    loop   >> a b e f s o b
    loop   >> a b e f s o s
    normal >> a b e f s n    **not needed**
    normal >> a b e f s n o
    ....

最佳答案

这里使用的数据结构可以做一个小的改进,而不是 public static void recPathAnalysis(String signal, int level, String path) , public static void recPathAnalysis(String signal, int level, HashSet<Character> path)可以使用。由于您使用 if (!path.contains(oArray[i]))复杂度为 O(n),但如果你使用 HashSet 则为 O(1)。可以获得轻微的性能提升。

关于java - 是否有更好的方法来分析作为示例给出的输入/输出数组之间的路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22176813/

相关文章:

algorithm - 大 O 表示法是什么意思?

c - 当递归也使用堆栈时,使用堆栈而不是递归如何在 C 中提供更好的性能?

java - 如何调用java中的语句

java - java如何处理非静态变量?

java - 双整数转换困惑

java - 将字符串写入 .txt 文件不起作用

java - 在 UBUNTU 中添加 JAR 类路径

algorithm - 动态偏向随机选择算法

python - Project Euler #35 - Circular Primes(结果不正确 1)

java - 将递归函数转换为 for 循环?