Mam problem "Zaimplementuj tę metodę, aby zwrócić sumę dwóch największych liczb w danej tablicy."Złożoność algorytmu
postanowiłem go w ten sposób:
public static int sumOfTwoLargestElements(int[] a) {
int firstLargest = largest(a, 0, a.length-1);
int firstLarge = a[firstLargest];
a[firstLargest] = -1;
int secondLargest = largest(a, 0, a.length-1);
return firstLarge + a[secondLargest];
}
private static int largest(int s[], int start , int end){
if (end - start == 0){
return end;
}
int a = largest(s, start, start + (end-start)/2) ;
int b = largest(s, start + (end-start)/2+1 , end);
if(s[a] > s[b]) {
return a;
}else {
return b;
}
}
Objaśnienie: I wdrożone metoda 'largeset'. Ta metoda jest odpowiedzialna za uzyskanie największej liczby w danej macierzy.
Ja nazywam czasy przeciągnięcia metody w tej samej tablicy. Pierwsze wywołanie otrzyma pierwszą największą liczbę. Odkładam ją na zmienną i zastępuję ją przez liczbę "-1" w tablicy. Następnie, po raz drugi nazywam największą medhodę.
Ktoś może mi powiedzieć, jaka jest złożoność tego algo? proszę
można znaleźć oba numery w pierwszym przejeździe i oszczędzić drugiego przebiegu. Nie zmieni to złożoności, ale będzie działać szybciej. :-) – assafmo
+1 za powyższy komentarz. Również jeśli jest to tylko lista liczb, istnieją różne inne sposoby rozwiązania tego samego ... jeśli użyjesz mechanizmu takiego jak sortowanie zliczania itp. Z pomijalną dodatkową przestrzenią i złożonością czasu O (n) ... – dharam
Rzeczywisty środek Złożoność dotyczy przyszłych czytników tego kodu, czasu, który spędzają na zastanawianiu się, jak to działa, kiedy prostszy algorytm wykona zadanie. Nie ma wyraźnych korzyści dla rekurencji lub dlaczego dwa przechodzi przez zestaw są potrzebne.Algorytm jest zasadniczo zepsuty (zwraca nieprawidłowy wynik), gdy dwie największe liczby całkowite w tablicy są mniejsze niż -1. Accckkk! – spencer7593