S jest niepustym zbiorem skończonym, A jest niepustą rodziną podzbiorów S.
Dla każdych A∈A∧B⊂A zachodzi B∈A .
Dla każdych A,B∈A:∣B∣>∣A∣∃x∈B−A⟹A∪{x}∈A
Elementy A nazywamy zbiorami niezależnymi, a zbiory niezależne o maksymalnej liczbie elementów nazywamy bazą.
function Greedy(([n], A) : matroid, w:[n] => R){ posortuj elementy tak, aby (w(1) >= w(2) >= w(3) .....); R <-{ } ; for(int i = 1; i <=n ; i++){ if(R + i < A){ R += i; } }}
Dowód
Ri - stan zbioru po i iteracjach głównej pętli
Dla każdego i istnieje optymalna baza Bi taka, że Ri⊆B , oraz B−Ri jest podzbiorem zbioru {i+1,i+2,...,n};
baza: R puste, więc R0⊂B , a B - R0 zawiera wszystkie wierzchołki.
Przypuśćmy, że prawda dla i - 1 i rozpatrzmy przypadki:
i nie zostało wzięte do R. Wtedy Ri−∪{i} nie jest niezależne. Bi=Bi−1.
i zostało wzięte do R. Wtedy znowu są przypadki:
i∈Bi−1 , wtedy Bi=Bi−1.
i∈/Bi−1 . Wtedy tworzymy bazę B’ wielokrotnie wykonując:
C = R_i; while (|C| < |B_i|){ x = B_i - C; z aksjomatu wymiany C = C + x; }
Pod koniec tego procesu C staje się bazą, ponieważ osiąga maksymalny rozmiar.
Przyjmujemy ją jako B’. B′⊂Ri∪Bi−1=Ri−1∪{i}∪Bi−1=Bi−1∪{i}
Jako że B’ równe rozmiarami do B_i-1, B’ zawiera i oraz B_i-1 nie zawiera {i}, to musi istnieć jakieś j, którego nie ma B’ a jest w B_i-1. j>i, ponieważ jeśli j zawierało się w B_i-1, ale nie w B’, a R_i zawiera się w całości w B’ oraz R_i = R_i-1 + i, to oznacza że j nie jest w R_i-1, czyli jest w B_i-1 - R_i-1. Jako że j nie jest i, to musi należeć do zbioru {i+1, …, n}, czyli jest większe.
Jako że w(B’) = w(B_i-1) + w(i) - w(j), a jako że i < j, więc w(i) > w(j), to baza B’ jest optymalniejsza, czyli można wziąć B_i = B’.
Problem szeregowania zadań
Można go rozwiązać sposobem zachłannym. d : [n] => N gdzie d(i) to deadline na ite zadanie, a w: [n] => R+ to kara za wykonanie itego zadania po czasie. Szukana jest takie uszeregowanie zadań, które minimalizuje sumaryczną karę.
Istnieje optymalne rozwiązanie, gdzie każde zadanie po terminie jest oddane po wszystkich zadaniach przed terminem. Jeśli jest przeciwnie, można je bezkarnie zamienić
Wśród wszystkich zadań terminowych, da się je posortować niemalejąco względem deadline. Poraz kolejny, można je pozamieniać trywialnie.
Zbiór zadań Z nazwiemy niezależnym, jeśli da się uszeregować je tak, aby wszystkie zadania były terminowe. B to rodzina wszystkich zbiorów Z. (Z, B ) to matroid, bo:
Jeśli A niezależny , to B⊆A też
Aksjomat zachowany, indukcja po rozmiarze zbioru A. Jeśli ∣A∣<∣B∣ , to wtedy:
rozpatrzmy ostanie zadanie w B jako x.
jeśli x∈A to wtedy dla A′=A−x oraz B′=B−x , jako że A’ i B’ są o jeden element mniejsze, to z założenia indukcyjnego warunek spełniony dla A’ i B’, więc ∃y∈B′−A′∧y!=x , więc A′+y niezależne. Teraz przypisując x czas zakończenia k+1, wiemy że będzie ono wykonane terminowo, ponieważ jeśli k < m to k+1 <= m, więc A’ + x jest niezależne. Na bazie indukcji prawdziwe
Problem można rozwiązać na podstawie algorytmu zachłannego. maksymalizujemy ilość kar niezapłaconych, rozwiązując tutaj problem bazy matroidu.
Sortowanie kubełkowe w O(n), można przechowywać R w zrównoważonym drzewie binarnym, gdzie w każdym węźle dodatkowo trzymamy ilość potomków, więc O(nlog(n)) całość.