2015-12-02 5 views
-1

Я пытаюсь решить сложность времени наихудшего случая для созданного мной алгоритма, который проверяет, является ли данная строка строкой обложки для списка строк (для каждой строки в списке, содержит в себе все строковые символы, сохраняя порядок слева направо).Расчет наихудшей сложности времени выполнения алгоритма

Был ли я прав в настоящее время, полагая, что сложность времени выполнения в худшем случае для этого алгоритма равна O (N^2)? Моя логика заключается в том, что для внутреннего цикла for, который выполняется n раз, вызывается оператор if со сложностью O (1). И внешний цикл выполняется также n раз, что приводит к t (n) n * n или O (n^2).

public class StringProcessing { 

//ArrayList created and 3 fields added. 
public static ArrayList<String> stringList = new ArrayList<>(); 
public static String list1 = "abc"; 
public static String list2 = "def"; 
//public static String list3 = "fad"; 
//public static String list4 = "monkey"; 
//public static String list5 = "def"; 

//Boolean method to test whether a given string is a cover string for a single string. 
//Method contains a for-each loop to iterate through characters of test String s. 
public static boolean isSingleCover(String s, String cover) 
{  
    int i = 0; 
    for(char c : s.toCharArray()) 
     if((i = cover.indexOf(c, i)) == -1) 
      return false; 
    return true; 
} 

//Second Boolean method to test whether a given string is a cover string for a given list of strings. 
//The algorithm includes reference to the previous method for testing a single String, and uses this method 
//for each string in the ArrayList. 
public static boolean isCover(ArrayList<String> list, String cover) 
{ 
    stringList.add(list1); 
    stringList.add(list2); 
    //stringList.add(list3); 
    //stringList.add(list4); 
    //stringList.add(list5); 
    for(String s : list) 
     if(!isSingleCover(s, cover)) 
      return false; 
    return true; 
} 

public static void main(String[] args) { 
    System.out.println(StringProcessing4.isCover(stringList, "adftyhgusbgusibadsjfksvgjchjgdkepf")); 
} 

} 
+0

Этот код довольно запутан, потому что вы мутируете 'stringList', что также является« списком », поскольку вы называете его« main », а затем итерируете через« list ». Почему вы все-таки мутируете 'stringList' в' isCover'? –

+0

Вы должны искать скрытые циклы при попытке определить сложность - подумайте о том, как можно реализовать «indexOf». –

+0

@AndyTurner Зная теперь, что вызов функции indexOf на самом деле не является постоянной временной сложностью и должен иметь сложность O (n * m), где m в этом случае всегда будет 1, поскольку я ищу символы, сложность случая действительно ближе к O (n^3)? – Mickd94

ответ

1

Сложность в Java implementation из IndexOf представляет собой О (т * п), где п и т являются длина строки поиска и рисунка соответственно.

Такая наихудшая сложность O (N * M * C), когда N = stringList.size(), M = stringList.get (...). Length() и C = cover.length()

+0

Спасибо за комментарий и за информацию, если бы я тогда считал, что O (N * M * C) эквивалентен O (N^3)? И что сложность функции indexOf будет O (n), поскольку длина шаблона, который я ищу, всегда будет равна 1, поскольку я ищу символы. – Mickd94

+0

Это зависит от вашего счета. Если мы говорим о функции сводных символов во всей строке stringList (f (sum_chars_of_stringList)) и cover.length = const, это O (N). Если вы сказали, что у меня есть N элементов в списке, N элементов в обложке и N элементов в каждой строке списка -> это O (N^3). Прежде всего, вам нужно знать, что вы используете как N. –

Смежные вопросы