złożoność obliczeniowa, pseudokod

0

Witam dostałem zadanie na zaliczenie z przedmiotu budowa i analiza algorytmów.
Stworzyłem do tego schemat blokowy ale należy również przedstawić złożoność obliczeniową i pseudokod.

Czy złożoność obliczeniowa do tego algorytmu to będzie O(N2 ). W załączeniu projekt

Proszę o pomoc

0
  1. Naucz się nazywać zmienne w kodzie jak człowiek, bo z tego twojego schematu nijak nie wynika co sie tam dzieje.
  2. Na oko to ten algorytm może mieć O(mn^2) bo masz pętle po n=1..N, wewnątrz niej masz pętle po m=1..M, a wewnątrz niej masz pętle Aw=n..N
    na moje oko to będzie n
    m*n/2
0

dziękuje za odpowiedź, jestem laikiem i wiem że są to banały dla osób doświadczonych
Poniżej dla wyjaśnienia podaje treść i opis
Mamy 2 zbiory A i B ( n-el ementowy i m-ele mentowy) które zawierają elementy będące liczbami naturalnymi. Jest również zadana wartość(liczba naturalna).
Zbiory te są tablicami w których elementy są uporządkowane rosnąco.
Należy wyznaczyć elementy które należą do zbioru A \ B (różnica zbiorów A-B) i
większych od zadanej wartości. Zalecana złożoność liniowa.

Np. A={1,2,3,5,8}, B={0,1,3,4,8,9,10} i zadana wartość to 3. A\B={2,5} ale istnieje jeden
element większy od 3. Jest to wartość 5.

Zmienne pomocnicze
• Aw - indeks elementu tablicy A większej od w
• Bw - indeks elementu tablicy B większej od w
• M - długość zbioru B
• n- licznik tablicy A
• m - licznik tablicy B
• w- zadana wartość

2

W takim razie ten twój algorytm to jest jakiś hardkor, a faktycznie da sie to zrobić liniowo...

  • dla każdej liczby ze zbioru A (Ai) która jest większa od zadanej wartości progowej
  • dla każdej liczby ze zbioru B (Bj) począwszy od ostatniego sprawdzanego indeksu j i dopóki Bj jest mniejsze lub równe Ai (zauważ że te wartości są tam posortowane! nie ma sensu dla każdego Ai sprawdzać wszystkich B!)
  • jeśli Ai !=Bj (dla wszystkich Bj które sprawdziliśmy) to wypisz Ai

W efekcie po zbiorze A przelatujemy raz, po zbiorze B przelatujemy sumarycznie raz i mamy O(n+m)

0

Wielkie dzięki tak, też myślałem że klucz do poprawnego rozwiązania (złożoność liniowa) tkwi w tym że zbiory są uporządkowane.
Spróbuje jeszcze raz napisać ten projekt według Twoich wskazówek.
Wielkie Dzięki jeszcze raz

0

Siadłem do tego ale coś mi nie idzie...
Mógłbyś mi pomóc na przykładzie z tego przykładowego zbioru jakby to szło ?
Z góry dzięki

1

Mógłbym.
A={1,2,3,5,8}, B={0,1,3,4,8,9,10}
i=0; j=0

  • Ai = 1
    • Ai > Bj ? [1 > 0] Tak więc j++
    • Ai > Bj ? [1 > 1] Nie. Czy Ai == Bj? Tak, więc odpada. i++
  • Ai = 2
    • Ai > Bj ? [2 > 1] Tak więc j++
    • Ai > Bj ? [2 > 3] Nie. Czy Ai == Bj? Nie, więc można wypisać --> 2, i++
  • Ai = 3
    • Ai > Bj ? [3 > 3] Nie. Czy Ai == Bj? Tak, więc odpada. i++
  • Ai = 5
    • Ai > Bj ? [5 > 3] Tak więc j++
    • Ai > Bj ? [5 > 4] Tak więc j++
    • Ai > Bj ? [5 > 8] Nie. Czy Ai == Bj? Nie, więc można wypisać --> 5, i++

I tak dalej. Nie uwzględniłem tutaj wartości progowej żeby nie zaciemniać algorytmu, ale dodanie jej nie powinno stanowić problemu.

0

Bardzo dziękuje to mi rozjaśniło całą sytuację.
Stworzyłem nowy schemat blokowy według Twoich wskazówek. Plik w załączeniu
Tam gdzie jest j<=M --> dodałem tutaj dodatkowe bloki ponieważ może być sytuacja gdy zbiór B będzie liczył dużo mniej elementów w takiej sytuacji po przejściu całego zbioru B należy wypisać w tym momencie wszystkie liczby ze zbioru A większe od zadanej wartości.
Mam nadzieje, że zrobiłem to poprawnie

0

Na pierwszy rzut oka wygląda ok.

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