Algorytmy i struktur - Uniwersytet Ekonomiczny w Krakowie

Transkrypt

Algorytmy i struktur - Uniwersytet Ekonomiczny w Krakowie
2009-10-20
Wybrane algorytmy tablicowe
Algorytmy i struktury danych
Wykład 2.
Rok akademicki: 2009/2010
Sortowanie przez wybieranie
for (int i = 0; i < liczby.length - 1; i++)
{
k = i;
for (int j = i; j < liczby.length; j++)
if (liczby[k] > liczby[j])
k = j;
pomoc = liczby[i];
liczby[i] = liczby[k];
liczby[k] = pomoc;
}
Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie
2
1
2009-10-20
Sortowanie przez wstawianie
for (int i = 1; i < liczby.length; i++)
{
pomoc = liczby[i];
j = i - 1;
while ((j >= 0) && (pomoc < liczby[j]))
{
liczby[j+1] = liczby[j];
j--;
}
liczby[j+1] = pomoc;
}
Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie
3
Sortowanie bąbelkowe
for (int i = 1; i < liczby.length; i++)
{
for (j = liczby.length - 1; j >= i; j--)
if (liczby[j-1] > liczby[j])
{
pomoc = liczby[j];
liczby[j] = liczby[j-1];
liczby[j-1] = pomoc;
}
}
Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie
4
2
2009-10-20
Sito Eratostenesa (1/2)
Sito Eratostenesa - algorytm pozwala na wyznaczenie liczb pierwszych
mniejszych lub równych wartości N.
Tworzymy listę wszystkich liczb naturalnych od 2 do N.
2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
Pierwsza liczba na liście jest liczbą pierwszą.
Usuwamy z listy wszystkie wielokrotności wyznaczonej liczby pierwszej.
2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
Powtarzamy kroki 2 oraz 3 aż do momentu usunięcia wszystkich liczb z listy.
Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie
5
Sito Eratostenesa (2/2)
Kolejna liczba pierwsza: 3
2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
Kolejna liczba pierwsza: 5
2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
Kolejna liczba pierwsza: 7
2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
Kolejna liczba pierwsza: 11
2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
Kolejna liczba pierwsza: 13
2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
Kolejna liczba pierwsza: 17
2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
Kolejna liczba pierwsza: 19
2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie
6
3
2009-10-20
Inwersja elementów w wektorze – wersja iteracyjna
import java.io.*;
public class ParametryTablicowe
{
static void drukuj(String s)
{
System.out.print(s);
}
static int czytajLiczbe() throws IOException
{
BufferedReader klaw = new BufferedReader (new
InputStreamReader (System.in));
return Integer.parseInt(klaw.readLine());
}
Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie
7
Inwersja elementów w wektorze – wersja iteracyjna
static int [] tworzWektor(int ileElementow)
// metoda zwraca referencje do tablicy
{
int [] tab = new int[ileElementow];
for(int i = 0; i < tab.length; i++)
tab[i] = i;
return tab;
}
static void drukujWektor(int [] tab)
{
for (int i = 0; i < tab.length; i++)
drukuj(tab[i] + " ");
drukuj("\n");
}
Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie
8
4
2009-10-20
Inwersja elementów w wektorze – wersja iteracyjna
static void inwersja(int [] tab)
// metoda modyfikuje tablice przekazana jako parametr
{
int i = 0;
int j = tab.length - 1;
int pomoc;
while (i < j)
{
pomoc = tab[i];
tab[i] = tab[j];
tab[j] = pomoc;
i++;
j--;
}
}
Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie
9
Inwersja elementów w wektorze – wersja iteracyjna
public static void main(String[] args) throws IOException
{
drukuj("Podaj liczbe elementow w wektorze: ");
int ileElementow = czytajLiczbe();
int [] wektor = tworzWektor(ileElementow);
drukujWektor(wektor);
inwersja(wektor);
drukujWektor(wektor);
}
}
Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie
10
5
2009-10-20
Tworzenie k-elementowych kombinacji bez powtórzeo nelementowego zbioru
Niech A oznacza zbiór składający się z n elementów. k-elementową kombinacją bez
powtórzeń (k ≤ n) elementów zbioru A nazywamy każdy k-elementowy podzbiór zbioru A.
Ilość k-elementowych kombinacji bez powtórzeń n elementów równa się:
n
n!
  
 k  k !n  k !
Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie
11
Tworzenie k-elementowych kombinacji bez powtórzeo nelementowego zbioru
Przykład
Napisać program wyświetlający wszystkie k-elementowe kombinacje bez powtórzeń
elementów zbioru obejmującego liczby naturalne od 1 do n (przyjmij, że wartości n oraz k
podawane będą przez użytkownika w trakcie działania programu.
Użytkownik określił wartości parametrów w następujący sposób:
n=4
k=3
Liczba kombinacji: 4
Program wyświetlił wyniki:
1,
2,
3
1,
2,
4
1,
3,
4
2,
3,
4
Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie
12
6
2009-10-20
Tworzenie k-elementowych kombinacji bez powtórzeo nelementowego zbioru
• Elementy wchodzące w skład każdej kombinacji wyświetlane
będą w kolejności rosnącej - dzięki czemu możemy określid
wartości maksymalne, które mogą się pojawid na kolejnych
pozycjach: na pozycji k będzie to wartośd n, na pozycji k-1
będzie to n-1, itd.
• Kolejne kombinacje prezentowane są w porządku
leksykograficznym (uporządkowanie słownikowe) - jeżeli
byśmy przyjęli, że liczby wchodzące w skład danej kombinacji
są kodami znaków, to utworzone w ten sposób słowa
uporządkowane byłyby alfabetycznie. Czyli pierwsza
kombinacja (dla n = 4 i k = 3) ma postad: 1,
2,
3.
Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie
13
Tworzenie k-elementowych kombinacji bez powtórzeo nelementowego zbioru
• Przy generowaniu każdej następnej kombinacji realizuję kroki:
– indeks = k (numer rozpatrywanego elementu w kombinacji)
– max = n (wartośd maksymalna na pozycji indeks)
– wyszukuję pierwszą (od prawej strony pozycję), na której mogę
umieścid wartośd większą od dotychczasowej (kolejno zmniejszam
indeks oraz max)
– zwiększam wartośd znajdującą się na pozycji indeks o jeden
– na kolejne pozycje (czyli od pozycji indeks+1 do k) wpisuję kolejne
liczby (na pozycji indeks+1 umieszczona zostanie wartośd o jeden
większa od wartości znajdującej się na pozycji indeks, na pozycji
indeks+2 znajdzie się wartośd o jeden większa od wartości znajdującej
się na pozycji indeks+1, itd.)
– wyświetlam utworzoną w ten sposób kombinację.
Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie
14
7
2009-10-20
Permutacje bez powtórzeo
• Niech A oznacza zbiór składający się z n elementów.
• Permutacją bez powtórzeo elementów zbioru A nazywamy
każdy ciąg n-elementowy (a1, a2, ..., an), składający się z
różnych elementów zbioru A.
• Ilośd permutacji bez powtórzeo elementów zbioru A wynosi
n!.
Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie
15
Permutacje bez powtórzeo
Przykład
Napisz program wyświetlający wszystkie permutacje elementów zbioru liczb całkowitych
obejmującego kolejne wartości od 1 do n (wartość n ma być podawana w trakcie działania
programu).
Przykład
n=3
Liczba permutacji: 3! = 6
Wyniki działania programu:
1,
1,
2,
2,
3,
3,
2,
3,
1,
3,
1,
2,
3
2
3
1
2
1
Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie
16
8
2009-10-20
Permutacje bez powtórzeo – algorytm Dijkstry
• kolejne permutacje wyświetlane będą w porządku
leksykograficznym
• pierwsza permutacja ma postad:
• 1, 2,
...
n
• zakładam, że elementy tworzące permutację przechowywane
są w wektorze a indeksowanym wartościami od 1 do n
Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie
17
Permutacje bez powtórzeo – algorytm Dijkstry
• przy generowaniu każdej następnej permutacji realizowane są
następujące kroki:
– na podstawie bieżącej permutacji wyznaczana jest wartośd i, która jest
maksymalną wartością indeksu, dla której spełniony jest warunek:
a[i] < a[i+1]
Przykład:
dla a = *1 4 6 2 9 5 8 7 3+ poszukiwana wartośd i wynosi 6
fragment wektora a od pozycji i+1 do kooca nazywany jest ogonem.
Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie
18
9
2009-10-20
Permutacje bez powtórzeo – algorytm Dijkstry
– poszukujemy wartości j (przy czym j spełniad musi warunek: i+1 ≤ ­j ≤ n, czyli jest
indeksem elementu znajdującego się w ogonie wektora a), dla której a[j] jest
najmniejszą wartością spełniającą warunek a*j+ > a*i+
Przykład:
dla wektora zdefiniowanego powyżej j jest równe 8
– dokonujemy zamiany elementów znajdujących się na pozycji i oraz j
Przykład:
w powyższym przypadku uzyskujemy: a = *1 4 6 2 9 7 8 5 3+
– odwracamy kolejnośd elementów znajdujących się w ogonie wektora a
Przykład:
w powyższym przypadku uzyskujemy: a = *1 4 6 2 9 7 3 5 8+
Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie
19
10

Podobne dokumenty