Oszacowanie złożoności czasowej algorytmu

0

Cześć . Właśnie napisałem algorytm w C# , który wypełnia „jodełką” tablicę kwadratową o wymiarze n.
Np. dla n równego 5, tablica ta jest postaci:
1 1 1 1 1
1 2 2 2 2
1 2 3 3 3
1 2 3 4 4
1 2 3 4 5

Muszę oszacować złożoność czasową mojego algorytmu , jednakże nie za bardzo pojmuje czy dobrze myślę byłbym bardzo wdzięczny za wskazówki jak i doradzenie w tej sprawie.

Operacja dominująca :

pętla for?

Funkcja złożoności (w najgorszym przypadku):

      F(N)=O[(1+n)/2]*n=O[(n/2)+(n^2)/2]=O(n^2) - złożoność kwadratowa.

Rząd złożoności w najgorszym przypadku:

tutaj nie wiem?

Mam też pytanie czy jest jakiś program , który po wrzuceniu kodu wyrzuci mi wykres zależności czasu wypełnienia tablicy kwadratowej? Jeżeli nie to w jaki sposób mógłbym to zrobić?cheeky

Mój kod:
class Program
{
static void Main(string[] args)
{
int n = 8;

        int[,] tab = new int[n, n];  //tworzenie tablicy kwadratowej o wymiarze n

        int number = 1;  //numer od jakiego zaczynamy wstawiać do tablicy
        int index = 0;  //index od ktorego wstawiamy do tablicy

        for (int i = 0; i < n; i++)  //pętla wstawiająca elementy
        {
            for (int j = index; j < n; j++)
            {
                tab[index, j] = number;  //przypisywanie elementów
                tab[j, index] = number;  //przypisywanie elementów
            }
            index++;  //zwiekszanie indexu
            number++;  //zwiekszanie liczby
        }

        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)
            {
                Console.Write(tab[i, j]);
            }
            Console.WriteLine("");
        }
    }
}
1

Wypełnianie tablicy kwadratowej będzie, O(n^2) z dokładnością do stałej.

0

No dobrze , aczkolwiek to nie odnosi się do wszystkiego . Funkcja złożoności wynosi O(n^2) a co z operacją dominująca i przede wszystkim rządem złożoności?

1.Operacja dominująca : pętla for?

2.Funkcja złożoności (w najgorszym przypadku): F(N)=O[(1+n)/2]*n=O[(n/2)+(n^2)/2]=O(n^2) - złożoność kwadratowa.

3.Rząd złożoności w najgorszym przypadku: tutaj nie wiem?

2

Operacja dominujaca jest tutaj przypisanie. Wykonujesz kwadratowo wiele takich operacji.

1

Rzędem złożoności będzie, n^2, w najlepszym i najgorszym przypadku.

0

Pytanie nr 1 .Hmmm...operacją dominująca jest przypisanie? Przypisanie czego dokładnie? Przypisanie tab?Konkretnej wartości?
Pytanie nr 2. Jeżeli mogę się dopytać w jaki sposób to n^2 będzie w najlepszym i najgorszym przypadku rzędem złożoności? W jaki sposób do tego doszedłeś? Może tak...jakie obliczenia wykonałeś , żeby do tego dojść?

Sorry Panowie za moje pytania , ale nadal lekko nie pojmuje tego tematu. Byłbym wdzięczny za wytłumaczenie tego jak dziecku wiem że to chałupnicze zadanie ale naprawdę może w ten sposób coś mi zaświta cheeky

1

zwykle za operacje dominującą przyjmuje sie każde przypisanie, albo każde porownanie

2

Zlozonosc obliczeniowa i pamieciowa podaje sie w notacji asymptotycznej. To znaczy, że nie interesuja Cie dokladne stale, tylko zaleznosc miedzy rozmiarem wejscia (N) a czasem potrzebym na wykonanie algorytmu na tym wejsciu. Aby uniezaleznic sie od infrastruktury, przyjmuje sie, że liczymy liczbe tzw. operacji dominujacych.

Obrazowo mówiąc, efekt koncowy jest taki, ze gdybys zrobil wykres zaleznosci czasu wykonania od rozmiaru wejscia, to ten wykres bedzie przypominal krzywą y=x^2.

Notacja wielkie O mowi, że „nie bedzie gorzej niż”. W Twoim przypadku oznacza to, że dla dowolnego wejscia zlozonosc da sie ograniczyc z gory przez AxN^2, gdzie A jest jakąś stałą. Oczywiscie O(N^2) jest rownie O(2^N), ale tutaj chodzi, aby podac najmniejsze mozliwe ograniczenie. W Twoim przypadku nie zejdziesz nizej niz O(N^2), czyli to jest poprawna odpowiedz.

0

Okej , teraz mi się faktycznie rozjaśniło . Dzięki za pomoc panowie w tej sprawie!
Zadam jeszcze jedno pytanie i zamykam temat.
Zrobiłem dla mojego kodu schemat blokowy tylko nie jestem przekonany czy jest dobrze on wykonany i byłbym wdzięczny na rzucenie na to okiem i w razie czego danie mi odpowiedzi gdzie mam co poprawić .
schemat.png

2
romeo napisał(a):

Zrobiłem dla mojego kodu schemat blokowy tylko nie jestem przekonany czy jest dobrze on wykonany i byłbym wdzięczny na rzucenie na to okiem i w razie czego danie mi odpowiedzi gdzie mam co poprawić .

Na pewno tego chcesz? Będzie w klasycznym WTF na minutę:

  • WTF 1. - co to jest n? Nazwa tablicy czy wielkość tablicy
  • WTF 2. - co według ciebie ma robić n= n[1], n[2], ... n[n], co niby pod koniec ma się znaleźć w n?
  • WTF 3. - index to niezainocjalizowana zmienna? Jaką wartość ma mieć według ciebie? W Javie to będzie domyślnie 0, ale w C to może być losowa wartość odczytana ze stosu
  • WTF 4. - number = [index, j] co to ma robić według ciebie? Żaden znany mi język nie ma takiej składni, a parę języków z dziwną składni poznałem. Chyba że to ma być podwójne indeksowanie tablicy, tylko nazwy tablicy brakuje, wtedy powinno być number = array[index, j]
  • WTF 5. - z bloku z number = [index, j] masz rozwidlenie bez warunku. Na jakiej podstawie idziesz w dół lub w lewo?

Podsumowując nic z tego schematu nie rozumiem :(

1 użytkowników online, w tym zalogowanych: 0, gości: 1