通过分析代码建立总结?

时间:2016-04-19 03:03:30

标签: java sum time-complexity big-o code-analysis

我明天会中期,我们应该能够分析代码。老实说,这是我唯一不了解的事情。基本上我们得到这样的东西:

  

考虑使用这种Java方法来比较两个字符串。这个方法有两个输入,所以我们应该使用两个变量来表示运行时间。让na的长度,让mb的长度。我们可以将运行时间表示为n和/或m的函数。如果我们在不失一般性的情况下假设n < m

,这将有所帮助
  private static int compareStrings ( String a , String b) {
       int i = 0; 
       while ( i < a . length () && i < b. length ( ) ) { 
           if (a . charAt ( i ) < b. charAt ( i ) ) return −1;

           if (a . charAt ( i ) > b. charAt ( i ) ) return 1;

           i ++;
       }
       if (a . length () < b. length ( ) ) return −1; 
       if (a . length () > b. length ( ) ) return 1; 
 }
     

a)将此方法的最坏情况运行时间表示为总和。

     

b)简化这个总和并说出它的大约哦。

我需要它的符号是:

n
Σ i
i= 1

我不了解如何使用此代码构建总和,或者让它运行时间。一步一步的说明会很棒。给出的这个问题是一个练习题而不是作业。我真的很想理解这个!!!

3 个答案:

答案 0 :(得分:1)

查看代码,它创建一个迭代器(i),然后迭代直到它到达其中一个字符串的末尾(较短的,显然,由长度n表示)。

由于只有一个循环,并且该循环仅迭代n次,因此&#34;运行时间&#34;该算法可能被描述为计算&#34; if&#34;将导致的陈述,或&#34; 2n + 2&#34;。在Big-O表示法中,出现在O(n)。如果最后的检查是常数,那么额外的两个,因此不在计算中使用。

嗯,你正在寻找的总和似乎是:

n
Σ k
i = 1

读取此作为&#34;对于i的1到n的每个值,将k加到总数&#34;,这将导致k * n(以及得到的O(n)的大O)。我在这里使用k因为我不知道内循环的成本,但它应该是不变的。如果你觉得你的课程会使用1代表&#34;一次通过循环的主体&#34;那么那也很好。

答案 1 :(得分:1)

最坏的情况是 O(n)

为什么?
1.因为我们假设 n&lt; m 并且该算法仅比较字符,只要字符串中剩余字符[尚未比较的字符]。

当最短的字符串中没有其他字符时,这种情况自然无法保持,a。

  1. 因为最坏的情况必须在while循环未被返回中断时发生。
  2. 这可以与我们评估n次的情况一致。

    唯一的规定是 a b 的子串,这样 a [0] == b [0] 。< / p>

    成本是

    的总和
    • 评估while条件
    • 循环体中两次比较的成本
    • 递增 i

    它高于 nc + k ,其中 c 是while循环体的最坏情况成本, k 是成本操作仅评估一次(例如return语句),而 n 具有先前商定的重要性。

    如果您允许 n 无限制地上升,您可以看到这符合 O(n)的定义。

答案 2 :(得分:1)

好的,首先代码是错误的。它具有Unicode字符而不是减号,如果没有条件匹配,它不会返回任何内容。这不会起作用,因为方法必须返回一个整数。

以下是固定方法。

private static int compareStrings ( String a , String b) {
       int i = 0; 
       while ( i < a . length () && i < b. length ( ) ) {
           if (a . charAt ( i ) < b. charAt ( i ) ) {
               return -1;
           }

           if (a . charAt ( i ) > b. charAt ( i ) ) {
               return 1;
           }

           i ++;
       }
       if (a . length () < b. length ( ) ) {
           return -1; 
       }
       if (a . length () > b. length ( ) ) {
           return 1;
       }

       return 0;
 }

现在让我们开始分解以计算复杂性。

作为总和的第一个复杂性

为此,我们必须计算此方法完成的操作数。可以说,独立操作需要1个单位的执行时间。

此方法有5种不同的独立操作。

  1. 变量声明
  2. 查找字符串的长度
  3. 条件评估(逻辑条件)
  4. 2个布尔值的逻辑表达式评估
  5. 从方法中返回一个值。
  6. 假设所有上述独立操作需要1个单位时间,我们可以继续计算该方法所花费的总时间。

    int i = 0;
    //time taken 1 unit.
    
    while ( i < a . length () && i < b. length ( ) )
    //time taken 5n + 2 unit
    

    循环语句由5个操作组成

    1. lengtha
    2. b次查询
    3. 2 lengthi
    4. 的比较
    5. 1比较length比较(&&操作)
    6. 的输出

      由于我们正在考虑最坏情况,因此循环必须运行n次。 由于n小于n,因此循环最多m次运行,并且只要i小于n,循环就会中断。所以这给了我们5n时间单位

      然而,当i的值增加到n时,如果i < a.length() <=> i < n导致false,则a.length()的值会增加到i < a.length()。这里只会评估前两个操作,因为第二个操作将被短路。

      1. 5n+2 // 1个单位时间
      2. if (a . charAt ( i ) < b. charAt ( i ) ) { return -1; } //3n unit of time if (a . charAt ( i ) > b. charAt ( i ) ) { return 1; } //3n unit of time // 1个单位时间
      3. 这为我们提供charAt(i)时间单位用于while语句。

        如果语句,接下来的两个语句几乎相同。由于我们正在考虑最坏的情况,两者都不会导致真的,否则循环会破裂。

        6n

        这两个语句都会被执行n次。每个包含3个独立操作(2 i++; //n unit of time 个查找和1个条件评估)。

        因此,这两个陈述所用的总时间为n时间单位。

        接下来是

        if (a . length () < b. length ( ) ) {
           return -1; 
        }
        //4 units of time
        

        这很简单,因为循环运行sum = 1 + (5n+2) + (6n) + n + 4 = 12n + 7 sum = 12n + 7 次并且它是独立操作。

        最后的下一个和最后一个声明是

        n

        它有4个操作(2个长度查找,1个条件和1个返回语句)

        现在没有更多的陈述将被执行,因为我们知道n&lt;米

        执行时间总和将如下。

        n

        现在这仍然不是最糟糕的情况,因为n的上限为

        我们必须最大化m-1才能使最坏的情况成为可能。 n < m可以假设n = m - 1 的最大值为12n + 7(严格小于)

        所以在最坏的情况下

        sum = 12n + 7
            = 12(m-1) + 7
            = 12m - 5
        sum = 12m - 5
        

        替换总和表达式f(x)

        中的那个
        g(x)

        这是我们第一部分的答案

        方法的最坏情况运行时间为sum

        12m - 5

        现在,因为此函数的Big-O绑定为O(m)

        以下是Big-O的定义

        Mf(m) = 12m -5 g(m) = m m0 = 5/12 M = 12

        限制

        g(x) is bounded by f(x)

        当且仅当某个足够大的常数x 0 ,其中存在O(g(x) = O(m),其中以下为真。

        enter image description here

        下面

        try {
                    String line;
                    Process p = Runtime.getRuntime().exec("tasklist.exe");
                    Runtime rt = Runtime.getRuntime();
                    BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
                    while ((line = input.readLine()) != null) {
        
                        if (line.toLowerCase().contains(".exe".toLowerCase()) && line.toLowerCase().contains("Console".toLowerCase())) {
                            System.out.println(line);
                            String pocessKill = line.substring(0, line.indexOf(".exe"));
                            pocessKill = pocessKill + ".exe";
        
                            if (pocessKill.equalsIgnoreCase("netbeans.exe") || pocessKill.equalsIgnoreCase("java.exe") || pocessKill.equalsIgnoreCase("csrss.exe") || pocessKill.equalsIgnoreCase("winlogon.exe") || pocessKill.equalsIgnoreCase("dwm.exe") || pocessKill.equalsIgnoreCase("taskhostex.exe") || pocessKill.equalsIgnoreCase("explorer.exe") || pocessKill.equalsIgnoreCase("igfxtray.exe") || pocessKill.equalsIgnoreCase("hkcmd.exe") || pocessKill.equalsIgnoreCase("igfxpers.exe") || pocessKill.equalsIgnoreCase("jusched.exe") || pocessKill.equalsIgnoreCase("GWX.exe") || pocessKill.equalsIgnoreCase("rundll32.exe") || pocessKill.equalsIgnoreCase("conhost.exe") || pocessKill.equalsIgnoreCase("tasklist.exe") || pocessKill.equalsIgnoreCase("conhost.exe")) {
                                System.out.println(pocessKill);
                            } else {
                                rt.exec("taskkill /F /IM " + pocessKill);
                            }
                        } else {
                            System.out.println("Bad Process");
                        }
        
                    }
                    input.close();
        
                    System.out.println(rt.toString());
        
                } catch (Exception err) {
                    err.printStackTrace();
                }
        

        所以Bad Process Bad Process Bad Process Bad Process Bad Process Bad Process Bad Process Bad Process Bad Process Bad Process csrss.exe 936 Console 1 22,612 K csrss.exe Bad Process winlogon.exe 1016 Console 1 3,508 K winlogon.exe Bad Process Bad Process Bad Process Bad Process Bad Process Bad Process Bad Process Bad Process Bad Process Bad Process Bad Process dwm.exe 1928 Console 1 33,116 K dwm.exe explorer.exe 1944 Console 1 60,328 K explorer.exe Bad Process Bad Process Bad Process Bad Process Bad Process PWRISOVM.EXE 2152 Console 1 3,456 K java.lang.StringIndexOutOfBoundsException: String index out of range: -1 at java.lang.String.substring(String.java:1955) at decryptomediaplayer.DecryptoMediaPlayer.main(DecryptoMediaPlayer.java:731) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389) at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767) java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389) at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767) Caused by: java.lang.IllegalStateException: Not on FX application thread; currentThread = main at com.sun.javafx.tk.Toolkit.checkFxUserThread(Toolkit.java:204) at com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(QuantumToolkit.java:438) at javafx.stage.Stage.<init>(Stage.java:238) at javafx.stage.Stage.<init>(Stage.java:224) at javafx.scene.control.HeavyweightDialog$1.<init>(HeavyweightDialog.java:50) at javafx.scene.control.HeavyweightDialog.<init>(HeavyweightDialog.java:50) at javafx.scene.control.Dialog.<init>(Dialog.java:262) at javafx.scene.control.Alert.<init>(Alert.java:245) at javafx.scene.control.Alert.<init>(Alert.java:223) at decryptomediaplayer.DecryptoMediaPlayer.main(DecryptoMediaPlayer.java:750) ... 11 more Exception running application decryptomediaplayer.DecryptoMediaPlayer Java Result: 1 是总和的上限。

        big-oh bound中的简化求和是

        <强> O(M)