我明天会中期,我们应该能够分析代码。老实说,这是我唯一不了解的事情。基本上我们得到这样的东西:
考虑使用这种Java方法来比较两个字符串。这个方法有两个输入,所以我们应该使用两个变量来表示运行时间。让
,这将有所帮助n
为a
的长度,让m
为b
的长度。我们可以将运行时间表示为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
我不了解如何使用此代码构建总和,或者让它运行时间。一步一步的说明会很棒。给出的这个问题是一个练习题而不是作业。我真的很想理解这个!!!
答案 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。
这可以与我们评估n次的情况一致。
唯一的规定是 a 是 b 的子串,这样 a [0] == b [0] 。< / p>
成本是
的总和它高于 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个单位时间,我们可以继续计算该方法所花费的总时间。
int i = 0;
//time taken 1 unit.
while ( i < a . length () && i < b. length ( ) )
//time taken 5n + 2 unit
循环语句由5个操作组成
length
和a
b
次查询
length
与i
length
比较(&&
操作) 由于我们正在考虑最坏情况,因此循环必须运行n次。
由于n
小于n
,因此循环最多m
次运行,并且只要i
小于n
,循环就会中断。所以这给了我们5n
时间单位
然而,当i
的值增加到n
时,如果i < a.length() <=> i < n
导致false
,则a.length()
的值会增加到i < a.length()
。这里只会评估前两个操作,因为第二个操作将被短路。
5n+2
// 1个单位时间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个单位时间这为我们提供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的定义
M
受f(m) = 12m -5
g(m) = m
m0 = 5/12
M = 12
当且仅当某个足够大的常数x 0 ,其中存在O(g(x) = O(m)
,其中以下为真。
下面
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)强>