Berjalan dari kiri ke kanan, menggunakan tumpukan untuk melacak warna apa yang Anda pakai. Alih-alih peta diskrit, gunakan 10 angka dalam dataset Anda sebagai break-point.
Dimulai dengan tumpukan kosong, dan pengaturan start
ke 0, loop sampai kita mencapai akhir:
- Jika tumpukan kosong:
- Cari warna pertama mulai dari atau setelahnya
start
, dan dorong dan semua warna dengan peringkat lebih rendah ke tumpukan. Dalam daftar Anda yang rata, tandai bagian awal warna itu.
- lain (Jika tidak kosong):
- Temukan titik awal berikutnya untuk warna dengan peringkat lebih tinggi pada atau setelahnya
start
, dan temukan akhir dari warna saat ini
- Jika warna berikutnya dimulai lebih dulu, dorong dan apa pun yang lain dalam perjalanan ke tumpukan. Perbarui akhir warna saat ini sebagai awal dari yang satu ini, dan tambahkan awal warna ini ke daftar yang diratakan.
- Jika tidak ada dan warna saat ini berakhir lebih dulu, atur
start
ke akhir warna ini, keluarkan dari tumpukan, dan periksa warna berperingkat tertinggi berikutnya
- Jika
start
berada dalam kisaran warna berikutnya, tambahkan warna ini ke daftar yang diratakan, mulai dari start
.
- Jika tumpukan kosong, lanjutkan loop (kembali ke titik peluru pertama).
Ini adalah mental yang diberikan mengingat data contoh Anda:
# Initial data.
flattened = []
stack = []
start = 0
# Stack is empty. Look for the next starting point at 0 or later: "b", 0 - Push it and all lower levels onto stack
flattened = [ (b, 0, ?) ]
stack = [ r, b ]
start = 0
# End of "b" is 5.4, next higher-colored start is "g" at 2 - Delimit and continue
flattened = [ (b, 0, 2), (g, 2, ?) ]
stack = [ r, b, g ]
start = 2
# End of "g" is 12, next higher-colored start is "y" at 3.5 - Delimit and continue
flattened = [ (b, 0, 2), (g, 2, 3.5), (y, 3.5, ?) ]
stack = [ r, b, g, y ]
start = 3.5
# End of "y" is 6.7, next higher-colored start is "o" at 6.7 - Delimit and continue
flattened = [ (b, 0, 2), (g, 2, 3.5), (y, 3.5, 6.7), (o, 6.7, ?) ]
stack = [ r, b, g, y, o ]
start = 6.7
# End of "o" is 10, and there is nothing starting at 12 or later in a higher color. Next off stack, "y", has already ended. Next off stack, "g", has not ended. Delimit and continue.
flattened = [ (b, 0, 2), (g, 2, 3.5), (y, 3.5, 6.7), (o, 6.7, 10), (g, 10, ?) ]
stack = [ r, b, g ]
start = 10
# End of "g" is 12, there is nothing starting at 12 or later in a higher color. Next off stack, "b", is out of range (already ended). Next off stack, "r", is out of range (not started). Mark end of current color:
flattened = [ (b, 0, 2), (g, 2, 3.5), (y, 3.5, 6.7), (o, 6.7, 10), (g, 10, 12) ]
stack = []
start = 12
# Stack is empty. Look for the next starting point at 12 or later: "r", 12.5 - Push onto stack
flattened = [ (b, 0, 2), (g, 2, 3.5), (y, 3.5, 6.7), (o, 6.7, 10), (g, 10, 12), (r, 12.5, ?) ]
stack = [ r ]
start = 12
# End of "r" is 13.8, and there is nothing starting at 12 or higher in a higher color. Mark end and pop off stack.
flattened = [ (b, 0, 2), (g, 2, 3.5), (y, 3.5, 6.7), (o, 6.7, 10), (g, 10, 12), (r, 12.5, 13.8) ]
stack = []
start = 13.8
# Stack is empty and nothing is past 13.8 - We're done.