bym
- Miej nieuporządkowaną listę „open” waha
- Rozpocznij od dnia 1, a następnie dodaj pierwszy zakres do listy zakresów otwartym.
- Przenieś do następnej granicy zakresu (rozpoczęcia lub zamknięcia). Utwórz swój pierwszy "wynikowy" zakres: od 1 dnia, kończący się tego dnia. W tym są pozycje na liście otwartych zakresów.
- Jeśli napotkany zakres znajduje się już na liście otwartych zakresów, usuń go. W przeciwnym razie dodaj.
- Powtórz 3 i 4, przesuwając wzdłuż linii.
Z całą pewnością nie udawało mi się tego wyjaśnić. Wkrótce napiszę o tym kod. Ale do tego czasu, oto co by się stało w roztworze:
a |------------------------------|
b |-------------------|
c |-----------------|
1. Start at day 1, add A to open ranges list, which now contains [A]
2. Move to the start of C. First RESULT RANGE: A range from Day 1 to C's start,
with a value A. (what is in your open ranges list)
3. Add C to the open ranges list, which now contains [A,C]
4. Move to the start of B. Second RESULT RANGE: A range from C's start to B's
start, with a value A,C. (what is in your open ranges list)
5. Add B to the open ranges list, which now contains [A,C,B]
6. Move to the end of C. Third RESULT RANGE: A range from B's start to C's end,
with a value of A,C,B.
7. Remove C from the open ranges list, which now contains [A,B]
8. Move to the end of A. Fourth RESULT RANGE: A range from C's end to A's end,
with a value of A,B
9. Remove A from the open ranges list, which now contains [B]
10. Move to the end of A. Fourth RESULT RANGE: A range from A's end to B's end,
with a value of B
RESULT RANGES
1. from Day 1 to C's start: A
2. from C's start to B's start: A,C
3. from B's start to C's end: A,C,B
4. from C's end to A's end: A,B
5. from A's end to B's end: B
Alternatywna metoda
Można to zrobić:
- Zachowaj uporządkowaną listę „zakresów wyjściowych ". Ułatwia to sprawdzenie, czy punkt znajduje się w pewnym zakresie, a także jakie zasięgi następują po sobie.
- Skorzystaj z zakresu wejściowego.
- Sprawdź, czy jest całkowicie przed lub całkowicie po wszystkich zakresach wyjściowych, i odpowiednio postępuj. Pomiń kolejne kroki i wróć do kroku 2, jeśli tak.
- Porównaj punkt początkowy z zakresami wyjściowymi
- Jeśli występuje przed jakimkolwiek innym zakresem wyjściowym, dodaj nowy zakres wyjściowy od początku do początku pierwszego zakresu wyjściowego.
- Jeśli znajduje się pomiędzy już istniejącym zakresem wyjściowym, podziel ten zakres wyjściowy w tym punkcie. Pierwsza część będzie miała tych samych "rodziców", a druga część będzie miała tych samych rodziców + nowy zakres wejściowy.
- Teraz porównaj jego punkt końcowy z zakresami wyjściowymi.
- Jeśli występuje po jakimkolwiek innym zakresie wyjściowym, dodaj nowy zakres wyjściowy od końca ostatniego zakresu wyjściowego do jego końca.
- Jeśli znajduje się pomiędzy już istniejącym zakresem wyjściowym, podziel ten zakres wyjściowy w tym punkcie. Druga część będzie miała tych samych "rodziców", a pierwsza część będzie miała tych samych rodziców + nowy zakres wejściowy
- Dodaj bieżący zakres wejściowy jako część do wszystkich zakresów pomiędzy dwoma "przetworzonymi" zakresami w krokach 6 i 9, jeśli jakiekolwiek.
- Powtórz 2-6 dla wszystkich zakresów wejściowych.
Oto kilka pierwszych kroków, za pomocą przykładowych danych + inny zakres D: ("przetworzone" zakresach wskazanych przez **double stars**
)
a |------------------------------|
b |-------------------|
c |-----------------|
d |------------------------|
1.
Process A
Output ranges: |--------------A---------------|
2.
Process B
- Start of B is in **A**; split A in two:
|-------A-------|------AB------|
- End of B is after any output range range;
creating new output range at end
|-------A-------|------AB------|---B---|
- Nothing was/is in between **A** and (nothing)
3.
Process C
- Start of C is in **A**; split A in two:
|---A----|--AC--|------AB------|---B---|
- End of C is in **AB**; split AB in two:
|---A----|--AC--|--ABC--|--AB--|---B---|
- There were/are no ranges between **A** and **AB**
4.
Process D
- Start of D is in **A**; split A in two:
|-A-|-AD-|--AC--|--ABC--|--AB--|---B---|
- End of D is in **AB**; split AB in two:
|-A-|-AD-|--AC--|--ABC--|ABD|AB|---B---|
- Ranges AC and ABC were/are in between **A** and **AB**
|-A-|-AD-|--ACD-|-ABCD--|ABD|AB|---B---|
Final output: |-A-|-AD-|--ACD-|-ABCD--|ABD|AB|---B---|
Dzięki za odpowiedź. Mam pytanie dotyczące punktu 6 alternatywnej metody. Nie jestem pewien, czy rozumiem. Czy możesz się rozwijać? –
Opracowałem i dodałem demonstrację. –
Dzięki Justin. W punkcie 9 odwołujesz się do kroków 4 i 5. Czy chodziło Ci o 5 i 8? –