Wprowadzenie do Algorytmiki Operacje bitowe Bn B Dr
Wprowadzenie do Algorytmiki Operacje bitowe, Bn. B Dr inż. Szymon Wąsik
Praca w ciągu tygodnia
Praca w ciągu tygodnia
Praca w ciągu tygodnia l l l Rafał Promiński (x 2) Marcin Zatorski (x 2) Marcin Szwarc (x 2) Oskar Firlej Krystian Gaczyński Marcin Janicki Jan Chlebek Jakub Pituła Gabriela Bartoszewska Andrzej Gauza Mateusz Kałamoniak
Praca w ciągu tygodnia
Praca w ciągu tygodnia l l l l Rafał Promiński (x 2) Marcin Zatorski (x 2) Marcin Szwarc (x 2) Oskar Firlej Krystian Gaczyński Marcin Janicki Jan Chlebek Jakub Pituła Gabriela Bartoszewska Andrzej Gauza Mateusz Kałamoniak Mieszko Jędrzejczak Mateusz Bąk
Problem wyboru zajęć l Dostępna jest jedna sala wykładowa l Dostępny jest zbiór zajęć l Dla każdych zajęć podany jest czas rozpoczęcia i zakończenia l Należy wybrać jak najbardziej liczny podzbiór zajęć nienachodzących na siebie
Przykład Z 6 Z 5 Z 4 Z 1 Z 2 Z 3 czas
Rozwiązanie l Posortuj zajęcia względem czasu ich zakończenia l Dodawaj do rozwiązania kolejne najszybciej kończące się zajęcia, które nie nakładają się z innymi już wybranymi
Algorytmy zachłanne l Zachłannie podejmują najlepszą w danym momencie decyzję l Często mogą dawać błędne wyniki l Wymagany jest dowód!
Operatory logiczne w C l && (and), || (or), ! (not) l Operują na wartościach true (prawda) i false (fałsz) l Fałsz ma wartość 0 l Każda niezerowa wartość (również ujemna) to prawda l Przykład: if (a - b) printf("Rozne");
Operatory bitowe w C l Działają na poszczególnych bitach liczb l Wykonują operację na każdym kolejnym bicie liczby jeden po drugim l Operatory: l & (AND) l | (OR) l ~ (NOT) – neguje każdy bit l ^ (XOR – exclusive OR) – zwraca 1 jeżeli bity są różne
Operatory bitowe - przykład 14 05 14 | 05 14 & 05 14 ^ 05 ~05 = = = 1110 0101 1111 = 15 0100 = 4 1011 = 11 11111010 = 250
Przesunięcia bitowe l << (SHL): l Przesunięcie bitowe w lewo l Dodaje zera z prawej strony l 14 << 2 = 111000 = 56 l Odpowiada mnożeniu przez 2 l >> (SHR): l Przesunięcie bitowe w prawo l Obcina bity z prawej strony l 14 >> 2 = 1110 >> 2 = 11 = 3 l Odpowiada dzieleniu przez 2 bez reszty
Operacje bitowe l Sprawdzenie k-tego bitu: v & (1 << k) != 0 l Ustawienie k-tego bitu: v |= 1 << k l Usunięcie k-tego bitu: v &= ~(1 << k)
Zliczanie zapalonych bitów l Dla jednej liczby: for (int i = 0; i < 32; i++) if (v & (1 << i)) bity++; l Dla wszystkich liczb: bity[0] = 0; for (int i = 1; i < n; i++) bity[i] = bity[i >> 1] + (i & 1);
Zliczanie zapalonych bitów l Dla jednej liczby: int popcount_3(uint 64 x) { x -= (x >> 1) & m 1; x = (x & m 2) + ((x >> 2) & m 2); x = (x + (x >> 4)) & m 4; return (x * h 01)>>56; } l Więcej: http: //en. wikipedia. org/wiki/Hammin g_weight
Generowanie podzbiorów l Dany jest zbiór n elementowy l Wszystkie jego podzbiory mogą być reprezentowane przez liczby 0. . 2 n-1 l Bit zapalony oznacza element występujący w podzbiorze l Zliczanie bitów + sortowanie = szeregowanie podzbiorów względem liczby elementów (np. dla prog. dyn. )
Zapis liczb binarnych l Każde kolejne 4 bity można zapisać za pomocą jednej cyfry szesnastkowej l W C stosujemy zapis 0 x, np. : 14 = 0 x. E 10110011 = 0 x. B 3 l Aby uzyskać typ unsigned należy dodać U l Aby uzyskać typ long należy dodać LL l Przykład: 0 x. FFFFFFFFULL
Zadanie Plotki l W miasteczku mieszka n (max 1000) osób l Codziennie każda z nich wymyśla nową plotkę l Gdy dwie osoby spotykają się wymieniają się wszystkimi plotkami, które znają l Mając dany ciąg spotkań sprawdź, czy na koniec każdy będzie znał każdą plotkę
Zadanie Plotki l Reprezentujmy ludzi jako 1000 -bitowe tablice: Dzielenie przez 26=64 typedef unsigned long ull; ull t[1000][1000 >> 6 + 1]; l Reprezentujmy plotki jako bity: void setb(ull *ti, int p) { Osoba ti ti[p >> 6] |= 1 << (p & 0 x 3 F); zna } plotkę p W pojedynczym elemencie tablicy można przechować tylko 64 plotki
Zadanie Plotki l Inicjalizacja: for (int i = 0; i < n; i++) setb(t[i], i); l Spotkanie: void or(ull *ti, ull *tj) { for (int i = 0; i < n >> 6 + 1; i++) { ti[i] |= tj[i]; tj[i] |= ti[i]; } }
Problem QAP l Dane jest n fabryk i n odbiorców l Dana jest macierz odległości pomiędzy fabrykami i odbiorcami l Każdą fabrykę należy przyporządkować do innego odbiorcy, tak aby suma odległości była minimalna
Rozwiązanie brutalne l Sprawdzamy wszystkie permutacje, np. : do { check_sol(p); } while (next_permutation(p, p+n)); l Złożoność O(n*n!)
Wersja rekurencyjna void sol(int k) { if (k == n) check_sol(p); k oznacza liczbę else { elementów dodanych do permutacji for (int i = 0; i < n; i++) if (!add[i]) Jeżeli element nie { został jeszcze dodany do permutacji add[i] = true; p[k] = i; Dodaj go sol(k + 1); Wygeneruj add[i] = false; permutację do końca i po jej sprawdzeniu } usuń element } sol(0);
Przykład 1 2 3 4 5 A 5 3 7 4 9 B 8 6 3 5 4 C 7 6 2 4 7 D 5 6 5 7 3 E 4 3 8 5 6 Suma = 26
Przykład 1 2 3 4 5 A 5 3 7 4 9 B 8 6 3 5 4 C 7 6 2 4 7 D 5 6 5 7 3 E 4 3 8 5 6 Suma = 21
Przykład l Po pierwszych dwóch permutacjach wiadomo, że wynik jest mniejszy lub równy 21 l 21 to górna granica wyniku, tzw. Upper Bound (UB)
Przykład l Czy opłaca się zaczynać permutację od piątej fabryki? l Wybierzmy minimum z każdego wiersza l Otrzymany wynik to najbardziej optymistyczne 1 2 3 4 A 5 3 7 4 oszacowanie wyniku B 8 6 3 5 końcowego: C 7 6 2 4 9 + 3 + 2 + 5 + 3 = 22 D 5 6 5 7 E 4 3 8 5 5 9 4 7 3 6
Przykład l Jeżeli w pierwszym wierszu wybierzemy piątą fabrykę, to wynik na pewno nie będzie mniejszy niż 22 l Liczba ta jest dolną granicą wyniku, czyli tzw. Lower Bound (LB) l W rzeczywistości wynik będzie większy niż 22, bo trzecią fabrykę w oszacowanym wariancie przydzielono do kilku odbiorców
Przykład l Skoro wynik nie będzie lepszy niż 22, a znaleziono już rozwiązanie o wartości 21, to nie ma sensu kontynuować l Jeżeli górna granica jest niższa niż dolna, czyli: LB >= UP to nie ma sensu kontynuować przeszukiwania z danego punktu
Algorytm Bn. B l Algorytm podziału i ograniczeń – Branch and Bound l UB – najlepsze znalezione dotychczas rozwiązanie l LB – jak najlepsze oszacowanie wyniku, którego wartość nie może być większa niż rzeczywisty wynik
Algorytm Bn. B l Warunek sprawdzany na każdym poziomie przeszukiwania: 1 2 3 4 5 A 5 3 7 4 9 B 8 6 3 5 4 C 7 6 2 4 7 D 5 6 5 7 3 E 4 3 8 5 6
Możliwe optymalizacje l Wyliczanie dwóch różnych LB: l Z każdego wiersza wybieramy minimum l Z każdej kolumny wybieramy minimum l Bierzemy większą z powyższych wartości l Dodając kolejny element do permutacji sprawdzamy je w kolejności rosnących LB
- Slides: 34