आप किस रंग में हैं, इसका ट्रैक रखने के लिए एक स्टैक का उपयोग करके बाएं से दाएं चलो। असतत मानचित्र के बजाय, ब्रेक-पॉइंट के रूप में अपने डेटासेट में 10 नंबर का उपयोग करें।
एक खाली स्टैक के साथ शुरू करना, और start
0 पर सेट करना, लूप जब तक हम अंत तक नहीं पहुंचते:
- यदि स्टैक खाली है:
- पहले या बाद में शुरू होने वाले रंग को देखें
start
, और इसे और सभी निचले क्रम वाले रंगों को स्टैक पर रखें। अपनी चपटी सूची में, उस रंग की शुरुआत को चिह्नित करें।
- और (यदि खाली नहीं):
- किसी भी उच्च श्रेणी के रंग के लिए या उसके बाद अगला आरंभ बिंदु खोजें
start
, और वर्तमान रंग का अंत ढूंढें
- अगर अगला रंग पहले शुरू होता है, तो इसे धक्का दें और स्टैक पर इसे करने के लिए कुछ और। वर्तमान रंग के अंत को इस एक की शुरुआत के रूप में अपडेट करें, और इस रंग की शुरुआत को चपटा सूची में जोड़ें।
- यदि कोई नहीं है और वर्तमान रंग पहले समाप्त होता है, तो
start
इस रंग के अंत में सेट करें, इसे स्टैक से पॉप करें, और अगले-सर्वोच्च रैंक वाले रंग की जांच करें
- यदि
start
अगले रंग की सीमा के भीतर है, तो इस रंग को चपटा सूची में जोड़ें, जो शुरू हो रहा है start
।
- यदि स्टैक खाली हो जाता है, तो लूप जारी रखें (पहले बुलेट बिंदु पर वापस जाएं)।
यह एक मानसिक रन-थ्रू आपका उदाहरण डेटा दिया गया है:
# 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.