我有将六种类型的XPath查询转换为SQL查询的算法。所以,我的代码包含If-elseif-else语句(多个if)。我从互联网上读到,If-elseif-else语句的时间复杂度是一个如果有更多处理的最坏情况时间。我需要知道这段代码的时间复杂度是什么:
} else if (Query_Type == 5){
for (int i = strXPathQuery.length()-1; i > 0; i--) {
if (strXPathQuery.charAt(i) == '/') {
position = i;
break;
}
} // end for loop
Last_Node = strXPathQuery.substring(position+1);
strAncestor_Path = "";
int bracket_pos=0;
for (int i = 0; i < position; i++) {
if (strXPathQuery.charAt(i) == '[') {
bracket_pos = i;
break;
} else if (strXPathQuery.charAt(i) == '/' && strXPathQuery.charAt(i+1) == '/') {
strAncestor_Path = strAncestor_Path + "%";
}
else {
strAncestor_Path = strAncestor_Path + strXPathQuery.charAt(i);
} // end if statement
} // end for
int operator_pos = 0;
String Node_condition="";
for (int i = bracket_pos+1; i < position-2; i++) {
if ((strXPathQuery.charAt(i) == '<') || (strXPathQuery.charAt(i) == '>') || (strXPathQuery.charAt(i) == '=') || (strXPathQuery.charAt(i) == '!')) {
operator_pos = i;
break;
}
else {
Node_condition = Node_condition + strXPathQuery.charAt(i);
} // end if }
String Value_condition="";
for (int i = operator_pos; i < position-1; i++) {
Value_condition = Value_condition + strXPathQuery.charAt(i);
} // end for loop
strSQLQuery = "SELECT L2.Node_Value \n" +
"FROM Leaf_Node L1, Leaf_Node L2, Ancestor_Path P\n" +
"WHERE P.Ances_PathExp LIKE '" + strAncestor_Path + "'\n" +
"AND L1.Ances_PathID = P.Ances_PathID \n" +
"AND L1.Node_Name = '" + Node_condition + "'\n" +
"AND L1.Node_Value '".replace("'", "") + Value_condition + "'\n".replace("'", "") +
"AND L2.Node_Name = '" + Last_Node + "'\n" +
"AND L1.Ances_PathID = L2.Ances_PathID \n" +
"AND L1.Ances_Pos = L2.Ances_Pos " ;
txtSQLQuery.setText(strSQLQuery);
}
}
答案 0 :(得分:-1)
你有三个看起来可能是O(N^2)
。例如。
for (int i = 0; i < position; i++) {
...
strAncestor_Path = strAncestor_Path + strXPathQuery.charAt(i);
...
}
假设(最坏情况)对于该循环,position
的值为strXPathQuery.length()
...或N
。这意味着您要将字符附加到相同的字符串N
次。由于将字符附加到字符串是O(N)
操作。 (附加组件正在创建一个新字符串,复制现有字符串中的所有字符。)执行该N
次的复杂性为O(N^2)
。
平均复杂度可能比这更好,但它取决于输入。
(而且我没有耐心去了解你在这里尝试的东西。你的代码的废话风格让我的眼睛受伤了。)
如果要执行性能,请不要构建类似的字符串。使用StringBuilder
。
StringBuilder path = new StringBuilder();
for (int i = 0; i < position; i++) {
...
path.append(strXPathQuery.charAt(i));
...
}