■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✸ Example I: Dates Abstract level: names for dates over a certain range Concrete level: typically 6 characters: YYMMDD Date crises caused by INADEQUATE internal formats: Slide 102 • Digital’s PDP-10 : using 12-bit dates (good for at most 11 years) • 2000 crisis : 48 bits could be good for lifetime of universe! Lessons : • Information can be represented in many ways. • Get it wrong, and you will be sorry! ❉✐❣✐t❛❧ ❊q✉✐♣♠❡♥t ❈♦r♣♦r❛t✐♦♥✬s ❞❛t❡ ❝r✐s✐s ♦❝❝✉rr❡❞ ✐♥ ✶✾✼✺✳ ❚❤❡ P❉P✲ ✶✵ ✇❛s ❛ ✸✻✲❜✐t ♠❛✐♥❢r❛♠❡ ❝♦♠♣✉t❡r✳ ■t r❡♣r❡s❡♥t❡❞ ❞❛t❡s ✉s✐♥❣ ❛ ✶✷✲❜✐t ❢♦r♠❛t ❞❡s✐❣♥❡❞ ❢♦r t❤❡ t✐♥② P❉P✲✽✳ ❲✐t❤ ✶✷ ❜✐ts✱ ♦♥❡ ❝❛♥ ❞✐st✐♥❣✉✐s❤ 2 12 = 4096 ❞❛②s ♦r ✶✶ ②❡❛rs✳ ❚❤❡ ♠♦st ❝♦♠♠♦♥ ✐♥❞✉str② ❢♦r♠❛t ❢♦r ❞❛t❡s ✉s❡s s✐① ❝❤❛r❛❝t❡rs✿ t✇♦ ❢♦r t❤❡ ②❡❛r✱ t✇♦ ❢♦r t❤❡ ♠♦♥t❤ ❛♥❞ t✇♦ ❢♦r t❤❡ ❞❛②✳ ❚❤❡ ♠♦st ❝♦♠♠♦♥ ✏s♦❧✉t✐♦♥✑ t♦ t❤❡ ②❡❛r ✷✵✵✵ ❝r✐s✐s ✐s t♦ ❛❞❞ t✇♦ ❢✉rt❤❡r ❝❤❛r❛❝t❡rs✱ t❤❡r❡❜② ❛❧t❡r✐♥❣ ✜❧❡ s✐③❡s✳ ❖t❤❡rs ❤❛✈❡ ♥♦t✐❝❡❞ t❤❛t t❤❡ ❡①✐st✐♥❣ s✐① ❝❤❛r❛❝t❡rs ❝♦♥s✐st ♦❢ ✹✽ ❜✐ts✱ ❛❧r❡❛❞② s✉✣❝✐❡♥t t♦ r❡♣r❡s❡♥t ❛❧❧ ❞❛t❡s ♦✈❡r t❤❡ ♣r♦❥❡❝t❡❞ ❧✐❢❡t✐♠❡ ♦❢ t❤❡ ✉♥✐✈❡rs❡✿ 2 48 = 2 . 8 × 10 14 ❞❛②s = 7 . 7 × 10 11 ②❡❛rs✦ ▼❛t❤❡♠❛t✐❝✐❛♥s t❤✐♥❦ ✐♥ t❡r♠s ♦❢ ✉♥❜♦✉♥❞❡❞ r❛♥❣❡s✱ ❜✉t t❤❡ r❡♣r❡s❡♥✲ t❛t✐♦♥ ✇❡ ❝❤♦♦s❡ ❢♦r t❤❡ ❝♦♠♣✉t❡r ✉s✉❛❧❧② ✐♠♣♦s❡s ❤❛r❞ ❧✐♠✐ts✳ ❆ ❣♦♦❞ ♣r♦✲ ❣r❛♠♠✐♥❣ ❧❛♥❣✉❛❣❡ ❧✐❦❡ ▼▲ ❧❡ts ♦♥❡ ❡❛s✐❧② ❝❤❛♥❣❡ t❤❡ r❡♣r❡s❡♥t❛t✐♦♥ ✉s❡❞ ✐♥ t❤❡ ♣r♦❣r❛♠✳ ❇✉t ✐❢ ✜❧❡s ✐♥ t❤❡ ♦❧❞ r❡♣r❡s❡♥t❛t✐♦♥ ❡①✐st ❛❧❧ ♦✈❡r t❤❡ ♣❧❛❝❡✱ t❤❡r❡ ✇✐❧❧ st✐❧❧ ❜❡ ❝♦♥✈❡rs✐♦♥ ♣r♦❜❧❡♠s✳ ❚❤❡ ♥❡❡❞ ❢♦r ❝♦♠♣❛t✐❜✐❧✐t② ✇✐t❤ ♦❧❞❡r s②st❡♠s ❝❛✉s❡s ♣r♦❜❧❡♠s ❛❝r♦ss t❤❡ ❝♦♠♣✉t❡r ✐♥❞✉str②✳
■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✹ Example II: Floating-Point Numbers Computers have integers like 1066 and reals like 1 . 066 × 10 3 . A floating-point number is represented by two integers. Slide 103 Both types come in different precisions : their range and accuracy. The concept of DATA TYPE comprises • how a value is represented inside the computer, and • the suite of operations given to programmers. ❋❧♦❛t✐♥❣ ♣♦✐♥t ♥✉♠❜❡rs ❛r❡ ✇❤❛t ②♦✉ ❣❡t ♦♥ ❛♥② ♣♦❝❦❡t ❝❛❧❝✉❧❛t♦r✳ ■♥✲ t❡r♥❛❧❧②✱ ❛ ✢♦❛t ❝♦♥s✐sts ♦❢ t✇♦ ✐♥t❡❣❡rs✿ t❤❡ ♠❛♥t✐ss❛ ✭❢r❛❝t✐♦♥❛❧ ♣❛rt✮ ❛♥❞ t❤❡ ❡①♣♦♥❡♥t ✳ ❈♦♠♣❧❡① ♥✉♠❜❡rs✱ ❝♦♥s✐st✐♥❣ ♦❢ t✇♦ r❡❛❧s✱ ♠✐❣❤t ❜❡ ♣r♦✈✐❞❡❞✳ ❲❡ ❤❛✈❡ t❤r❡❡ ❧❡✈❡❧s ♦❢ ♥✉♠❜❡rs ❛❧r❡❛❞②✦ ▼♦st ❝♦♠♣✉t❡rs ❣✐✈❡ ✉s ❛ ❝❤♦✐❝❡ ♦❢ ♣r❡❝✐s✐♦♥s✱ t♦♦✳ ■♥ ✸✷✲❜✐t ♣r❡❝✐s✐♦♥✱ ✐♥t❡❣❡rs t②♣✐❝❛❧❧② r❛♥❣❡ ❢r♦♠ 2 31 − 1 ✭♥❛♠❡❧② ✷✱✶✹✼✱✹✽✸✱✻✹✼✮ t♦ − 2 31 ❀ r❡❛❧s ❛r❡ ❛❝❝✉r❛t❡ t♦ ❛❜♦✉t s✐① ❞❡❝✐♠❛❧ ♣❧❛❝❡s ❛♥❞ ❝❛♥ ❣❡t ❛s ❧❛r❣❡ ❛s 10 35 ♦r s♦✳ ❋♦r r❡❛❧s✱ ✻✹✲❜✐t ♣r❡❝✐s✐♦♥ ✐s ♦❢t❡♥ ♣r❡❢❡rr❡❞✳ ❍♦✇ ❞♦ ✇❡ ❦❡❡♣ tr❛❝❦ ♦❢ s♦ ♠❛♥② ❦✐♥❞s ♦❢ ♥✉♠❜❡rs❄ ■❢ ✇❡ ❛♣♣❧② ✢♦❛t✐♥❣✲♣♦✐♥t ❛r✐t❤♠❡t✐❝ t♦ ❛♥ ✐♥t❡❣❡r✱ t❤❡ r❡s✉❧t ✐s ✉♥❞❡✜♥❡❞ ❛♥❞ ♠✐❣❤t ❡✈❡♥ ✈❛r② ❢r♦♠ ♦♥❡ ✈❡rs✐♦♥ ♦❢ ❛ ❝❤✐♣ t♦ ❛♥♦t❤❡r✳ ❊❛r❧② ❧❛♥❣✉❛❣❡s ❧✐❦❡ ❋♦rtr❛♥ r❡q✉✐r❡❞ ✈❛r✐❛❜❧❡s t♦ ❜❡ ❞❡❝❧❛r❡❞ ❛s ✐♥t❡❣❡r ♦r r❡❛❧ ❛♥❞ ♣r❡✈❡♥t❡❞ ♣r♦❣r❛♠♠❡rs ❢r♦♠ ♠✐①✐♥❣ ❜♦t❤ ❦✐♥❞s ♦❢ ♥✉♠❜❡r ✐♥ ❛ ❝♦♠♣✉t❛t✐♦♥✳ ◆♦✇❛❞❛②s✱ ♣r♦❣r❛♠s ❤❛♥❞❧❡ ♠❛♥② ❞✐✛❡r❡♥t ❦✐♥❞s ♦❢ ❞❛t❛✱ ✐♥❝❧✉❞✐♥❣ t❡①t ❛♥❞ s②♠❜♦❧s✳ ▼♦❞❡r♥ ❧❛♥❣✉❛❣❡s ✉s❡ t❤❡ ❝♦♥❝❡♣t ♦❢ ❞❛t❛ t②♣❡ t♦ ❡♥s✉r❡ t❤❛t ❛ ❞❛t✉♠ ✉♥❞❡r❣♦❡s ♦♥❧② t❤♦s❡ ♦♣❡r❛t✐♦♥s t❤❛t ❛r❡ ♠❡❛♥✐♥❣❢✉❧ ❢♦r ✐t✳ ■♥s✐❞❡ t❤❡ ❝♦♠♣✉t❡r✱ ❛❧❧ ❞❛t❛ ❛r❡ st♦r❡❞ ❛s ❜✐ts✳ ❉❡t❡r♠✐♥✐♥❣ ✇❤✐❝❤ t②♣❡ ❛ ♣❛rt✐❝✉❧❛r ❜✐t ♣❛tt❡r♥ ❜❡❧♦♥❣s t♦ ✐s ✐♠♣♦ss✐❜❧❡ ✉♥❧❡ss s♦♠❡ ❜✐ts ❤❛✈❡ ❜❡❡♥ s❡t ❛s✐❞❡ ❢♦r t❤❛t ✈❡r② ♣✉r♣♦s❡ ✭❛s ✐♥ ❧❛♥❣✉❛❣❡s ❧✐❦❡ ▲✐s♣ ❛♥❞ Pr♦❧♦❣✮✳ ■♥ ♠♦st ❧❛♥❣✉❛❣❡s✱ t❤❡ ❝♦♠♣✐❧❡r ✉s❡s t②♣❡s t♦ ❣❡♥❡r❛t❡ ❝♦rr❡❝t ♠❛❝❤✐♥❡ ❝♦❞❡✱ ❛♥❞ t②♣❡s ❛r❡ ♥♦t st♦r❡❞ ❞✉r✐♥❣ ♣r♦❣r❛♠ ❡①❡❝✉t✐♦♥✳
■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✺ Some Abstraction Levels in a Computer programmer high-level language operating system Slide 104 device drivers, . . . machine language registers & processors gates silicon ❚❤❡s❡ ❛r❡ ❥✉st s♦♠❡ ♦❢ t❤❡ ❧❡✈❡❧s t❤❛t ♠✐❣❤t ❜❡ ✐❞❡♥t✐✜❡❞ ✐♥ ❛ ❝♦♠♣✉t❡r✳ ▼♦st ❧❛r❣❡✲s❝❛❧❡ s②st❡♠s ❛r❡ t❤❡♠s❡❧✈❡s ❞✐✈✐❞❡❞ ✐♥t♦ ❧❡✈❡❧s✳ ❋♦r ❡①❛♠♣❧❡✱ ❛ ♠❛♥❛❣❡♠❡♥t ✐♥❢♦r♠❛t✐♦♥ s②st❡♠ ♠❛② ❝♦♥s✐st ♦❢ s❡✈❡r❛❧ ❞❛t❛❜❛s❡ s②st❡♠s ❜♦❧t❡❞ t♦❣❡t❤❡r ♠♦r❡✲♦r✲❧❡ss ❡❧❡❣❛♥t❧②✳ ❚❤✐s ✐s t❤❡ ♣r♦❣r❛♠♠❡r✬s ✈✐❡✇✳ ❚❤❡ ✉s❡r s❡❡s ❛ ❞✐✛❡r❡♥t ❤✐❡r❛r❝❤②✱ ❞❡✲ t❡r♠✐♥❡❞ ❜② t❤❡ s❡♣❛r❛t❡ ❛♣♣❧✐❝❛t✐♦♥ ♣r♦❣r❛♠s✱ t❤❡ ♦♣❡r❛t✐♥❣ s②st❡♠✱ ❛♥❞ t❤❡ ✈✐s✐❜❧❡ ❤❛r❞✇❛r❡ s✉❝❤ ❛s t❤❡ s❝r❡❡♥ ❛♥❞ ❉❱❉✲✇r✐t❡r✳ ❍♦♠❡ ❝♦♠♣✉t✲ ❡rs ❛r❡ ♣♦ss✐❜❧❡ ❜❡❝❛✉s❡ t❤❡ ✉s❡r✬s ✈✐❡✇ ❝❛♥ ❜❡ s♦ ♠✉❝❤ s✐♠♣❧❡r t❤❛♥ t❤❡ ♣r♦❣r❛♠♠❡r✬s✳ ❈♦♠♠✉♥✐❝❛t✐♦♥s ♣r♦t♦❝♦❧s ✉s❡❞ ♦♥ t❤❡ ■♥t❡r♥❡t ❡♥❝♦♠♣❛ss s❡✈❡r❛❧ ❧❛②❡rs✳ ❊❛❝❤ ❧❛②❡r ❤❛s ❛ ❞✐✛❡r❡♥t t❛s❦✱ s✉❝❤ ❛s ♠❛❦✐♥❣ ✉♥r❡❧✐❛❜❧❡ ❧✐♥❦s r❡❧✐❛❜❧❡ ✭❜② tr②✐♥❣ ❛❣❛✐♥ ✐❢ ❛ tr❛♥s♠✐ss✐♦♥ ✐s ♥♦t ❛❝❦♥♦✇❧❡❞❣❡❞✮ ❛♥❞ ♠❛❦✐♥❣ ✐♥s❡❝✉r❡ ❧✐♥❦s s❡❝✉r❡ ✭✉s✐♥❣ ❝r②♣t♦❣r❛♣❤②✮✳ ■t s♦✉♥❞s ❝♦♠♣❧✐❝❛t❡❞✱ ❜✉t t❤❡ ♥❡❝❡ss❛r② s♦❢t✇❛r❡ ❝❛♥ ❜❡ ❢♦✉♥❞ ♦♥ ♠❛♥② ♣❡rs♦♥❛❧ ❝♦♠♣✉t❡rs✳ ■♥ t❤✐s ❝♦✉rs❡✱ ✇❡ ❢♦❝✉s ❛❧♠♦st ❡♥t✐r❡❧② ♦♥ ♣r♦❣r❛♠♠✐♥❣ ✐♥ ❛ ❤✐❣❤✲❧❡✈❡❧ ❧❛♥❣✉❛❣❡ ✿ ▼▲✳
■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✻ What is Programming? • to describe a computation so that it can be done mechanically : — Expressions compute values . — Commands cause effects . Slide 105 • to do so efficiently , in both coding & execution • to do so CORRECTLY , solving the right problem • to allow easy modification as needs change • to give LARGE programs a rational structure that others can comprehend and extend Pr♦❣r❛♠♠✐♥❣ ✐♥✲t❤❡✲s♠❛❧❧ ❝♦♥❝❡r♥s t❤❡ ✇r✐t✐♥❣ ♦❢ ❝♦❞❡ t♦ ❞♦ s✐♠♣❧❡✱ ❝❧❡❛r❧② ❞❡✜♥❡❞ t❛s❦s✳ Pr♦❣r❛♠s ♣r♦✈✐❞❡ ❡①♣r❡ss✐♦♥s ❢♦r ❞❡s❝r✐❜✐♥❣ ♠❛t❤❡✲ ♠❛t✐❝❛❧ ❢♦r♠✉❧❛❡ ❛♥❞ s♦ ❢♦rt❤✳ ✭❚❤✐s ✇❛s t❤❡ ♦r✐❣✐♥❛❧ ❝♦♥tr✐❜✉t✐♦♥ ♦❢ ❋♦r✲ tr❛♥ ✱ t❤❡ ❢♦r ♠✉❧❛ tr❛♥ s❧❛t♦r✳ ❈♦♠♠❛♥❞s ❞❡s❝r✐❜❡ ❤♦✇ ❝♦♥tr♦❧ s❤♦✉❧❞ ✢♦✇ ❢r♦♠ ♦♥❡ ♣❛rt ♦❢ t❤❡ ♣r♦❣r❛♠ t♦ t❤❡ ♥❡①t✳ ❆s ✇❡ ❝♦❞❡ ❧❛②❡r ✉♣♦♥ ❧❛②❡r ✐♥ t❤❡ ✉s✉❛❧ ✇❛②✱ ✇❡ ❡✈❡♥t✉❛❧❧② ✜♥❞ ♦✉rs❡❧✈❡s ♣r♦❣r❛♠♠✐♥❣ ✐♥✲t❤❡✲❧❛r❣❡ ✿ ❥♦✐♥✐♥❣ ❧❛r❣❡ ♠♦❞✉❧❡s t♦ s♦❧✈❡ s♦♠❡ ♣♦ss✐❜❧② ✐❧❧✲ ❞❡✜♥❡❞ t❛s❦✳ ■t ❜❡❝♦♠❡s ❛ ❝❤❛❧❧❡♥❣❡ ✐❢ t❤❡ ♠♦❞✉❧❡s ✇❡r❡ ♥❡✈❡r ✐♥t❡♥❞❡❞ t♦ ✇♦r❦ t♦❣❡t❤❡r ✐♥ t❤❡ ✜rst ♣❧❛❝❡✳ Pr♦❣r❛♠♠❡rs ♥❡❡❞ ❛ ✈❛r✐❡t② ♦❢ s❦✐❧❧s✿ • t♦ ❝♦♠♠✉♥✐❝❛t❡ r❡q✉✐r❡♠❡♥ts ✱ s♦ t❤❡② s♦❧✈❡ t❤❡ r✐❣❤t ♣r♦❜❧❡♠ • t♦ ❛♥❛❧②③❡ ♣r♦❜❧❡♠s ✱ ❜r❡❛❦✐♥❣ t❤❡♠ ❞♦✇♥ ✐♥t♦ s♠❛❧❧❡r ♣❛rts • t♦ ♦r❣❛♥✐③❡ s♦❧✉t✐♦♥s s❡♥s✐❜❧②✱ s♦ t❤❛t t❤❡② ❝❛♥ ❜❡ ✉♥❞❡rst♦♦❞ ❛♥❞ ♠♦❞✐✜❡❞ • t♦ ❡st✐♠❛t❡ ❝♦sts ✱ ❦♥♦✇✐♥❣ ✐♥ ❛❞✈❛♥❝❡ ✇❤❡t❤❡r ❛ ❣✐✈❡♥ ❛♣♣r♦❛❝❤ ✐s ❢❡❛s✐❜❧❡ • t♦ ✉s❡ ♠❛t❤❡♠❛t✐❝s t♦ ❛rr✐✈❡ ❛t ❝♦rr❡❝t ❛♥❞ s✐♠♣❧❡ s♦❧✉t✐♦♥s ❲❡ s❤❛❧❧ ❧♦♦❦ ❛t ❛❧❧ t❤❡s❡ ♣♦✐♥ts ❞✉r✐♥❣ t❤❡ ❝♦✉rs❡✱ t❤♦✉❣❤ ♣r♦❣r❛♠s ✇✐❧❧ ❜❡ t♦♦ s✐♠♣❧❡ t♦ ❤❛✈❡ ♠✉❝❤ r✐s❦ ♦❢ ❣❡tt✐♥❣ t❤❡ r❡q✉✐r❡♠❡♥ts ✇r♦♥❣✳
■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✼ Abstraction in Programming • Application Programming Interfaces , or APIs (Windows, Mac) : —controlled access to operating systems facilities, etc. • Modules (ML and many post-1980 languages) : Slide 106 —controlled access to a body of code • Abstract Data Types , or ADTs (various early languages) : —controlled access to a hidden data structure • Classes and objects : (Java, C++, Smalltalk, . . . ) —intermixed data structures and code —built into elaborate hierarchies ❊❛❝❤ ♦❢ t❤❡s❡ ♠❡❝❤❛♥✐s♠s ❤❛s ❛ ❝♦♠♠♦♥ ♣✉r♣♦s❡✿ t♦ ♣r♦✈✐❞❡ s❡r✈✐❝❡s t♦ ♣r♦❣r❛♠♠❡rs ✇❤✐❧❡ ❤✐❞✐♥❣ t❤❡ ❞❡t❛✐❧s ♦❢ ❤♦✇ t❤♦s❡ s❡r✈✐❝❡s ❛r❡ ✐♠♣❧❡♠❡♥t❡❞✳ ❋♦r❝✐♥❣ ♣r♦❣r❛♠♠❡rs t♦ ✉s❡ ❛ st❛♥❞❛r❞ ✐♥t❡r❢❛❝❡ ❤❡❧♣s t♦ ❡♥s✉r❡ t❤❛t t❤❡ s②st❡♠ ✇✐❧❧ st✐❧❧ ✇♦r❦ ✐❢ t❤❡ ✐♠♣❧❡♠❡♥t❛t✐♦♥ ❝❤❛♥❣❡s✳ ❙♦❢t✇❛r❡ t❤❛t r❡❢❡rs t♦ t❤❡ ❲✐♥❞♦✇s ❆P■s ❝❛♥ ❜❡ ❡①♣❡❝t❡❞ t♦ r✉♥ ♦♥ ♠❛♥② ❞✐✛❡r❡♥t ✈❡rs✐♦♥s ♦❢ ❲✐♥❞♦✇s t❤❛t ❤❛✈❡ ♠❛❥♦r ✐♥t❡r♥❛❧ ❞✐✛❡r❡♥❝❡s✳ ❆♥ ❆P■ ♠✐❣❤t ♣r♦✈✐❞❡ r♦✉t✐♥❡s t♦ ❞❡❧❡t❡ ❛ ✜❧❡ ♦r t♦ ❞r❛✇ ❛ ♠❡♥✉✳ Pr♦❣r❛♠♠✐♥❣ ❧❛♥❣✉❛❣❡s ❤❛✈❡ ✉s❡❞ ✈❛r✐♦✉s ♠❡❝❤❛♥✐s♠s t♦ ❛❧❧♦✇ ♦♥❡ ♣❛rt ♦❢ t❤❡ ♣r♦❣r❛♠ t♦ ♣r♦✈✐❞❡ ❆P■s t♦ ♦t❤❡r ♣❛rts✳ ▼♦❞✉❧❡s ❡♥❝❛♣s✉❧❛t❡ ❛ ❜♦❞② ♦❢ ❝♦❞❡✱ ❛❧❧♦✇✐♥❣ ♦✉ts✐❞❡ ❛❝❝❡ss ♦♥❧② t❤r♦✉❣❤ ❛ ♣r♦❣r❛♠♠❡r✲❞❡✜♥❡❞ ✐♥t❡r❢❛❝❡✳ ❆❜str❛❝t ❉❛t❛ ❚②♣❡s ❛r❡ ❛ s✐♠♣❧❡r ✈❡rs✐♦♥ ♦❢ t❤✐s ❝♦♥❝❡♣t✱ ✇❤✐❝❤ ✐♠♣❧❡♠❡♥t ❛ s✐♥❣❧❡ ❝♦♥❝❡♣t s✉❝❤ ❛s ❞❛t❡s ♦r ✢♦❛t✐♥❣✲♣♦✐♥t ♥✉♠❜❡rs✳ ❖❜❥❡❝t✲♦r✐❡♥t❡❞ ♣r♦❣r❛♠♠✐♥❣ ✐s t❤❡ ❧❛t❡st ❛♥❞ ♠♦st ❝♦♠♣❧✐❝❛t❡❞ ❛♣♣r♦❛❝❤ t♦ ♠♦❞✉❧❛r✐t②✳ ❈❧❛ss❡s ❞❡✜♥❡ ❝♦♥❝❡♣ts✱ ❛♥❞ t❤❡② ❝❛♥ ❜❡ ❜✉✐❧t ✉♣♦♥ ♦t❤❡r ❝❧❛ss❡s✳ ❖♣❡r❛t✐♦♥s ❝❛♥ ❜❡ ❞❡✜♥❡❞ t❤❛t ✇♦r❦ ✐♥ ❛♣♣r♦♣r✐❛t❡❧② s♣❡❝✐❛❧✐③❡❞ ✇❛②s ♦♥ ❛ ❢❛♠✐❧② ♦❢ r❡❧❛t❡❞ ❝❧❛ss❡s✳ ❖❜❥❡❝ts ❛r❡ ✐♥st❛♥❝❡s ♦❢ ❝❧❛ss❡s ❛♥❞ ❤♦❧❞ t❤❡ ❞❛t❛ t❤❛t ✐s ❜❡✐♥❣ ♠❛♥✐♣✉❧❛t❡❞✳ ❚❤✐s ❝♦✉rs❡ ❞♦❡s ♥♦t ❝♦✈❡r ❙t❛♥❞❛r❞ ▼▲✬s s♦♣❤✐st✐❝❛t❡❞ ♠♦❞✉❧❡ s②st❡♠✱ ✇❤✐❝❤ ❝❛♥ ❞♦ ♠❛♥② ♦❢ t❤❡ s❛♠❡ t❤✐♥❣s ❛s ❝❧❛ss❡s✳ ❨♦✉ ✇✐❧❧ ❧❡❛r♥ ❛❧❧ ❛❜♦✉t ♦❜❥❡❝ts ✐♥ t❤❡ ❏❛✈❛ ❝♦✉rs❡✳
■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✽ Floating-Point, Revisited Results are ALWAYS wrong—do we know how wrong? Von Neumann doubted whether its benefits outweighed its COSTS ! Slide 107 Lessons : • Innovations are often derided as luxuries for lazy people . • Their HIDDEN COSTS can be worse than the obvious ones. • luxuries often become necessities . ❋❧♦❛t✐♥❣✲♣♦✐♥t ✐s t❤❡ ❜❛s✐s ❢♦r ♥✉♠❡r✐❝❛❧ ❝♦♠♣✉t❛t✐♦♥✿ ✐♥❞✐s♣❡♥s❛❜❧❡ ❢♦r s❝✐❡♥❝❡ ❛♥❞ ❡♥❣✐♥❡❡r✐♥❣✳ ◆♦✇ r❡❛❞ t❤✐s ❬✹✱ ♣❛❣❡ ✾✼❪ ■t ✇♦✉❧❞ t❤❡r❡❢♦r❡ s❡❡♠ t♦ ✉s ♥♦t ❛t ❛❧❧ ❝❧❡❛r ✇❤❡t❤❡r t❤❡ ♠♦❞❡st ❛❞✈❛♥t❛❣❡s ♦❢ ❛ ✢♦❛t✐♥❣ ❜✐♥❛r② ♣♦✐♥t ♦✛s❡t t❤❡ ❧♦ss ♦❢ ♠❡♠♦r② ❝❛♣❛❝✐t② ❛♥❞ t❤❡ ✐♥❝r❡❛s❡❞ ❝♦♠♣❧❡①✐t② ♦❢ t❤❡ ❛r✐t❤♠❡t✐❝ ❛♥❞ ❝♦♥tr♦❧ ❝✐r❝✉✐ts✳ ❱♦♥ ◆❡✉♠❛♥♥ ✇❛s ♦♥❡ ♦❢ t❤❡ ❣r❡❛t❡st ✜❣✉r❡s ✐♥ t❤❡ ❡❛r❧② ❞❛②s ♦❢ ❝♦♠♣✉t✐♥❣✳ ❍♦✇ ❝♦✉❧❞ ❤❡ ❣❡t ✐t s♦ ✇r♦♥❣❄ ■t ❤❛♣♣❡♥s ❛❣❛✐♥ ❛♥❞ ❛❣❛✐♥✿ • ❚✐♠❡✲s❤❛r✐♥❣ ✭s✉♣♣♦rt✐♥❣ ♠✉❧t✐♣❧❡ ✐♥t❡r❛❝t✐✈❡ s❡ss✐♦♥s✱ ❛s ♦♥ t❤♦r✮ ✇❛s ❢♦r ♣❡♦♣❧❡ t♦♦ ❧❛③② t♦ q✉❡✉❡ ✉♣ ❤♦❧❞✐♥❣ ❞❡❝❦s ♦❢ ♣✉♥❝❤❡❞ ❝❛r❞s✳ • ❆✉t♦♠❛t✐❝ st♦r❛❣❡ ♠❛♥❛❣❡♠❡♥t ✭✉s✉❛❧❧② ❝❛❧❧❡❞ ❣❛r❜❛❣❡ ❝♦❧❧❡❝t✐♦♥ ✮ ✇❛s ❢♦r ♣❡♦♣❧❡ t♦♦ ❧❛③② t♦ ❞♦ t❤❡ ❥♦❜ t❤❡♠s❡❧✈❡s✳ • ❙❝r❡❡♥ ❡❞✐t♦rs ✇❡r❡ ❢♦r ♣❡♦♣❧❡ t♦♦ ❧❛③② t♦ ✉s❡ ❧✐♥❡✲♦r✐❡♥t❡❞ ❡❞✐t♦rs✳ ❚♦ ❜❡ ❢❛✐r✱ s♦♠❡ ✐♥♥♦✈❛t✐♦♥s ❜❡❝❛♠❡ ❡st❛❜❧✐s❤❡❞ ♦♥❧② ❛❢t❡r ❤❛r❞✇❛r❡ ❛❞✈❛♥❝❡s r❡❞✉❝❡❞ t❤❡✐r ❝♦sts✳ ❋❧♦❛t✐♥❣✲♣♦✐♥t ❛r✐t❤♠❡t✐❝ ✐s ✉s❡❞✱ ❢♦r ❡①❛♠♣❧❡✱ t♦ ❞❡s✐❣♥ ❛✐r❝r❛❢t✖❜✉t ✇♦✉❧❞ ②♦✉ ✢② ✐♥ ♦♥❡❄ ❈♦❞❡ ❝❛♥ ❜❡ ❝♦rr❡❝t ❛ss✉♠✐♥❣ ❡①❛❝t ❛r✐t❤♠❡t✐❝ ❜✉t ❞❡❧✐✈❡r✱ ✉♥❞❡r ✢♦❛t✐♥❣✲♣♦✐♥t✱ ✇✐❧❞❧② ✐♥❛❝❝✉r❛t❡ r❡s✉❧ts✳ ❚❤❡ r✐s❦ ♦❢ ❡rr♦r ♦✉t✇❡✐❣❤s t❤❡ ✐♥❝r❡❛s❡❞ ❝♦♠♣❧❡①✐t② ♦❢ t❤❡ ❝✐r❝✉✐ts✿ ❛ ❤✐❞❞❡♥ ❝♦st✦ ❆s ✐t ❤❛♣♣❡♥s✱ t❤❡r❡ ❛r❡ ♠❡t❤♦❞s ❢♦r ❞❡t❡r♠✐♥✐♥❣ ❤♦✇ ❛❝❝✉r❛t❡ ♦✉r ❛♥✲ s✇❡rs ❛r❡✳ ❆ ♣r♦❢❡ss✐♦♥❛❧ ♣r♦❣r❛♠♠❡r ✇✐❧❧ ✉s❡ t❤❡♠✳
■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✾ Why Program in ML? It is interactive. It has a flexible notion of data type . Slide 108 It hides the underlying hardware: no crashes . Programs can easily be understood mathematically. It distinguishes naming something from UPDATING MEMORY . It manages storage for us. ▼▲ ✐s t❤❡ ♦✉t❝♦♠❡ ♦❢ ②❡❛rs ♦❢ r❡s❡❛r❝❤ ✐♥t♦ ♣r♦❣r❛♠♠✐♥❣ ❧❛♥❣✉❛❣❡s✳ ■t ✐s ✉♥✐q✉❡ ❛♠♦♥❣ ❧❛♥❣✉❛❣❡s t♦ ❜❡ ❞❡✜♥❡❞ ✉s✐♥❣ ❛ ♠❛t❤❡♠❛t✐❝❛❧ ❢♦r♠❛❧✐s♠ ✭❛♥ ♦♣❡r❛t✐♦♥❛❧ s❡♠❛♥t✐❝s ✮ t❤❛t ✐s ❜♦t❤ ♣r❡❝✐s❡ ❛♥❞ ❝♦♠♣r❡❤❡♥s✐❜❧❡✳ ❙❡✈❡r❛❧ ❝♦♠♠❡r❝✐❛❧❧② s✉♣♣♦rt❡❞ ❝♦♠♣✐❧❡rs ❛r❡ ❛✈❛✐❧❛❜❧❡✱ ❛♥❞ t❤❛♥❦s t♦ t❤❡ ❢♦r♠❛❧ ❞❡✜♥✐t✐♦♥✱ t❤❡r❡ ❛r❡ r❡♠❛r❦❛❜❧② ❢❡✇ ✐♥❝♦♠♣❛t✐❜✐❧✐t✐❡s ❛♠♦♥❣ t❤❡♠✳ ❇❡❝❛✉s❡ ♦❢ ✐ts ❝♦♥♥❡❝t✐♦♥ t♦ ♠❛t❤❡♠❛t✐❝s✱ ▼▲ ♣r♦❣r❛♠s ❝❛♥ ❜❡ ❞❡s✐❣♥❡❞ ❛♥❞ ✉♥❞❡rst♦♦❞ ✇✐t❤♦✉t t❤✐♥❦✐♥❣ ✐♥ ❞❡t❛✐❧ ❛❜♦✉t ❤♦✇ t❤❡ ❝♦♠♣✉t❡r ✇✐❧❧ r✉♥ t❤❡♠✳ ❆❧t❤♦✉❣❤ ❛ ♣r♦❣r❛♠ ❝❛♥ ❛❜♦rt✱ ✐t ❝❛♥♥♦t ❝r❛s❤✿ ✐t r❡♠❛✐♥s ✉♥❞❡r t❤❡ ❝♦♥tr♦❧ ♦❢ t❤❡ ▼▲ s②st❡♠✳ ■t st✐❧❧ ❛❝❤✐❡✈❡s r❡s♣❡❝t❛❜❧❡ ❡✣❝✐❡♥❝② ❛♥❞ ♣r♦✲ ✈✐❞❡s ❧♦✇❡r✲❧❡✈❡❧ ♣r✐♠✐t✐✈❡s ❢♦r t❤♦s❡ ✇❤♦ ♥❡❡❞ t❤❡♠✳ ▼♦st ♦t❤❡r ❧❛♥❣✉❛❣❡s ❛❧❧♦✇ ❞✐r❡❝t ❛❝❝❡ss t♦ t❤❡ ✉♥❞❡r❧②✐♥❣ ♠❛❝❤✐♥❡ ❛♥❞ ❡✈❡♥ tr② t♦ ❡①❡❝✉t❡ ✐❧❧❡❣❛❧ ♦♣❡r❛t✐♦♥s✱ ❝❛✉s✐♥❣ ❝r❛s❤❡s✳ ❚❤❡ ♦♥❧② ✇❛② t♦ ❧❡❛r♥ ♣r♦❣r❛♠♠✐♥❣ ✐s ❜② ✇r✐t✐♥❣ ❛♥❞ r✉♥♥✐♥❣ ♣r♦❣r❛♠s✳ ■❢ ②♦✉ ❤❛✈❡ ❛ ❝♦♠♣✉t❡r✱ ✐♥st❛❧❧ ▼▲ ♦♥ ✐t✳ ■ r❡❝♦♠♠❡♥❞ ▼♦s❝♦✇ ▼▲✱ ✶ ✇❤✐❝❤ r✉♥s ♦♥ P❈s✱ ▼❛❝✐♥t♦s❤❡s ❛♥❞ ❯♥✐① ❛♥❞ ✐s ❢❛st ❛♥❞ s♠❛❧❧✳ ■t ❝♦♠❡s ✇✐t❤ ❡①t❡♥s✐✈❡ ❧✐❜r❛r✐❡s ❛♥❞ s✉♣♣♦rts t❤❡ ❢✉❧❧ ❧❛♥❣✉❛❣❡ ❡①❝❡♣t ❢♦r s♦♠❡ ❛s♣❡❝ts ♦❢ ♠♦❞✉❧❡s✱ ✇❤✐❝❤ ❛r❡ ♥♦t ❝♦✈❡r❡❞ ✐♥ t❤✐s ❝♦✉rs❡✳ ▼♦s❝♦✇ ▼▲ ✐s ❛❧s♦ ❛✈❛✐❧❛❜❧❡ ✉♥❞❡r P❲❋✳ ❈❛♠❜r✐❞❣❡ ▼▲ ✐s ❛♥ ❛❧t❡r♥❛t✐✈❡✳ ■t ♣r♦✈✐❞❡s ❛ ❲✐♥❞♦✇s✲❜❛s❡❞ ✐♥t❡r❢❛❝❡ ✭❞✉❡ t♦ ❆rt❤✉r ◆♦r♠❛♥✮✱ ❜✉t t❤❡ ❝♦♠♣✐❧❡r ✐ts❡❧❢ ✐s t❤❡ ♦❧❞ ❊❞✐♥❜✉r❣❤ ▼▲✱ ✇❤✐❝❤ ✐s s❧♦✇ ❛♥❞ ❜✉❣❣②✳ ■t s✉♣♣♦rts ❛♥ ♦✉t✲♦❢✲❞❛t❡ ✈❡rs✐♦♥ ♦❢ ▼▲✿ ♠❛♥② ♦❢ t❤❡ ❡①❛♠♣❧❡s ✐♥ ♠② ❜♦♦❦ ❬✶✸❪ ✇✐❧❧ ♥♦t ✇♦r❦✳ ✶ ❤tt♣✿✴✴✇✇✇✳❞✐♥❛✳❦✈❧✳❞❦✴⑦s❡st♦❢t✴♠♦s♠❧✳❤t♠❧
■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✶✵ The Area of a Circle: A = πr 2 val pi = 3.14159; > val pi = 3.14159 : real pi * 1.5 * 1.5; Slide 109 > val it = 7.0685775 : real fun area (r) = pi*r*r; > val area = fn : real -> real area 2.0; > val it = 12.56636 : real ❚❤❡ ✜rst ❧✐♥❡ ♦❢ t❤✐s s✐♠♣❧❡ ▼▲ s❡ss✐♦♥ ✐s ❛ ✈❛❧✉❡ ❞❡❝❧❛r❛t✐♦♥ ✳ ■t ♠❛❦❡s t❤❡ ♥❛♠❡ ♣✐ st❛♥❞ ❢♦r t❤❡ r❡❛❧ ♥✉♠❜❡r ✸✳✶✹✶✺✾✳ ✭❙✉❝❤ ♥❛♠❡s ❛r❡ ❝❛❧❧❡❞ ✐❞❡♥✲ t✐✜❡rs ✳✮ ▼▲ ❡❝❤♦❡s t❤❡ ♥❛♠❡ ✭ ♣✐ ✮ ❛♥❞ t②♣❡ ✭ r❡❛❧ ✮ ♦❢ t❤❡ ❞❡❝❧❛r❡❞ ✐❞❡♥t✐✜❡r✳ ❚❤❡ s❡❝♦♥❞ ❧✐♥❡ ❝♦♠♣✉t❡s t❤❡ ❛r❡❛ ♦❢ t❤❡ ❝✐r❝❧❡ ✇✐t❤ r❛❞✐✉s ✶✳✺ ✉s✐♥❣ t❤❡ ❢♦r♠✉❧❛ A = πr 2 ✳ ❲❡ ✉s❡ ♣✐ ❛s ❛♥ ❛❜❜r❡✈✐❛t✐♦♥ ❢♦r ✸✳✶✹✶✺✾✳ ▼✉❧t✐♣❧✐❝❛t✐♦♥ ✐s ❡①♣r❡ss❡❞ ✉s✐♥❣ ✯ ✱ ✇❤✐❝❤ ✐s ❝❛❧❧❡❞ ❛♥ ✐♥✜① ♦♣❡r❛t♦r ❜❡❝❛✉s❡ ✐t ✐s ✇r✐tt❡♥ ❜❡t✇❡❡♥ ✐ts t✇♦ ♦♣❡r❛♥❞s✳ ▼▲ r❡♣❧✐❡s ✇✐t❤ t❤❡ ❝♦♠♣✉t❡❞ ✈❛❧✉❡ ✭❛❜♦✉t ✼✳✵✼✮ ❛♥❞ ✐ts t②♣❡ ✭❛❣❛✐♥ r❡❛❧ ✮✳ ❙tr✐❝t❧② s♣❡❛❦✐♥❣✱ ✇❡ ❤❛✈❡ ❞❡❝❧❛r❡❞ t❤❡ ✐❞❡♥t✐✜❡r ✐t ✱ ✇❤✐❝❤ ▼▲ ♣r♦✲ ✈✐❞❡s t♦ ❧❡t ✉s r❡❢❡r t♦ t❤❡ ✈❛❧✉❡ ♦❢ t❤❡ ❧❛st ❡①♣r❡ss✐♦♥ ❡♥t❡r❡❞ ❛t t♦♣ ❧❡✈❡❧✳ ❚♦ ✇♦r❦ ❛❜str❛❝t❧②✱ ✇❡ s❤♦✉❧❞ ♣r♦✈✐❞❡ t❤❡ s❡r✈✐❝❡ ✏❝♦♠♣✉t❡ t❤❡ ❛r❡❛ ♦❢ ❛ ❝✐r❝❧❡✱✑ s♦ t❤❛t ✇❡ ♥♦ ❧♦♥❣❡r ♥❡❡❞ t♦ r❡♠❡♠❜❡r t❤❡ ❢♦r♠✉❧❛✳ ❙♦✱ t❤❡ t❤✐r❞ ❧✐♥❡ ❞❡❝❧❛r❡s t❤❡ ❢✉♥❝t✐♦♥ ❛r❡❛ ✳ ●✐✈❡♥ ❛♥② r❡❛❧ ♥✉♠❜❡r r ✱ ✐t r❡t✉r♥s ❛♥♦t❤❡r r❡❛❧ ♥✉♠❜❡r✱ ❝♦♠♣✉t❡❞ ✉s✐♥❣ t❤❡ ❛r❡❛ ❢♦r♠✉❧❛❀ ♥♦t❡ t❤❛t t❤❡ ❢✉♥❝t✐♦♥ ❤❛s t②♣❡ r❡❛❧✲❃r❡❛❧ ✳ ❚❤❡ ❢♦✉rt❤ ❧✐♥❡ ❝❛❧❧s ❢✉♥❝t✐♦♥ ❛r❡❛ s✉♣♣❧②✐♥❣ ✷✳✵ ❛s t❤❡ ❛r❣✉♠❡♥t✳ ❆ ❝✐r❝❧❡ ♦❢ r❛❞✐✉s ✷ ❤❛s ❛♥ ❛r❡❛ ♦❢ ❛❜♦✉t ✶✷✳✻✳ ◆♦t❡ t❤❛t t❤❡ ❜r❛❝❦❡ts ❛r♦✉♥❞ ❛ ❢✉♥❝t✐♦♥✬s ❛r❣✉♠❡♥t ❛r❡ ♦♣t✐♦♥❛❧✱ ❜♦t❤ ✐♥ ❞❡❝❧❛r❛t✐♦♥ ❛♥❞ ✐♥ ✉s❡✳ ❚❤❡ ❢✉♥❝t✐♦♥ ✉s❡s ♣✐ t♦ st❛♥❞ ❢♦r ✸✳✶✹✶✺✾✳ ❯♥❧✐❦❡ ✇❤❛t ②♦✉ ♠❛② ❤❛✈❡ s❡❡♥ ✐♥ ♦t❤❡r ♣r♦❣r❛♠♠✐♥❣ ❧❛♥❣✉❛❣❡s✱ ♣✐ ❝❛♥♥♦t ❜❡ ✏❛ss✐❣♥❡❞ t♦✑ ♦r ♦t❤❡r✇✐s❡ ✉♣❞❛t❡❞✳ ■ts ♠❡❛♥✐♥❣ ✇✐t❤✐♥ ❛r❡❛ ✇✐❧❧ ♣❡rs✐st ❡✈❡♥ ✐❢ ✇❡ ✐ss✉❡ ❛ ♥❡✇ ✈❛❧ ❞❡❝❧❛r❛t✐♦♥ ❢♦r ♣✐ ❛❢t❡r✇❛r❞s✳
■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✶✶ Integers; Multiple Arguments & Results fun toSeconds (mins, secs) = secs + 60*mins; > val toSeconds = fn : int * int -> int fun fromSeconds s = (s div 60, s mod 60); Slide 110 > val fromSeconds = fn : int -> int * int toSeconds (5,7); > val it = 307 : int fromSeconds it; > val it = (5, 7) : int * int ●✐✈❡♥ t❤❛t t❤❡r❡ ❛r❡ ✻✵ s❡❝♦♥❞s ✐♥ ❛ ♠✐♥✉t❡✱ ❤♦✇ ♠❛♥② s❡❝♦♥❞s ❛r❡ t❤❡r❡ ✐♥ m ♠✐♥✉t❡s ❛♥❞ s s❡❝♦♥❞s❄ ❋✉♥❝t✐♦♥ t♦❙❡❝♦♥❞s ♣❡r❢♦r♠s t❤❡ tr✐✈✐❛❧ ❝❛❧❝✉❧❛t✐♦♥✳ ■t t❛❦❡s ❛ ♣❛✐r ♦❢ ❛r❣✉♠❡♥ts✱ ❡♥❝❧♦s❡❞ ✐♥ ❜r❛❝❦❡ts✳ ❲❡ ❛r❡ ♥♦✇ ✉s✐♥❣ ✐♥t❡❣❡rs✳ ❚❤❡ ✐♥t❡❣❡r s✐①t② ✐s ✇r✐tt❡♥ ✻✵ ❀ t❤❡ r❡❛❧ s✐①t② ✇♦✉❧❞ ❜❡ ✇r✐tt❡♥ ✻✵✳✵ ✳ ❚❤❡ ♠✉❧t✐♣❧✐❝❛t✐♦♥ ♦♣❡r❛t♦r✱ ✯ ✱ ✐s ✉s❡❞ ❢♦r t②♣❡ ✐♥t ❛s ✇❡❧❧ ❛s r❡❛❧ ✿ ✐t ✐s ♦✈❡r❧♦❛❞❡❞ ✳ ❚❤❡ ❛❞❞✐t✐♦♥ ♦♣❡r❛t♦r✱ ✰ ✱ ✐s ❛❧s♦ ♦✈❡r❧♦❛❞❡❞✳ ❆s ✐♥ ♠♦st ♣r♦❣r❛♠♠✐♥❣ ❧❛♥❣✉❛❣❡s✱ ♠✉❧t✐♣❧✐❝❛t✐♦♥ ✭❛♥❞ ❞✐✈✐s✐♦♥✮ ❤❛✈❡ ♣r❡❝❡❞❡♥❝❡ ♦✈❡r ❛❞❞✐t✐♦♥ ✭❛♥❞ s✉❜tr❛❝t✐♦♥✮✿ ✇❡ ♠❛② ✇r✐t❡ s❡❝s✰✻✵✯♠✐♥s ✐♥st❡❛❞ ♦❢ s❡❝s✰✭✻✵✯♠✐♥s✮ ❚❤❡ ✐♥✈❡rs❡ ♦❢ t♦❙❡❝♦♥❞s ❞❡♠♦♥str❛t❡s t❤❡ ✐♥✜① ♦♣❡r❛t♦rs ❞✐✈ ❛♥❞ ♠♦❞ ✱ ✇❤✐❝❤ ❡①♣r❡ss ✐♥t❡❣❡r ❞✐✈✐s✐♦♥ ❛♥❞ r❡♠❛✐♥❞❡r✳ ❋✉♥❝t✐♦♥ ❢r♦♠❙❡❝♦♥❞s r❡t✉r♥s ❛ ♣❛✐r ♦❢ r❡s✉❧ts✱ ❛❣❛✐♥ ❡♥❝❧♦s❡❞ ✐♥ ❜r❛❝❦❡ts✳ ❈❛r❡❢✉❧❧② ♦❜s❡r✈❡ t❤❡ t②♣❡s ♦❢ t❤❡ t✇♦ ❢✉♥❝t✐♦♥s✿ t♦❙❡❝♦♥❞s ✿ ✐♥t ✯ ✐♥t ✲❃ ✐♥t ❢r♦♠❙❡❝♦♥❞s ✿ ✐♥t ✲❃ ✐♥t ✯ ✐♥t ❚❤❡② t❡❧❧ ✉s t❤❛t t♦❙❡❝♦♥❞s ♠❛♣s ❛ ♣❛✐r ♦❢ ✐♥t❡❣❡rs t♦ ❛♥ ✐♥t❡❣❡r✱ ✇❤✐❧❡ ❢r♦♠❙❡❝♦♥❞s ♠❛♣s ❛♥ ✐♥t❡❣❡r t♦ ❛ ♣❛✐r ♦❢ ✐♥t❡❣❡rs✳ ■♥ ❛ s✐♠✐❧❛r ❢❛s❤✐♦♥✱ ❛♥ ▼▲ ❢✉♥❝t✐♦♥ ♠❛② t❛❦❡ ❛♥② ♥✉♠❜❡r ♦❢ ❛r❣✉♠❡♥ts ❛♥❞ r❡t✉r♥ ❛♥② ♥✉♠❜❡r ♦❢ r❡s✉❧ts✱ ♣♦ss✐❜❧② ♦❢ ❞✐✛❡r❡♥t t②♣❡s✳
■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✶✷ Summary of ML’s numeric types int : the integers 0 1 ~1 2 ~2 0032 . . . • constants Slide 111 + - div mod • infixes * real : the floating-point numbers 0.0 ~1.414 3.94e~7 . . . • constants + - / • infixes * Math.sqrt Math.sin Math.ln . . . • functions ❚❤❡ ✉♥❞❡r❧✐♥❡❞ s②♠❜♦❧s ✈❛❧ ❛♥❞ ❢✉♥ ❛r❡ ❦❡②✇♦r❞s ✿ t❤❡② ♠❛② ♥♦t ❜❡ ✉s❡❞ ❛s ✐❞❡♥t✐✜❡rs✳ ❍❡r❡ ✐s ❛ ❝♦♠♣❧❡t❡ ❧✐st ♦❢ ▼▲✬s ❦❡②✇♦r❞s✳ ❛❜st②♣❡ ❛♥❞ ❛♥❞❛❧s♦ ❛s ❝❛s❡ ❞❛t❛t②♣❡ ❞♦ ❡❧s❡ ❡♥❞ ❡qt②♣❡ ❡①❝❡♣t✐♦♥ ❢♥ ❢✉♥ ❢✉♥❝t♦r ❤❛♥❞❧❡ ✐❢ ✐♥ ✐♥❝❧✉❞❡ ✐♥❢✐① ✐♥❢✐①r ❧❡t ❧♦❝❛❧ ♥♦♥❢✐① ♦❢ ♦♣ ♦♣❡♥ ♦r❡❧s❡ r❛✐s❡ r❡❝ s❤❛r✐♥❣ s✐❣ s✐❣♥❛t✉r❡ str✉❝t str✉❝t✉r❡ t❤❡♥ t②♣❡ ✈❛❧ ✇❤❡r❡ ✇❤✐❧❡ ✇✐t❤ ✇✐t❤t②♣❡ ❚❤❡ ♥❡❣❛t✐♦♥ ♦❢ ① ✐s ✇r✐tt❡♥ ⑦① r❛t❤❡r t❤❛♥ ✲① ✱ ♣❧❡❛s❡ ♥♦t❡✳ ▼♦st ❧❛♥✲ ❣✉❛❣❡s ✉s❡ t❤❡ s❛♠❡ s②♠❜♦❧ ❢♦r ♠✐♥✉s ❛♥❞ s✉❜tr❛❝t✐♦♥✱ ❜✉t ▼▲ r❡❣❛r❞s ❛❧❧ ♦♣❡r❛t♦rs✱ ✇❤❡t❤❡r ✐♥✜① ♦r ♥♦t✱ ❛s ❢✉♥❝t✐♦♥s✳ ❙✉❜tr❛❝t✐♦♥ t❛❦❡s ❛ ♣❛✐r ♦❢ ♥✉♠❜❡rs✱ ❜✉t ♠✐♥✉s t❛❦❡s ❛ s✐♥❣❧❡ ♥✉♠❜❡r❀ t❤❡② ❛r❡ ❞✐st✐♥❝t ❢✉♥❝t✐♦♥s ❛♥❞ ♠✉st ❤❛✈❡ ❞✐st✐♥❝t ♥❛♠❡s✳ ❙✐♠✐❧❛r❧②✱ ✇❡ ♠❛② ♥♦t ✇r✐t❡ ✰① ✳ ❈♦♠♣✉t❡r ♥✉♠❜❡rs ❤❛✈❡ ❛ ✜♥✐t❡ r❛♥❣❡✱ ✇❤✐❝❤ ✐❢ ❡①❝❡❡❞❡❞ ❣✐✈❡s r✐s❡ t♦ ❛♥ ❖✈❡r✢♦✇ ❡rr♦r✳ ❙♦♠❡ ▼▲ s②st❡♠s ❝❛♥ r❡♣r❡s❡♥t ✐♥t❡❣❡rs ♦❢ ❛r❜✐tr❛r② s✐③❡✳ ■❢ ✐♥t❡❣❡rs ❛♥❞ r❡❛❧s ♠✉st ❜❡ ❝♦♠❜✐♥❡❞ ✐♥ ❛ ❝❛❧❝✉❧❛t✐♦♥✱ ▼▲ ♣r♦✈✐❞❡s ❢✉♥❝t✐♦♥s t♦ ❝♦♥✈❡rt ❜❡t✇❡❡♥ t❤❡♠✿ r❡❛❧ ✿ ✐♥t ✲❃ r❡❛❧ ❝♦♥✈❡rt ❛♥ ✐♥t❡❣❡r t♦ t❤❡ ❝♦rr❡s♣♦♥❞✐♥❣ r❡❛❧ ❢❧♦♦r ✿ r❡❛❧ ✲❃ ✐♥t ❝♦♥✈❡rt ❛ r❡❛❧ t♦ t❤❡ ❣r❡❛t❡st ✐♥t❡❣❡r ♥♦t ❡①❝❡❡❞✐♥❣ ✐t ▼▲✬s ❧✐❜r❛r✐❡s ❛r❡ ♦r❣❛♥✐③❡❞ ✉s✐♥❣ ♠♦❞✉❧❡s✱ s♦ ✇❡ ✉s❡ ❝♦♠♣♦✉♥❞ ✐❞❡♥t✐✲ ✜❡rs s✉❝❤ ❛s ▼❛t❤✳sqrt t♦ r❡❢❡r t♦ ❧✐❜r❛r② ❢✉♥❝t✐♦♥s✳ ■♥ ▼♦s❝♦✇ ▼▲✱ ❧✐❜r❛r② ✉♥✐ts ❛r❡ ❧♦❛❞❡❞ ❜② ❝♦♠♠❛♥❞s s✉❝❤ ❛s ❧♦❛❞✧▼❛t❤✧❀ ✳ ❚❤❡r❡ ❛r❡ t❤♦✉s❛♥❞s ♦❢ ❧✐❜r❛r② ❢✉♥❝t✐♦♥s✱ ✐♥❝❧✉❞✐♥❣ t❡①t✲♣r♦❝❡ss✐♥❣ ❛♥❞ ♦♣❡r❛t✐♥❣ s②st❡♠s ❢✉♥❝t✐♦♥s ✐♥ ❛❞❞✐t✐♦♥ t♦ t❤❡ ✉s✉❛❧ ♥✉♠❡r✐❝❛❧ ♦♥❡s✳
■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✶✸ ❋♦r ♠♦r❡ ❞❡t❛✐❧s ♦♥ ▼▲✬s s②♥t❛①✱ ♣❧❡❛s❡ ❝♦♥s✉❧t ❛ t❡①t❜♦♦❦✳ ▼✐♥❡ ❬✶✸❪ ❛♥❞ ❲✐❦strö♠✬s ❬✶✻❪ ♠❛② ❜❡ ❢♦✉♥❞ ✐♥ ♠❛♥② ❈♦❧❧❡❣❡ ❧✐❜r❛r✐❡s✳ ❯❧❧♠❛♥ ❬✶✺❪✱ ✐♥ t❤❡ ❈♦♠♣✉t❡r ▲❛❜ ❧✐❜r❛r②✱ ✐s ❛❧s♦ ✇♦rt❤ ❛ ❧♦♦❦✳ ❘❡❧❛t❡❞ ♠❛t❡r✐❛❧ ✐s ✐♥ ▼▲ ❢♦r t❤❡ ❲♦r❦✐♥❣ Pr♦❣r❛♠♠❡r ✱ ▲❡❛r♥✐♥❣ ❣✉✐❞❡✳ ♣❛❣❡s ✶✕✹✼✱ ❛♥❞ ❡s♣❡❝✐❛❧❧② ✶✼✕✸✷✳ ❖♥❡ s♦❧✉t✐♦♥ t♦ t❤❡ ②❡❛r ✷✵✵✵ ❜✉❣ ✐♥✈♦❧✈❡s st♦r✐♥❣ ②❡❛rs ❛s ❊①❡r❝✐s❡ ✶✳✶ t✇♦ ❞✐❣✐ts✱ ❜✉t ✐♥t❡r♣r❡t✐♥❣ t❤❡♠ s✉❝❤ t❤❛t ✺✵ ♠❡❛♥s ✶✾✺✵ ❛♥❞ ✹✾ ♠❡❛♥s ✷✵✹✾✳ ❈♦♠♠❡♥t ♦♥ t❤❡ ♠❡r✐ts ❛♥❞ ❞❡♠❡r✐ts ♦❢ t❤✐s ❛♣♣r♦❛❝❤✳ ❯s✐♥❣ t❤❡ ❞❛t❡ r❡♣r❡s❡♥t❛t✐♦♥ ♦❢ t❤❡ ♣r❡✈✐♦✉s ❡①❡r❝✐s❡✱ ❝♦❞❡ ❊①❡r❝✐s❡ ✶✳✷ ▼▲ ❢✉♥❝t✐♦♥s t♦ ✭❛✮ ❝♦♠♣❛r❡ t✇♦ ②❡❛rs ✭❜✮ ❛❞❞✴s✉❜tr❛❝t s♦♠❡ ❣✐✈❡♥ ♥✉♠❜❡r ♦❢ ②❡❛rs ❢r♦♠ ❛♥♦t❤❡r ②❡❛r✳ ✭❨♦✉ ♠❛② ♥❡❡❞ t♦ ❧♦♦❦ ❛❤❡❛❞ t♦ t❤❡ ♥❡①t ❧❡❝t✉r❡ ❢♦r ▼▲✬s ❝♦♠♣❛r✐s♦♥ ♦♣❡r❛t♦rs✳✮
■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✶✹ Raising a Number to a Power fun npower(x,n) : real = if n=0 then 1.0 Slide 201 else x * npower(x, n-1); > val npower = fn : real * int -> real Mathematical Justification (for x � = 0 ): x 0 = 1 x n +1 = x × x n . ❚❤❡ ❢✉♥❝t✐♦♥ ♥♣♦✇❡r r❛✐s❡s ✐ts r❡❛❧ ❛r❣✉♠❡♥t ① t♦ t❤❡ ♣♦✇❡r ♥ ✱ ❛ ♥♦♥✲ ♥❡❣❛t✐✈❡ ✐♥t❡❣❡r✳ ❚❤❡ ❢✉♥❝t✐♦♥ ✐s r❡❝✉rs✐✈❡ ✿ ✐t ❝❛❧❧s ✐ts❡❧❢✳ ❚❤✐s ❝♦♥❝❡♣t s❤♦✉❧❞ ❜❡ ❢❛♠✐❧✐❛r ❢r♦♠ ♠❛t❤❡♠❛t✐❝s✱ s✐♥❝❡ ❡①♣♦♥❡♥t✐❛t✐♦♥ ✐s ❞❡✜♥❡❞ ❜② t❤❡ r✉❧❡s s❤♦✇♥ ❛❜♦✈❡✳ ❚❤❡ ▼▲ ♣r♦❣r❛♠♠❡r ✉s❡s r❡❝✉rs✐♦♥ ❤❡❛✈✐❧②✳ ❋♦r n ≥ 0 ✱ t❤❡ ❡q✉❛t✐♦♥ x n +1 = x × x n ②✐❡❧❞s ❛♥ ♦❜✈✐♦✉s ❝♦♠♣✉t❛t✐♦♥✿ x 3 = x × x 2 = x × x × x 1 = x × x × x × x 0 = x × x × x. ❚❤❡ ❡q✉❛t✐♦♥ ❝❧❡❛r❧② ❤♦❧❞s ❡✈❡♥ ❢♦r ♥❡❣❛t✐✈❡ n ✳ ❍♦✇❡✈❡r✱ t❤❡ ❝♦rr❡s♣♦♥❞✐♥❣ ❝♦♠♣✉t❛t✐♦♥ r✉♥s ❢♦r❡✈❡r✿ x − 1 = x × x − 2 = x × x × x − 3 = · · · ◆♦✇ ❢♦r ❛ t✐r❡s♦♠❡ ❜✉t ♥❡❝❡ss❛r② ❛s✐❞❡✳ ■♥ ♠♦st ❧❛♥❣✉❛❣❡s✱ t❤❡ t②♣❡s ♦❢ ❛r❣✉♠❡♥ts ❛♥❞ r❡s✉❧ts ♠✉st ❛❧✇❛②s ❜❡ s♣❡❝✐✜❡❞✳ ▼▲ ✐s ✉♥✉s✉❛❧ ✐♥ ♣r♦✈✐❞✐♥❣ t②♣❡ ✐♥❢❡r❡♥❝❡ ✿ ✐t ♥♦r♠❛❧❧② ✇♦r❦s ♦✉t t❤❡ t②♣❡s ❢♦r ✐ts❡❧❢✳ ❍♦✇❡✈❡r✱ s♦♠❡t✐♠❡s ▼▲ ♥❡❡❞s ❛ ❤✐♥t❀ ❢✉♥❝t✐♦♥ ♥♣♦✇❡r ❤❛s ❛ t②♣❡ ❝♦♥str❛✐♥t t♦ s❛② ✐ts r❡s✉❧t ✐s r❡❛❧ ✳ ❙✉❝❤ ❝♦♥str❛✐♥ts ❛r❡ r❡q✉✐r❡❞ ✇❤❡♥ ♦✈❡r❧♦❛❞✐♥❣ ✇♦✉❧❞ ♦t❤❡r✇✐s❡ ♠❛❦❡ ❛ ❢✉♥❝t✐♦♥✬s t②♣❡ ❛♠❜✐❣✉♦✉s✳ ▼▲ ❝❤♦♦s❡s t②♣❡ ✐♥t ❜② ❞❡❢❛✉❧t ♦r✱ ✐♥ ❡❛r❧✐❡r ✈❡rs✐♦♥s✱ ♣r✐♥ts ❛♥ ❡rr♦r ♠❡ss❛❣❡✳ ❉❡s♣✐t❡ t❤❡ ❜❡st ❡✛♦rts ♦❢ ❧❛♥❣✉❛❣❡ ❞❡s✐❣♥❡rs✱ ❛❧❧ ♣r♦❣r❛♠♠✐♥❣ ❧❛♥❣✉❛❣❡s ❤❛✈❡ tr♦✉❜❧❡ ♣♦✐♥ts s✉❝❤ ❛s t❤❡s❡✳ ❚②♣✐❝❛❧❧②✱ t❤❡② ❛r❡ ❝♦♠♣r♦♠✐s❡s ❝❛✉s❡❞ ❜② tr②✐♥❣ t♦ ❣❡t t❤❡ ❜❡st ♦❢ ❜♦t❤ ✇♦r❧❞s✱ ❤❡r❡ t②♣❡ ✐♥❢❡r❡♥❝❡ ❛♥❞ ♦✈❡r❧♦❛❞✐♥❣✳
■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✶✺ An Aside: Overloading Functions defined for both int and real : ~ + - * • operators Slide 202 < <= > >= • relations The type checker requires help! — a type constraint fun square (x) = x * x; A MBIGUOUS fun square (x:real) = x * x; Clear ◆❡❛r❧② ❛❧❧ ♣r♦❣r❛♠♠✐♥❣ ❧❛♥❣✉❛❣❡s ♦✈❡r❧♦❛❞ t❤❡ ❛r✐t❤♠❡t✐❝ ♦♣❡r❛t♦rs✳ ❲❡ ❞♦♥✬t ✇❛♥t t♦ ❤❛✈❡ ❞✐✛❡r❡♥t ♦♣❡r❛t♦rs ❢♦r ❡❛❝❤ t②♣❡ ♦❢ ♥✉♠❜❡r✦ ❙♦♠❡ ❧❛♥✲ ❣✉❛❣❡s ❤❛✈❡ ❥✉st ♦♥❡ t②♣❡ ♦❢ ♥✉♠❜❡r✱ ❝♦♥✈❡rt✐♥❣ ❛✉t♦♠❛t✐❝❛❧❧② ❜❡t✇❡❡♥ ❞✐❢✲ ❢❡r❡♥t ❢♦r♠❛ts❀ t❤✐s ✐s s❧♦✇ ❛♥❞ ❝♦✉❧❞ ❧❡❛❞ t♦ ✉♥❡①♣❡❝t❡❞ r♦✉♥❞✐♥❣ ❡rr♦rs✳ ❚②♣❡ ❝♦♥str❛✐♥ts ❛r❡ ❛❧❧♦✇❡❞ ❛❧♠♦st ❛♥②✇❤❡r❡✳ ❲❡ ❝❛♥ ♣✉t ♦♥❡ ♦♥ ❛♥② ♦❝❝✉rr❡♥❝❡ ♦❢ ① ✐♥ t❤❡ ❢✉♥❝t✐♦♥✳ ❲❡ ❝❛♥ ❝♦♥str❛✐♥ t❤❡ ❢✉♥❝t✐♦♥✬s r❡s✉❧t✿ ❢✉♥ sq✉❛r❡ ① ❂ ① ✯ ① ✿ r❡❛❧❀ ❢✉♥ sq✉❛r❡ ① ✿ r❡❛❧ ❂ ① ✯ ①❀ ▼▲ tr❡❛ts t❤❡ ❡q✉❛❧✐t② t❡st s♣❡❝✐❛❧❧②✳ ❊①♣r❡ss✐♦♥s ❧✐❦❡ ✐❢ ①❂② t❤❡♥ ✳✳✳ ❛r❡ ✜♥❡ ♣r♦✈✐❞❡❞ x ❛♥❞ y ❤❛✈❡ t❤❡ s❛♠❡ t②♣❡ ❛♥❞ ❡q✉❛❧✐t② t❡st✐♥❣ ✐s ♣♦ss✐❜❧❡ ❢♦r t❤❛t t②♣❡✳ ✶ ◆♦t❡ t❤❛t ① ❁❃ ② ✐s ▼▲ ❢♦r x � = y ✳ ✶ ❆❧❧ t❤❡ t②♣❡s t❤❛t ✇❡ s❤❛❧❧ s❡❡ ❢♦r s♦♠❡ t✐♠❡ ❛❞♠✐t ❡q✉❛❧✐t② t❡st✐♥❣✳ ▼♦s❝♦✇ ▼▲ ❛❧❧♦✇s ❡✈❡♥ ❡q✉❛❧✐t② t❡st✐♥❣ ♦❢ r❡❛❧s✱ ✇❤✐❝❤ ✐s ❢♦r❜✐❞❞❡♥ ✐♥ t❤❡ ❧❛t❡st ✈❡rs✐♦♥ ♦❢ t❤❡ ▼▲ ❧✐❜r❛r②✳ ❙♦♠❡ ❝♦♠♣✐❧❡rs ♠❛② ✐♥s✐st t❤❛t ②♦✉ ✇r✐t❡ ❘❡❛❧✳❂❂✭①✱②✮ ✳
■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✶✻ Conditional Expressions and Type bool if b then x else y not ( b ) negation of b Slide 203 p andalso q if p then q else false ≡ p orelse q ≡ if p then true else q A Boolean-valued function! fun even n = (n mod 2 = 0); > val even = fn : int -> bool ❆ ❝❤❛r❛❝t❡r✐st✐❝ ❢❡❛t✉r❡ ♦❢ t❤❡ ❝♦♠♣✉t❡r ✐s ✐ts ❛❜✐❧✐t② t♦ t❡st ❢♦r ❝♦♥❞✐✲ t✐♦♥s ❛♥❞ ❛❝t ❛❝❝♦r❞✐♥❣❧②✳ ■♥ t❤❡ ❡❛r❧② ❞❛②s✱ ❛ ♣r♦❣r❛♠ ♠✐❣❤t ❥✉♠♣ t♦ ❛ ❣✐✈❡♥ ❛❞❞r❡ss ❞❡♣❡♥❞✐♥❣ ♦♥ t❤❡ s✐❣♥ ♦❢ s♦♠❡ ♥✉♠❜❡r✳ ▲❛t❡r✱ ❏♦❤♥ ▼❝❈❛rt❤② ❞❡✜♥❡❞ t❤❡ ❝♦♥❞✐t✐♦♥❛❧ ❡①♣r❡ss✐♦♥ t♦ s❛t✐s❢② ( ✐❢ tr✉❡ t❤❡♥ x ❡❧s❡ y ) = x ( ✐❢ ❢❛❧s❡ t❤❡♥ x ❡❧s❡ y ) = y ▼▲ ❡✈❛❧✉❛t❡s t❤❡ ❡①♣r❡ss✐♦♥ ✐❢ B t❤❡♥ E 1 ❡❧s❡ E 2 ❜② ✜rst ❡✈❛❧✉❛t✐♥❣ B ✳ ■❢ t❤❡ r❡s✉❧t ✐s tr✉❡ t❤❡♥ ▼▲ ❡✈❛❧✉❛t❡s E 1 ❛♥❞ ♦t❤❡r✇✐s❡ E 2 ✳ ❖♥❧② ♦♥❡ ♦❢ t❤❡ t✇♦ ❡①♣r❡ss✐♦♥s E 1 ❛♥❞ E 2 ✐s ❡✈❛❧✉❛t❡❞✦ ■❢ ❜♦t❤ ✇❡r❡ ❡✈❛❧✉❛t❡❞✱ t❤❡♥ r❡❝✉rs✐✈❡ ❢✉♥❝t✐♦♥s ❧✐❦❡ ♥♣♦✇❡r ❛❜♦✈❡ ✇♦✉❧❞ r✉♥ ❢♦r❡✈❡r✳ ❚❤❡ ✐❢ ✲❡①♣r❡ss✐♦♥ ✐s ❣♦✈❡r♥❡❞ ❜② ❛♥ ❡①♣r❡ss✐♦♥ ♦❢ t②♣❡ ❜♦♦❧ ✱ ✇❤♦s❡ t✇♦ ✈❛❧✉❡s ❛r❡ tr✉❡ ❛♥❞ ❢❛❧s❡ ✳ ■♥ ♠♦❞❡r♥ ♣r♦❣r❛♠♠✐♥❣ ❧❛♥❣✉❛❣❡s✱ t❡sts ❛r❡ ♥♦t ❜✉✐❧t ✐♥t♦ ✏❝♦♥❞✐t✐♦♥❛❧ ❜r❛♥❝❤✑ ❝♦♥str✉❝ts ❜✉t ❤❛✈❡ ❛♥ ✐♥❞❡♣❡♥❞❡♥t st❛t✉s✳ ❚❡sts✱ ♦r ❇♦♦❧❡❛♥ ❡①♣r❡ss✐♦♥s ✱ ❝❛♥ ❜❡ ❡①♣r❡ss❡❞ ✉s✐♥❣ r❡❧❛t✐♦♥❛❧ ♦♣❡r❛✲ t♦rs s✉❝❤ ❛s < ❛♥❞ = ✳ ❚❤❡② ❝❛♥ ❜❡ ❝♦♠❜✐♥❡❞ ✉s✐♥❣ t❤❡ ❇♦♦❧❡❛♥ ♦♣❡r❛t♦rs ❢♦r ♥❡❣❛t✐♦♥ ✭ ♥♦t ✮✱ ❝♦♥❥✉♥❝t✐♦♥ ✭ ❛♥❞❛❧s♦ ✮ ❛♥❞ ❞✐s❥✉♥❝t✐♦♥ ✭ ♦r❡❧s❡ ✮✳ ◆❡✇ ♣r♦♣❡rt✐❡s ❝❛♥ ❜❡ ❞❡❝❧❛r❡❞ ❛s ❢✉♥❝t✐♦♥s✱ ❡✳❣✳ t♦ t❡st ✇❤❡t❤❡r ❛♥ ✐♥t❡❣❡r ✐s ❡✈❡♥✳ ◆♦t❡✳ ❚❤❡ ❛♥❞❛❧s♦ ❛♥❞ ♦r❡❧s❡ ♦♣❡r❛t♦rs ❡✈❛❧✉❛t❡ t❤❡✐r s❡❝♦♥❞ ♦♣❡r❛♥❞ ♦♥❧② ✐❢ ♥❡❝❡ss❛r②✳ ❚❤❡② ❝❛♥♥♦t ❜❡ ❞❡✜♥❡❞ ❛s ❢✉♥❝t✐♦♥s✿ ▼▲ ❢✉♥❝t✐♦♥s ❡✈❛❧✉✲ ❛t❡ ❛❧❧ t❤❡✐r ❛r❣✉♠❡♥ts✳ ✭■♥ ▼▲✱ ❛♥② t✇♦✲❛r❣✉♠❡♥t ❢✉♥❝t✐♦♥ ❝❛♥ ❜❡ t✉r♥❡❞ ✐♥t♦ ❛♥ ✐♥✜① ♦♣❡r❛t♦r✳✮
■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✶✼ Raising a Number to a Power, Revisited fun power(x,n) : real = if n=1 then x else if even n then power(x*x, n div 2) else x * power(x*x, n div 2) Slide 204 Mathematical Justification : x 1 = x x 2 n = ( x 2 ) n x 2 n +1 = x × ( x 2 ) n . ❋♦r ❧❛r❣❡ n ✱ ❝♦♠♣✉t✐♥❣ ♣♦✇❡rs ✉s✐♥❣ x n +1 = x × x n ✐s t♦♦ s❧♦✇ t♦ ❜❡ ♣r❛❝t✐❝❛❧✳ ❚❤❡ ❡q✉❛t✐♦♥s ❛❜♦✈❡ ❛r❡ ♠✉❝❤ ❢❛st❡r✿ 2 12 = 4 6 = 16 3 = 16 × 256 1 = 16 × 256 = 4096 . ■♥st❡❛❞ ♦❢ n ♠✉❧t✐♣❧✐❝❛t✐♦♥s✱ ✇❡ ♥❡❡❞ ❛t ♠♦st 2 lg n ♠✉❧t✐♣❧✐❝❛t✐♦♥s✱ ✇❤❡r❡ lg n ✐s t❤❡ ❧♦❣❛r✐t❤♠ ♦❢ n t♦ t❤❡ ❜❛s❡ ✷✳ ❲❡ ✉s❡ t❤❡ ❢✉♥❝t✐♦♥ ❡✈❡♥ ✱ ❞❡❝❧❛r❡❞ ♣r❡✈✐♦✉s❧②✱ t♦ t❡st ✇❤❡t❤❡r t❤❡ ❡①♣♦✲ ♥❡♥t ✐s ❡✈❡♥✳ ■♥t❡❣❡r ❞✐✈✐s✐♦♥ ✭ ❞✐✈ ✮ tr✉♥❝❛t❡s ✐ts r❡s✉❧t t♦ ❛♥ ✐♥t❡❣❡r✿ ❞✐✈✐❞✐♥❣ 2 n + 1 ❜② ✷ ②✐❡❧❞s n ✳ ❆ r❡❝✉rr❡♥❝❡ ✐s ❛ ✉s❡❢✉❧ ❝♦♠♣✉t❛t✐♦♥ r✉❧❡ ♦♥❧② ✐❢ ✐t ✐s ❜♦✉♥❞ t♦ t❡r♠✐♥❛t❡✳ ■❢ n > 0 t❤❡♥ n ✐s s♠❛❧❧❡r t❤❛♥ ❜♦t❤ 2 n ❛♥❞ 2 n + 1 ✳ ❆❢t❡r ❡♥♦✉❣❤ r❡❝✉rs✐✈❡ ❝❛❧❧s✱ t❤❡ ❡①♣♦♥❡♥t ✇✐❧❧ ❜❡ r❡❞✉❝❡❞ t♦ ✶✳ ❚❤❡ ❡q✉❛t✐♦♥s ❛❧s♦ ❤♦❧❞ ✐❢ n ≤ 0 ✱ ❜✉t t❤❡ ❝♦rr❡s♣♦♥❞✐♥❣ ❝♦♠♣✉t❛t✐♦♥ r✉♥s ❢♦r❡✈❡r✳ ❖✉r r❡❛s♦♥✐♥❣ ❛ss✉♠❡s ❛r✐t❤♠❡t✐❝ t♦ ❜❡ ❡①❛❝t ❀ ❢♦rt✉♥❛t❡❧②✱ t❤❡ ❝❛❧❝✉❧❛t✐♦♥ ✐s ✇❡❧❧✲❜❡❤❛✈❡❞ ✉s✐♥❣ ✢♦❛t✐♥❣✲♣♦✐♥t✳
■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✶✽ Expression Evaluation E 0 ⇒ E 1 ⇒ · · · ⇒ E n ⇒ v Sample evaluation for power : Slide 205 power (2 , 12) ⇒ power (4 , 6) ⇒ power (16 , 3) ⇒ 16 × power (256 , 1) ⇒ 16 × 256 ⇒ 4096 . ❙t❛rt✐♥❣ ✇✐t❤ E 0 ✱ t❤❡ ❡①♣r❡ss✐♦♥ E i ✐s r❡❞✉❝❡❞ t♦ E i +1 ✉♥t✐❧ t❤✐s ♣r♦❝❡ss ❝♦♥❝❧✉❞❡s ✇✐t❤ ❛ ✈❛❧✉❡ v ✳ ❆ ✈❛❧✉❡ ✐s s♦♠❡t❤✐♥❣ ❧✐❦❡ ❛ ♥✉♠❜❡r t❤❛t ❝❛♥♥♦t ❜❡ ❢✉rt❤❡r r❡❞✉❝❡❞✳ ❲❡ ✇r✐t❡ E ⇒ E ′ t♦ s❛② t❤❛t E ✐s r❡❞✉❝❡❞ t♦ E ′ ✳ ▼❛t❤❡♠❛t✐❝❛❧❧②✱ t❤❡② ❛r❡ ❡q✉❛❧✿ E = E ′ ✱ ❜✉t t❤❡ ❝♦♠♣✉t❛t✐♦♥ ❣♦❡s ❢r♦♠ E t♦ E ′ ❛♥❞ ♥❡✈❡r t❤❡ ♦t❤❡r ✇❛② ❛r♦✉♥❞✳ ❊✈❛❧✉❛t✐♦♥ ❝♦♥❝❡r♥s ♦♥❧② ❡①♣r❡ss✐♦♥s ❛♥❞ t❤❡ ✈❛❧✉❡s t❤❡② r❡t✉r♥✳ ❚❤✐s ✈✐❡✇ ♦❢ ❝♦♠♣✉t❛t✐♦♥ ♠❛② s❡❡♠ t♦ ❜❡ t♦♦ ♥❛rr♦✇✳ ■t ✐s ❝❡rt❛✐♥❧② ❢❛r r❡♠♦✈❡❞ ❢r♦♠ ❝♦♠♣✉t❡r ❤❛r❞✇❛r❡✱ ❜✉t t❤❛t ❝❛♥ ❜❡ s❡❡♥ ❛s ❛♥ ❛❞✈❛♥t❛❣❡✳ ❋♦r t❤❡ tr❛❞✐t✐♦♥❛❧ ❝♦♥❝❡♣t ♦❢ ❝♦♠♣✉t✐♥❣ s♦❧✉t✐♦♥s t♦ ♣r♦❜❧❡♠s✱ ❡①♣r❡ss✐♦♥ ❡✈❛❧✉❛t✐♦♥ ✐s ❡♥t✐r❡❧② ❛❞❡q✉❛t❡✳ ❈♦♠♣✉t❡rs ❛❧s♦ ✐♥t❡r❛❝t ✇✐t❤ t❤❡ ♦✉ts✐❞❡ ✇♦r❧❞✳ ❋♦r ❛ st❛rt✱ t❤❡② ♥❡❡❞ s♦♠❡ ♠❡❛♥s ♦❢ ❛❝❝❡♣t✐♥❣ ♣r♦❜❧❡♠s ❛♥❞ ❞❡❧✐✈❡r✐♥❣ s♦❧✉t✐♦♥s✳ ▼❛♥② ❝♦♠♣✉t❡r s②st❡♠s ♠♦♥✐t♦r ❛♥❞ ❝♦♥tr♦❧ ✐♥❞✉str✐❛❧ ♣r♦❝❡ss❡s✳ ❚❤✐s r♦❧❡ ♦❢ ❝♦♠♣✉t❡rs ✐s ❢❛♠✐❧✐❛r ♥♦✇✱ ❜✉t ✇❛s ♥❡✈❡r ❡♥✈✐s❛❣❡❞ ❛t ✜rst✳ ▼♦❞❡❧❧✐♥❣ ✐t r❡q✉✐r❡s ❛ ♥♦t✐♦♥ ♦❢ st❛t❡s t❤❛t ❝❛♥ ❜❡ ♦❜s❡r✈❡❞ ❛♥❞ ❝❤❛♥❣❡❞✳ ❚❤❡♥ ✇❡ ❝❛♥ ❝♦♥s✐❞❡r ✉♣❞❛t✐♥❣ t❤❡ st❛t❡ ❜② ❛ss✐❣♥✐♥❣ t♦ ✈❛r✐❛❜❧❡s ♦r ♣❡r❢♦r♠✐♥❣ ✐♥♣✉t✴♦✉t♣✉t✱ ✜♥❛❧❧② ❛rr✐✈✐♥❣ ❛t ❝♦♥✈❡♥t✐♦♥❛❧ ♣r♦❣r❛♠s ✭❢❛♠✐❧✐❛r t♦ t❤♦s❡ ♦❢ ②♦✉ ✇❤♦ ❦♥♦✇ ❈✱ ❢♦r ✐♥st❛♥❝❡✮ t❤❛t ❝♦♥s✐st ♦❢ ❝♦♠♠❛♥❞s✳ ❋♦r ♥♦✇✱ ✇❡ r❡♠❛✐♥ ❛t t❤❡ ❧❡✈❡❧ ♦❢ ❡①♣r❡ss✐♦♥s✱ ✇❤✐❝❤ ✐s ✉s✉❛❧❧② t❡r♠❡❞ ❢✉♥❝t✐♦♥❛❧ ♣r♦❣r❛♠♠✐♥❣ ✳
■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✶✾ Example: Summing the First n Integers fun nsum n = if n=0 then 0 else n + nsum (n-1); Slide 206 > val nsum = fn: int -> int nsum 3 ⇒ 3 + nsum 2 ⇒ 3 + (2 + nsum 1) ⇒ 3 + (2 + (1 + nsum 0)) ⇒ 3 + (2 + (1 + 0)) ⇒ . . . ⇒ 6 ❚❤❡ ❢✉♥❝t✐♦♥ ❝❛❧❧ nsum n ❝♦♠♣✉t❡s t❤❡ s✉♠ 1 + · · · + n r❛t❤❡r ♥❛ï✈❡❧②✱ ❤❡♥❝❡ t❤❡ ✐♥✐t✐❛❧ ♥ ✐♥ ✐ts ♥❛♠❡✳ ❚❤❡ ♥❡st✐♥❣ ♦❢ ♣❛r❡♥t❤❡s❡s ✐s ♥♦t ❥✉st ❛♥ ❛rt✐❢❛❝t ♦❢ ♦✉r ♥♦t❛t✐♦♥❀ ✐t ✐♥❞✐❝❛t❡s ❛ r❡❛❧ ♣r♦❜❧❡♠✳ ❚❤❡ ❢✉♥❝t✐♦♥ ❣❛t❤❡rs ✉♣ ❛ ❝♦❧❧❡❝t✐♦♥ ♦❢ ♥✉♠❜❡rs✱ ❜✉t ♥♦♥❡ ♦❢ t❤❡ ❛❞❞✐t✐♦♥s ❝❛♥ ❜❡ ♣❡r❢♦r♠❡❞ ✉♥t✐❧ nsum 0 ✐s r❡❛❝❤❡❞✳ ▼❡❛♥✇❤✐❧❡✱ t❤❡ ❝♦♠♣✉t❡r ♠✉st st♦r❡ t❤❡ ♥✉♠❜❡rs ✐♥ ❛♥ ✐♥t❡r♥❛❧ ❞❛t❛ str✉❝t✉r❡✱ t②♣✐❝❛❧❧② t❤❡ st❛❝❦ ✳ ❋♦r ❧❛r❣❡ n ✱ s❛② nsum 10000 ✱ t❤❡ ❝♦♠♣✉t❛t✐♦♥ ♠✐❣❤t ❢❛✐❧ ❞✉❡ t♦ st❛❝❦ ♦✈❡r✢♦✇✳ ❲❡ ❛❧❧ ❦♥♦✇ t❤❛t t❤❡ ❛❞❞✐t✐♦♥s ❝❛♥ ❜❡ ♣❡r❢♦r♠❡❞ ❛s ✇❡ ❣♦ ❛❧♦♥❣✳ ❍♦✇ ❞♦ ✇❡ ♠❛❦❡ t❤❡ ❝♦♠♣✉t❡r ❞♦ t❤❛t❄
■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✷✵ Iteratively Summing the First n Integers fun summing (n,total) = if n=0 then total else summing (n-1, n + total); Slide 207 > val summing = fn : int * int -> int summing (3 , 0) ⇒ summing (2 , 3) ⇒ summing (1 , 5) ⇒ summing (0 , 6) ⇒ 6 ❋✉♥❝t✐♦♥ s✉♠♠✐♥❣ t❛❦❡s ❛♥ ❛❞❞✐t✐♦♥❛❧ ❛r❣✉♠❡♥t✿ ❛ r✉♥♥✐♥❣ t♦t❛❧✳ ■❢ n ✐s ③❡r♦ t❤❡♥ ✐t r❡t✉r♥s t❤❡ r✉♥♥✐♥❣ t♦t❛❧❀ ♦t❤❡r✇✐s❡✱ s✉♠♠✐♥❣ ❛❞❞s t♦ ✐t ❛♥❞ ❝♦♥t✐♥✉❡s✳ ❚❤❡ r❡❝✉rs✐✈❡ ❝❛❧❧s ❞♦ ♥♦t ♥❡st❀ t❤❡ ❛❞❞✐t✐♦♥s ❛r❡ ❞♦♥❡ ✐♠♠❡❞✐✲ ❛t❡❧②✳ ❆ r❡❝✉rs✐✈❡ ❢✉♥❝t✐♦♥ ✇❤♦s❡ ❝♦♠♣✉t❛t✐♦♥ ❞♦❡s ♥♦t ♥❡st ✐s ❝❛❧❧❡❞ ✐t❡r❛t✐✈❡ ♦r t❛✐❧✲r❡❝✉rs✐✈❡ ✳ ▼❛♥② ❢✉♥❝t✐♦♥s ❝❛♥ ❜❡ ♠❛❞❡ ✐t❡r❛t✐✈❡ ❜② ✐♥tr♦❞✉❝✐♥❣ ❛♥ ❛r❣✉♠❡♥t ❛♥❛❧♦❣♦✉s t♦ t♦t❛❧ ✱ ✇❤✐❝❤ ✐s ♦❢t❡♥ ❝❛❧❧❡❞ ❛♥ ❛❝❝✉♠✉❧❛t♦r ✳ ❚❤❡ ❣❛✐♥ ✐♥ ❡✣❝✐❡♥❝② ✐s s♦♠❡t✐♠❡s ✇♦rt❤✇❤✐❧❡ ❛♥❞ s♦♠❡t✐♠❡s ♥♦t✳ ❚❤❡ ❢✉♥❝t✐♦♥ ♣♦✇❡r ✐s ♥♦t ✐t❡r❛t✐✈❡ ❜❡❝❛✉s❡ ♥❡st✐♥❣ ♦❝❝✉rs ✇❤❡♥❡✈❡r t❤❡ ❡①♣♦♥❡♥t ✐s ♦❞❞✳ ❆❞❞✐♥❣ ❛ t❤✐r❞ ❛r❣✉♠❡♥t ♠❛❦❡s ✐t ✐t❡r❛t✐✈❡✱ ❜✉t t❤❡ ❝❤❛♥❣❡ ❝♦♠♣❧✐✲ ❝❛t❡s t❤❡ ❢✉♥❝t✐♦♥ ❛♥❞ t❤❡ ❣❛✐♥ ✐♥ ❡✣❝✐❡♥❝② ✐s ♠✐♥✉t❡❀ ❢♦r ✸✷✲❜✐t ✐♥t❡❣❡rs✱ t❤❡ ♠❛①✐♠✉♠ ♣♦ss✐❜❧❡ ♥❡st✐♥❣ ✐s ✸✵ ❢♦r t❤❡ ❡①♣♦♥❡♥t 2 31 − 1 ✳
■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✷✶ Recursion Versus Iteration: Some Comments Iterative normally refers to a loop —coded using while , for instance. Tail-recursion is efficient only if the compiler detects it. Slide 208 Mainly it saves space , though iterative code can run faster. D ON ’ T make programs iterative unless the gain is significant. • People fought to give recursion to programmers: first, in Algol-60 . • Your code may turn into a mess! ❆ ❝❧❛ss✐❝ ❜♦♦❦ ❜② ❆❜❡❧s♦♥ ❛♥❞ ❙✉ss♠❛♥ ❬✶❪ ✉s❡❞ ✐t❡r❛t✐✈❡ t♦ ♠❡❛♥ t❛✐❧✲ r❡❝✉rs✐✈❡ ✳ ■t ❞❡s❝r✐❜❡s t❤❡ ▲✐s♣ ❞✐❛❧❡❝t ❦♥♦✇♥ ❛s ❙❝❤❡♠❡✳ ■t❡r❛t✐✈❡ ❢✉♥❝t✐♦♥s ♣r♦❞✉❝❡ ❝♦♠♣✉t❛t✐♦♥s r❡s❡♠❜❧✐♥❣ t❤♦s❡ t❤❛t ❝❛♥ ❜❡ ❞♦♥❡ ✉s✐♥❣ ✇❤✐❧❡ ✲❧♦♦♣s ✐♥ ❝♦♥✈❡♥t✐♦♥❛❧ ❧❛♥❣✉❛❣❡s✳ ▼❛♥② ❛❧❣♦r✐t❤♠s ❝❛♥ ❜❡ ❡①♣r❡ss❡❞ ♥❛t✉r❛❧❧② ✉s✐♥❣ r❡❝✉rs✐♦♥✱ ❜✉t ♦♥❧② ❛✇❦✇❛r❞❧② ✉s✐♥❣ ✐t❡r❛t✐♦♥✳ ❚❤❡r❡ ✐s ❛ st♦r② t❤❛t ❉✐❥❦str❛ s♥❡❛❦❡❞ r❡❝✉rs✐♦♥ ✐♥t♦ ❆❧❣♦❧✲✻✵ ❜② ✐♥s❡rt✐♥❣ t❤❡ ✇♦r❞s ✏❛♥② ♦t❤❡r ♦❝❝✉rr❡♥❝❡ ♦❢ t❤❡ ♣r♦❝❡❞✉r❡ ♥❛♠❡ ❞❡♥♦t❡s ❡①❡❝✉t✐♦♥ ♦❢ t❤❡ ♣r♦❝❡❞✉r❡✑✳ ❇② ♥♦t ✉s✐♥❣ t❤❡ ✇♦r❞ ✏r❡❝✉rs✐♦♥✑✱ ❤❡ ♠❛♥❛❣❡❞ t♦ s❧✐♣ t❤✐s ❛♠❡♥❞♠❡♥t ♣❛st s❝❡♣t✐❝❛❧ ❝♦❧❧❡❛❣✉❡s✳ ❖❜s❡ss✐♦♥ ✇✐t❤ t❛✐❧ r❡❝✉rs✐♦♥ ❧❡❛❞s t♦ ❛ ❝♦❞✐♥❣ st②❧❡ ✐♥ ✇❤✐❝❤ ❢✉♥❝t✐♦♥s ❤❛✈❡ ♠❛♥② ♠♦r❡ ❛r❣✉♠❡♥ts t❤❛♥ ♥❡❝❡ss❛r②✳ ❲r✐t❡ str❛✐❣❤t❢♦r✇❛r❞ ❝♦❞❡ ✜rst✱ ❛✈♦✐❞✐♥❣ ♦♥❧② ❣r♦ss ✐♥❡✣❝✐❡♥❝②✳ ■❢ t❤❡ ♣r♦❣r❛♠ t✉r♥s ♦✉t t♦ ❜❡ t♦♦ s❧♦✇✱ t♦♦❧s ❛r❡ ❛✈❛✐❧❛❜❧❡ ❢♦r ♣✐♥♣♦✐♥t✐♥❣ t❤❡ ❝❛✉s❡✳ ❆❧✇❛②s r❡♠❡♠❜❡r ❑■❙❙ ✭❑❡❡♣ ■t ❙✐♠♣❧❡✱ ❙t✉♣✐❞✮✳ ■ ❤♦♣❡ ②♦✉ ❤❛✈❡ ❛❧❧ ♥♦t✐❝❡❞ ❜② ♥♦✇ t❤❛t t❤❡ s✉♠♠❛t✐♦♥ ❝❛♥ ❜❡ ❞♦♥❡ ❡✈❡♥ ♠♦r❡ ❡✣❝✐❡♥t❧② ✉s✐♥❣ t❤❡ ❛r✐t❤♠❡t✐❝ ♣r♦❣r❡ss✐♦♥ ❢♦r♠✉❧❛ 1 + · · · + n = n ( n + 1) / 2 .
■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✷✷ Computing Square Roots: Newton-Raphson x i +1 = a/x i + x i 2 fun nextApprox (a,x) = (a/x + x) / 2.0; Slide 209 > nextApprox = fn : real * real -> real nextApprox (2.0, 1.5); > val it = 1.41666666667 : real nextApprox (2.0, it); > val it = 1.41421568627 : real nextApprox (2.0, it); > val it = 1.41421356237 : real ◆♦✇✱ ❧❡t ✉s ❧♦♦❦ ❛t ❛ ❞✐✛❡r❡♥t s♦rt ♦❢ ❛❧❣♦r✐t❤♠✳ ❚❤❡ ◆❡✇t♦♥✲❘❛♣❤s♦♥ ♠❡t❤♦❞ ✐s ❛ ❤✐❣❤❧② ❡✛❡❝t✐✈❡ ♠❡❛♥s ♦❢ ✜♥❞✐♥❣ r♦♦ts ♦❢ ❡q✉❛t✐♦♥s✳ ■t ✐s ✉s❡❞ ✐♥ ♥✉♠❡r✐❝❛❧ ❧✐❜r❛r✐❡s t♦ ❝♦♠♣✉t❡ ♠❛♥② st❛♥❞❛r❞ ❢✉♥❝t✐♦♥s✱ ❛♥❞ ✐♥ ❤❛r❞✇❛r❡✱ t♦ ❝♦♠♣✉t❡ r❡❝✐♣r♦❝❛❧s✳ ❙t❛rt✐♥❣ ✇✐t❤ ❛♥ ❛♣♣r♦①✐♠❛t✐♦♥ x 0 ✱ ❝♦♠♣✉t❡ ♥❡✇ ♦♥❡s x 1 ✱ x 2 ✱ ✳ ✳ ✳ ✱ ✉s✐♥❣ ❛ ❢♦r♠✉❧❛ ♦❜t❛✐♥❡❞ ❢r♦♠ t❤❡ ❡q✉❛t✐♦♥ t♦ ❜❡ s♦❧✈❡❞✳ Pr♦✈✐❞❡❞ t❤❡ ✐♥✐t✐❛❧ ❣✉❡ss ✐s s✉✣❝✐❡♥t❧② ❝❧♦s❡ t♦ t❤❡ r♦♦t✱ t❤❡ ♥❡✇ ❛♣♣r♦①✐♠❛t✐♦♥s ✇✐❧❧ ❝♦♥✈❡r❣❡ t♦ ✐t r❛♣✐❞❧②✳ ❚❤❡ ❢♦r♠✉❧❛ s❤♦✇♥ ❛❜♦✈❡ ❝♦♠♣✉t❡s t❤❡ sq✉❛r❡ r♦♦t ♦❢ a ✳ ❚❤❡ ▼▲ s❡ss✐♦♥ √ ❞❡♠♦♥str❛t❡s t❤❡ ❝♦♠♣✉t❛t✐♦♥ ♦❢ 2 ✳ ❙t❛rt✐♥❣ ✇✐t❤ t❤❡ ❣✉❡ss x 0 = 1 . 5 ✱ ✇❡ r❡❛❝❤ ❜② x 3 t❤❡ sq✉❛r❡ r♦♦t ✐♥ ❢✉❧❧ ♠❛❝❤✐♥❡ ♣r❡❝✐s✐♦♥✳ ❈♦♥t✐♥✉✐♥❣ t❤❡ s❡ss✐♦♥ ❛ ❜✐t ❧♦♥❣❡r r❡✈❡❛❧s t❤❛t t❤❡ ❝♦♥✈❡r❣❡♥❝❡ ❤❛s ♦❝❝✉rr❡❞✱ ✇✐t❤ x 4 = x 3 ✿ ♥❡①t❆♣♣r♦① ✭✷✳✵✱ ✐t✮❀ ❃ ✈❛❧ ✐t ❂ ✶✳✹✶✹✷✶✸✺✻✷✸✼ ✿ r❡❛❧ ✐t✯✐t❀ ❃ ✈❛❧ ✐t ❂ ✷✳✵ ✿ r❡❛❧
■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✷✸ A Square Root Function fun findRoot (a, x, epsilon) = let val nextx = (a/x + x) / 2.0 in if abs(x-nextx) < epsilon*x then nextx Slide 210 else findRoot (a, nextx, epsilon) end; fun sqrt a = findRoot (a, 1.0, 1.0E~10); > sqrt = fn : real -> real sqrt 64.0; > val it = 8.0 : real ❚❤❡ ❢✉♥❝t✐♦♥ ❢✐♥❞❘♦♦t ❛♣♣❧✐❡s ◆❡✇t♦♥✲❘❛♣❤s♦♥ t♦ ❝♦♠♣✉t❡ t❤❡ sq✉❛r❡ r♦♦t ♦❢ a ✱ st❛rt✐♥❣ ✇✐t❤ t❤❡ ✐♥✐t✐❛❧ ❣✉❡ss x ✱ ✇✐t❤ r❡❧❛t✐✈❡ ❛❝❝✉r❛❝② ǫ ✳ ■t t❡r♠✐♥❛t❡s ✇❤❡♥ s✉❝❝❡ss✐✈❡ ❛♣♣r♦①✐♠❛t✐♦♥s ❛r❡ ✇✐t❤✐♥ t❤❡ t♦❧❡r❛♥❝❡ ǫx ✱ ♠♦r❡ ♣r❡❝✐s❡❧②✱ ✇❤❡♥ | x i − x i +1 | < ǫx ✳ ❚❤✐s r❡❝✉rs✐✈❡ ❢✉♥❝t✐♦♥ ❞✐✛❡rs ❢✉♥❞❛♠❡♥t❛❧❧② ❢r♦♠ ♣r❡✈✐♦✉s ♦♥❡s ❧✐❦❡ ♣♦✇❡r ❛♥❞ s✉♠♠✐♥❣ ✳ ❋♦r t❤♦s❡✱ ✇❡ ❝❛♥ ❡❛s✐❧② ♣✉t ❛ ❜♦✉♥❞ ♦♥ t❤❡ ♥✉♠❜❡r ♦❢ st❡♣s t❤❡② ✇✐❧❧ t❛❦❡✱ ❛♥❞ t❤❡✐r r❡s✉❧t ✐s ❡①❛❝t✳ ❋♦r ❢✐♥❞❘♦♦t ✱ ❞❡t❡r♠✐♥✲ ✐♥❣ ❤♦✇ ♠❛♥② st❡♣s ❛r❡ r❡q✉✐r❡❞ ❢♦r ❝♦♥✈❡r❣❡♥❝❡ ✐s ❤❛r❞✳ ■t ♠✐❣❤t ♦s❝✐❧❧❛t❡ ❜❡t✇❡❡♥ t✇♦ ❛♣♣r♦①✐♠❛t✐♦♥s t❤❛t ❞✐✛❡r ✐♥ t❤❡✐r ❧❛st ❜✐t✳ ❖❜s❡r✈❡ ❤♦✇ ♥❡①t① ✐s ❞❡❝❧❛r❡❞ ❛s t❤❡ ♥❡①t ❛♣♣r♦①✐♠❛t✐♦♥✳ ❚❤✐s ✈❛❧✉❡ ✐s ✉s❡❞ t❤r❡❡ t✐♠❡s ❜✉t ❝♦♠♣✉t❡❞ ♦♥❧② ♦♥❝❡✳ ■♥ ❣❡♥❡r❛❧✱ ❧❡t D ✐♥ E ❡♥❞ ❞❡❝❧❛r❡s t❤❡ ✐t❡♠s ✐♥ D ❜✉t ♠❛❦❡s t❤❡♠ ✈✐s✐❜❧❡ ♦♥❧② ✐♥ t❤❡ ❡①♣r❡ss✐♦♥ E ✳ ✭❘❡❝❛❧❧ t❤❛t ✐❞❡♥t✐✜❡rs ❞❡❝❧❛r❡❞ ✉s✐♥❣ ✈❛❧ ❝❛♥♥♦t ❜❡ ❛ss✐❣♥❡❞ t♦✳✮ ❋✉♥❝t✐♦♥ sqrt ♠❛❦❡s ❛♥ ✐♥✐t✐❛❧ ❣✉❡ss ♦❢ ✶✳✵✳ ❆ ♣r❛❝t✐❝❛❧ ❛♣♣❧✐❝❛t✐♦♥ ♦❢ ◆❡✇t♦♥✲❘❛♣❤s♦♥ ❣❡ts t❤❡ ✐♥✐t✐❛❧ ❛♣♣r♦①✐♠❛t✐♦♥ ❢r♦♠ ❛ t❛❜❧❡✳ ■♥❞❡①❡❞ ❜② s❛② ❡✐❣❤t ❜✐ts t❛❦❡♥ ❢r♦♠ a ✱ t❤❡ t❛❜❧❡ ✇♦✉❧❞ ❤❛✈❡ ♦♥❧② ✷✺✻ ❡♥tr✐❡s✳ ❆ ❣♦♦❞ ✐♥✐t✐❛❧ ❣✉❡ss ❡♥s✉r❡s ❝♦♥✈❡r❣❡♥❝❡ ✇✐t❤✐♥ ❛ ♣r❡❞❡t❡r♠✐♥❡❞ ♥✉♠❜❡r ♦❢ st❡♣s✱ t②♣✐❝❛❧❧② t✇♦ ♦r t❤r❡❡✳ ❚❤❡ ❧♦♦♣ ❜❡❝♦♠❡s str❛✐❣❤t✲❧✐♥❡ ❝♦❞❡ ✇✐t❤ ♥♦ ❝♦♥✈❡r❣❡♥❝❡ t❡st✳
■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✷✹ ❘❡❧❛t❡❞ ♠❛t❡r✐❛❧ ✐s ✐♥ ▼▲ ❢♦r t❤❡ ❲♦r❦✐♥❣ Pr♦❣r❛♠♠❡r ✱ ▲❡❛r♥✐♥❣ ❣✉✐❞❡✳ ♣❛❣❡s ✹✽✕✺✽✳ ❚❤❡ ♠❛t❡r✐❛❧ ♦♥ t②♣❡ ❝❤❡❝❦✐♥❣ ✭♣❛❣❡s ✻✸✕✻✼✮ ♠❛② ✐♥t❡r❡st t❤❡ ♠♦r❡ ❡♥t❤✉s✐❛st✐❝ st✉❞❡♥t✳ ❈♦❞❡ ❛♥ ✐t❡r❛t✐✈❡ ✈❡rs✐♦♥ ♦❢ t❤❡ ❢✉♥❝t✐♦♥ ♣♦✇❡r ✳ ❊①❡r❝✐s❡ ✷✳✶ ❚r② ✉s✐♥❣ x i +1 = x i (2 − x i a ) t♦ ❝♦♠♣✉t❡ 1 /a ✳ ❯♥❧❡ss t❤❡ ❊①❡r❝✐s❡ ✷✳✷ ✐♥✐t✐❛❧ ❛♣♣r♦①✐♠❛t✐♦♥ x 0 ✐s ❣♦♦❞✱ ✐t ♠✐❣❤t ♥♦t ❝♦♥✈❡r❣❡ ❛t ❛❧❧✳ ✭P✐❡rr❡ ❏♦✉❡t ❛♥❞ ❙t❡❢❛♥ ❘❡♥♦❧❞ ♥♦t❡ t❤❛t ✐❢ a > 0 t❤❡♥ t❤❡ s❡q✉❡♥❝❡ ❝♦♥✈❡r❣❡s ✐❢ ❛♥❞ ♦♥❧② ✐❢ 0 < x 0 < 2 /a ✳✮ ❋✉♥❝t✐♦♥s ♥♣♦✇❡r ❛♥❞ ♣♦✇❡r ❜♦t❤ ❤❛✈❡ t②♣❡ ❝♦♥str❛✐♥ts✱ ❊①❡r❝✐s❡ ✷✳✸ ❜✉t ♦♥❧② ♦♥❡ ♦❢ t❤❡♠ ❛❝t✉❛❧❧② ♥❡❡❞s ✐t✳ ❚r② t♦ ✇♦r❦ ♦✉t ✇❤✐❝❤ ❢✉♥❝t✐♦♥ ❞♦❡s ♥♦t ♥❡❡❞s ✐ts t②♣❡ ❝♦♥str❛✐♥t ♠❡r❡❧② ❜② ❧♦♦❦✐♥❣ ❛t ✐ts ❞❡❝❧❛r❛t✐♦♥✳
■■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✷✺ A Silly Square Root Function fun nthApprox (a,x,n) = if n=0 then x Slide 301 else (a / nthApprox(a,x,n-1) + nthApprox(a,x,n-1)) / 2.0; The function calls itself 2 n times! Bigger inputs mean higher costs—but what’s the growth rate? ❚❤❡ ♣✉r♣♦s❡ ♦❢ ♥t❤❆♣♣r♦① ✐s t♦ ❝♦♠♣✉t❡ x n ❢r♦♠ t❤❡ ✐♥✐t✐❛❧ ❛♣♣r♦①✐♠❛✲ t✐♦♥ x 0 ✉s✐♥❣ t❤❡ ◆❡✇t♦♥✲❘❛♣❤s♦♥ ❢♦r♠✉❧❛ x i +1 = ( a/x i + x i ) / 2 ✳ ❘❡♣❡❛t✐♥❣ t❤❡ r❡❝✉rs✐✈❡ ❝❛❧❧✖❛♥❞ t❤❡r❡❢♦r❡ t❤❡ ❝♦♠♣✉t❛t✐♦♥✖✐s ♦❜✈✐♦✉s❧② ✇❛st❡❢✉❧✳ ❚❤❡ r❡♣❡t✐t✐♦♥ ❝❛♥ ❜❡ ❡❧✐♠✐♥❛t❡❞ ✉s✐♥❣ ❧❡t ✈❛❧✳✳✳✐♥ E ❡♥❞ ✳ ❇❡tt❡r st✐❧❧ ✐s t♦ ❝❛❧❧ t❤❡ ❢✉♥❝t✐♦♥ ♥❡①t❆♣♣r♦① ✱ ✉t✐❧✐③✐♥❣ ❛♥ ❡①✐st✐♥❣ ❛❜str❛❝t✐♦♥✳ ❋❛st ❤❛r❞✇❛r❡ ❞♦❡s ♥♦t ♠❛❦❡ ❣♦♦❞ ❛❧❣♦r✐t❤♠s ✉♥♥❡❝❡ss❛r②✳ ❖♥ t❤❡ ❝♦♥✲ tr❛r②✱ ❢❛st❡r ❤❛r❞✇❛r❡ ♠❛❣♥✐✜❡s t❤❡ s✉♣❡r✐♦r✐t② ♦❢ ❜❡tt❡r ❛❧❣♦r✐t❤♠s✳ ❚②♣✲ ✐❝❛❧❧②✱ ✇❡ ✇❛♥t t♦ ❤❛♥❞❧❡ t❤❡ ❧❛r❣❡st ✐♥♣✉ts ♣♦ss✐❜❧❡✳ ■❢ ✇❡ ❜✉② ❛ ♠❛❝❤✐♥❡ t❤❛t ✐s t✇✐❝❡ ❛s ♣♦✇❡r❢✉❧ ❛s ♦✉r ♦❧❞ ♦♥❡✱ ❤♦✇ ♠✉❝❤ ❝❛♥ t❤❡ ✐♥♣✉t t♦ ♦✉r ❢✉♥❝t✐♦♥ ❜❡ ✐♥❝r❡❛s❡❞❄ ❲✐t❤ ♥t❤❆♣♣r♦① ✱ ✇❡ ❝❛♥ ♦♥❧② ❣♦ ❢r♦♠ n t♦ n + 1 ✳ ❲❡ ❛r❡ ❧✐♠✐t❡❞ t♦ t❤✐s ♠♦❞❡st ✐♥❝r❡❛s❡ ❜❡❝❛✉s❡ t❤❡ ❢✉♥❝t✐♦♥✬s r✉♥♥✐♥❣ t✐♠❡ ✐s ♣r♦♣♦rt✐♦♥❛❧ t♦ 2 n ✳ ❲✐t❤ t❤❡ ❢✉♥❝t✐♦♥ ♥♣♦✇❡r ✱ ❞❡✜♥❡❞ ✐♥ ▲❡❝t✳ ✷✱ ✇❡ ❝❛♥ ❣♦ ❢r♦♠ n t♦ 2 n ✿ ✇❡ ❝❛♥ ❤❛♥❞❧❡ ♣r♦❜❧❡♠s t✇✐❝❡ ❛s ❜✐❣✳ ❲✐t❤ ♣♦✇❡r ✇❡ ❝❛♥ ❞♦ ♠✉❝❤ ❜❡tt❡r st✐❧❧✱ ❣♦✐♥❣ ❢r♦♠ n t♦ n 2 ✳ ❆s②♠♣t♦t✐❝ ❝♦♠♣❧❡①✐t② r❡❢❡rs t♦ ❤♦✇ ❝♦sts ❣r♦✇ ✇✐t❤ ✐♥❝r❡❛s✐♥❣ ✐♥♣✉ts✳ ❈♦sts ✉s✉❛❧❧② r❡❢❡r t♦ t✐♠❡ ♦r s♣❛❝❡✳ ❙♣❛❝❡ ❝♦♠♣❧❡①✐t② ❝❛♥ ♥❡✈❡r ❡①❝❡❡❞ t✐♠❡ ❝♦♠♣❧❡①✐t②✱ ❢♦r ✐t t❛❦❡s t✐♠❡ t♦ ❞♦ ❛♥②t❤✐♥❣ ✇✐t❤ t❤❡ s♣❛❝❡✳ ❚✐♠❡ ❝♦♠♣❧❡①✐t② ♦❢t❡♥ ❣r❡❛t❧② ❡①❝❡❡❞s s♣❛❝❡ ❝♦♠♣❧❡①✐t②✳ ❚❤✐s ❧❡❝t✉r❡ ❝♦♥s✐❞❡rs ❤♦✇ t♦ ❡st✐♠❛t❡ ✈❛r✐♦✉s ❝♦sts ❛ss♦❝✐❛t❡❞ ✇✐t❤ ❛ ♣r♦✲ ❣r❛♠✳ ❆ ❜r✐❡❢ ✐♥tr♦❞✉❝t✐♦♥ t♦ ❛ ❞✐✣❝✉❧t s✉❜❥❡❝t✱ ✐t ❞r❛✇s ✉♣♦♥ t❤❡ ❡①❝❡❧❧❡♥t t❡①ts ❈♦♥❝r❡t❡ ▼❛t❤❡♠❛t✐❝s ❬✻❪ ❛♥❞ ■♥tr♦❞✉❝t✐♦♥ t♦ ❆❧❣♦r✐t❤♠s ❬✺❪✳
■■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✷✻ Some Illustrative Figures complexity 1 second 1 minute 1 hour gain n × 60 1000 60,000 3,600,000 Slide 302 n lg n × 41 140 4,893 200,000 n 2 × 8 31 244 1,897 n 3 × 4 10 39 153 2 n +6 9 15 21 complexity = milliseconds needed for an input of size n ❚❤✐s t❛❜❧❡ ✭❡①❝❡r♣t❡❞ ❢r♦♠ ❆❤♦ ❡t ❛❧✳ ❬✷✱ ♣❛❣❡ ✸❪✮ ✐❧❧✉str❛t❡s t❤❡ ❡✛❡❝t ♦❢ ✈❛r✐♦✉s t✐♠❡ ❝♦♠♣❧❡①✐t✐❡s✳ ❚❤❡ ❧❡❢t✲❤❛♥❞ ❝♦❧✉♠♥ ✐♥❞✐❝❛t❡s ❤♦✇ ♠❛♥② ♠✐❧❧✐s❡❝♦♥❞s ❛r❡ r❡q✉✐r❡❞ t♦ ♣r♦❝❡ss ❛♥ ✐♥♣✉t ♦❢ s✐③❡ n ✳ ❚❤❡ ♦t❤❡r ❡♥tr✐❡s s❤♦✇ t❤❡ ♠❛①✐♠✉♠ s✐③❡ ♦❢ n t❤❛t ❝❛♥ ❜❡ ♣r♦❝❡ss❡❞ ✐♥ t❤❡ ❣✐✈❡♥ t✐♠❡ ✭♦♥❡ s❡❝♦♥❞✱ ♠✐♥✉t❡ ♦r ❤♦✉r✮✳ ❚❤❡ t❛❜❧❡ ✐❧❧✉str❛t❡s ❤♦✇ ❤♦✇ ❧❛r❣❡ ❛♥ ✐♥♣✉t ❝❛♥ ❜❡ ♣r♦❝❡ss❡❞ ❛s ❛ ❢✉♥❝✲ t✐♦♥ ♦❢ t✐♠❡✳ ❆s ✇❡ ✐♥❝r❡❛s❡ t❤❡ ❝♦♠♣✉t❡r t✐♠❡ ♣❡r ✐♥♣✉t ❢r♦♠ ♦♥❡ s❡❝♦♥❞ t♦ ♦♥❡ ♠✐♥✉t❡ ❛♥❞ t❤❡♥ t♦ ♦♥❡ ❤♦✉r✱ t❤❡ s✐③❡ ♦❢ t❤❡ ✐♥♣✉t ✐♥❝r❡❛s❡s ❛❝❝♦r❞✐♥❣❧②✳ ❚❤❡ t♦♣ t✇♦ r♦✇s ✭❝♦♠♣❧❡①✐t✐❡s n ❛♥❞ n lg n ✮ ✐♥❝r❡❛s❡ r❛♣✐❞❧②✿ ❢♦r n ✱ ❜② ❛ ❢❛❝t♦r ♦❢ ✻✵✳ ❚❤❡ ❜♦tt♦♠ t✇♦ st❛rt ♦✉t ❝❧♦s❡ t♦❣❡t❤❡r✱ ❜✉t n 3 ✭✇❤✐❝❤ ❣r♦✇s ❜② ❛ ❢❛❝t♦r ♦❢ ✸✳✾✮ ♣✉❧❧s ✇❡❧❧ ❛✇❛② ❢r♦♠ 2 n ✭✇❤♦s❡ ❣r♦✇t❤ ✐s ♦♥❧② ❛❞❞✐t✐✈❡✮✳ ■❢ ❛♥ ❛❧❣♦r✐t❤♠✬s ❝♦♠♣❧❡①✐t② ✐s ❡①♣♦♥❡♥t✐❛❧ t❤❡♥ ✐t ❝❛♥ ♥❡✈❡r ❤❛♥❞❧❡ ❧❛r❣❡ ✐♥♣✉ts✱ ❡✈❡♥ ✐❢ ✐t ✐s ❣✐✈❡♥ ❤✉❣❡ r❡s♦✉r❝❡s✳ ❖♥ t❤❡ ♦t❤❡r ❤❛♥❞✱ s✉♣♣♦s❡ t❤❡ ❝♦♠♣❧❡①✐t② ❤❛s t❤❡ ❢♦r♠ n c ✱ ✇❤❡r❡ c ✐s ❛ ❝♦♥st❛♥t✳ ✭❲❡ s❛② t❤❡ ❝♦♠♣❧❡①✐t② ✐s ♣♦❧②♥♦♠✐❛❧ ✳✮ ❉♦✉❜❧✐♥❣ t❤❡ ❛r❣✉♠❡♥t t❤❡♥ ✐♥❝r❡❛s❡s t❤❡ ❝♦st ❜② ❛ ❝♦♥st❛♥t ❢❛❝t♦r✳ ❚❤❛t ✐s ♠✉❝❤ ❜❡tt❡r✱ t❤♦✉❣❤ ✐❢ c > 3 t❤❡ ❛❧❣♦r✐t❤♠ ♠❛② ♥♦t ❜❡ ❝♦♥s✐❞❡r❡❞ ♣r❛❝t✐❝❛❧✳ ❆❞❞ ❛ ❝♦❧✉♠♥ t♦ t❤❡ t❛❜❧❡ ✇✐t❤ t❤❡ ❤❡❛❞✐♥❣ ✻✵ ❤♦✉rs ✳ ❊①❡r❝✐s❡ ✸✳✶
■■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✷✼ Comparing Algorithms Look at the most significant term. Slide 303 Ignore constant factors : • They are seldom important. • They depend on ephemeral details such as computer brand. Example: consider n 2 instead of 3 n 2 + 34 n + 433 . ❚❤❡ ❝♦st ♦❢ ❛ ♣r♦❣r❛♠ ✐s ✉s✉❛❧❧② ❛ ❝♦♠♣❧✐❝❛t❡❞ ❢♦r♠✉❧❛✳ ❖❢t❡♥ ✇❡ s❤♦✉❧❞ ❝♦♥s✐❞❡r ♦♥❧② t❤❡ ♠♦st s✐❣♥✐✜❝❛♥t t❡r♠✳ ■❢ t❤❡ ❝♦st ✐s n 2 + 99 n + 900 ❢♦r ❛♥ ✐♥♣✉t ♦❢ s✐③❡ n ✱ t❤❡♥ t❤❡ n 2 t❡r♠ ✇✐❧❧ ❡✈❡♥t✉❛❧❧② ❞♦♠✐♥❛t❡✱ ❡✈❡♥ t❤♦✉❣❤ 99 n ✐s ❜✐❣❣❡r ❢♦r n < 99 ✳ ❚❤❡ ❝♦♥st❛♥t t❡r♠ ✾✵✵ ♠❛② ❧♦♦❦ ❜✐❣✱ ❜✉t ❛s n ✐♥❝r❡❛s❡s ✐t r❛♣✐❞❧② ❜❡❝♦♠❡s ✐♥s✐❣♥✐✜❝❛♥t✳ ❈♦♥st❛♥t ❢❛❝t♦rs ✐♥ ❝♦sts ❛r❡ ♦❢t❡♥ ✐❣♥♦r❡❞✳ ❋♦r ♦♥❡ t❤✐♥❣✱ t❤❡② s❡❧❞♦♠ ♠❛❦❡ ❛ ❞✐✛❡r❡♥❝❡✿ 100 n 2 ✇✐❧❧ ❜❡ ❜❡tt❡r t❤❛♥ n 3 ✐♥ t❤❡ ❧♦♥❣ r✉♥✳ ❖♥❧② ✐❢ t❤❡ ❧❡❛❞✐♥❣ t❡r♠s ❛r❡ ♦t❤❡r✇✐s❡ ✐❞❡♥t✐❝❛❧ ❞♦ ❝♦♥st❛♥t ❢❛❝t♦rs ❜❡❝♦♠❡ ✐♠♣♦rt❛♥t✳ ❇✉t t❤❡r❡ ✐s ❛ s❡❝♦♥❞ ❞✐✣❝✉❧t②✿ ❝♦♥st❛♥t ❢❛❝t♦rs ❛r❡ s❡❧❞♦♠ r❡❧✐❛❜❧❡✳ ❚❤❡② ❞❡♣❡♥❞ ✉♣♦♥ ❞❡t❛✐❧s s✉❝❤ ❛s ✇❤✐❝❤ ❤❛r❞✇❛r❡✱ ♦♣❡r❛t✐♥❣ s②st❡♠ ♦r ♣r♦❣r❛♠✲ ♠✐♥❣ ❧❛♥❣✉❛❣❡ ✐s ❜❡✐♥❣ ✉s❡❞✳ ❇② ✐❣♥♦r✐♥❣ ❝♦♥st❛♥t ❢❛❝t♦rs✱ ✇❡ ❝❛♥ ♠❛❦❡ ❝♦♠♣❛r✐s♦♥s ❜❡t✇❡❡♥ ❛❧❣♦r✐t❤♠s t❤❛t r❡♠❛✐♥ ✈❛❧✐❞ ✐♥ ❛ ❜r♦❛❞ r❛♥❣❡ ♦❢ ❝✐r✲ ❝✉♠st❛♥❝❡s✳ ■♥ ♣r❛❝t✐❝❡✱ ❝♦♥st❛♥t ❢❛❝t♦rs s♦♠❡t✐♠❡s ♠❛tt❡r✳ ■❢ ❛♥ ❛❧❣♦r✐t❤♠ ✐s t♦♦ ❝♦♠♣❧✐❝❛t❡❞✱ ✐ts ❝♦sts ✇✐❧❧ ✐♥❝❧✉❞❡ ❛ ❧❛r❣❡ ❝♦♥st❛♥t ❢❛❝t♦r✳ ■♥ t❤❡ ❝❛s❡ ♦❢ ♠✉❧✲ t✐♣❧✐❝❛t✐♦♥✱ t❤❡ t❤❡♦r❡t✐❝❛❧❧② ❢❛st❡st ❛❧❣♦r✐t❤♠ ❝❛t❝❤❡s ✉♣ ✇✐t❤ t❤❡ st❛♥❞❛r❞ ♦♥❡ ♦♥❧② ❢♦r ❡♥♦r♠♦✉s ✈❛❧✉❡s ♦❢ n ✳
■■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✷✽ O Notation (And Friends) f ( n ) = O ( g ( n )) provided | f ( n ) | ≤ c | g ( n ) | • for some constant c • and all sufficiently large n . Slide 304 f ( n ) = O ( g ( n )) means g is an upper bound on f f ( n ) = Ω( g ( n )) means g is an lower bound on f f ( n ) = Θ( g ( n )) means g gives exact bounds on f ❚❤❡ ❵❇✐❣ ❖✬ ♥♦t❛t✐♦♥ ✐s ❝♦♠♠♦♥❧② ✉s❡❞ t♦ ❞❡s❝r✐❜❡ ❡✣❝✐❡♥❝②✖t♦ ❜❡ ♣r❡✲ ❝✐s❡✱ ❛s②♠♣t♦t✐❝ ❝♦♠♣❧❡①✐t② ✳ ■t ❝♦♥❝❡r♥s t❤❡ ❧✐♠✐t ♦❢ ❛ ❢✉♥❝t✐♦♥ ❛s ✐ts ❛r❣✉✲ ♠❡♥t t❡♥❞s t♦ ✐♥✜♥✐t②✳ ■t ✐s ❛♥ ❛❜str❛❝t✐♦♥ t❤❛t ♠❡❡ts t❤❡ ✐♥❢♦r♠❛❧ ❝r✐t❡r✐❛ t❤❛t ✇❡ ❤❛✈❡ ❥✉st ❞✐s❝✉ss❡❞✳ ■♥ t❤❡ ❞❡✜♥✐t✐♦♥✱ s✉✣❝✐❡♥t❧② ❧❛r❣❡ ♠❡❛♥s t❤❡r❡ ✐s s♦♠❡ ❝♦♥st❛♥t n 0 s✉❝❤ t❤❛t | f ( n ) | ≤ c | g ( n ) | ❢♦r ❛❧❧ n ❣r❡❛t❡r t❤❛♥ n 0 ✳ ❚❤❡ r♦❧❡ ♦❢ n 0 ✐s t♦ ✐❣♥♦r❡ ✜♥✐t❡❧② ♠❛♥② ❡①❝❡♣t✐♦♥s t♦ t❤❡ ❜♦✉♥❞✱ s✉❝❤ ❛s t❤❡ ❝❛s❡s ✇❤❡♥ 99 n ❡①❝❡❡❞s n 2 ✳ ❚❤❡ ♥♦t❛t✐♦♥ ❛❧s♦ ✐❣♥♦r❡s ❝♦♥st❛♥t ❢❛❝t♦rs s✉❝❤ ❛s c ✳ ❲❡ ♠❛② ✉s❡ ❛ ❞✐✛❡r❡♥t c ❛♥❞ n 0 ✇✐t❤ ❡❛❝❤ f ✳ ❚❤❡ st❛♥❞❛r❞ ♥♦t❛t✐♦♥ f ( n ) = O ( g ( n )) ✐s ♠✐s❧❡❛❞✐♥❣✿ t❤✐s ✐s ♥♦ ❡q✉❛t✐♦♥✳ P❧❡❛s❡ ✉s❡ ❝♦♠♠♦♥ s❡♥s❡✳ ❋r♦♠ f ( n ) = O ( n ) ❛♥❞ f ′ ( n ) = O ( n ) ✇❡ ❝❛♥♥♦t ✐♥❢❡r f ( n ) = f ′ ( n ) ✳ ◆♦t❡ t❤❛t f ( n ) = O ( g ( n )) ❣✐✈❡s ❛♥ ✉♣♣❡r ❜♦✉♥❞ ♦♥ f ✐♥ t❡r♠s ♦❢ g ✳ ❚♦ s♣❡❝✐❢② ❛ ❧♦✇❡r ❜♦✉♥❞✱ ✇❡ ❤❛✈❡ t❤❡ ❞✉❛❧ ♥♦t❛t✐♦♥ f ( n ) = Ω( g ( n )) ⇐ ⇒ | f ( n ) | ≥ c | g ( n )) | ❢♦r s♦♠❡ ❝♦♥st❛♥t c ❛♥❞ ❛❧❧ s✉✣❝✐❡♥t❧② ❧❛r❣❡ n ✳ ❚❤❡ ❝♦♥❥✉♥❝t✐♦♥ ♦❢ f ( n ) = O ( g ( n )) ❛♥❞ f ( n ) = Ω( g ( n )) ✐s ✇r✐tt❡♥ f ( n ) = Θ( g ( n )) ✳ P❡♦♣❧❡ ♦❢t❡♥ ✉s❡ O ( g ( n )) ❛s ✐❢ ✐t ❣❛✈❡ ❛ t✐❣❤t ❜♦✉♥❞✱ ❝♦♥❢✉s✐♥❣ ✐t ✇✐t❤ Θ( g ( n )) ✳ ❙✐♥❝❡ O ( g ( n )) ❣✐✈❡s ❛♥ ✉♣♣❡r ❜♦✉♥❞✱ ✐❢ f ( n ) = O ( n ) t❤❡♥ ❛❧s♦ f ( n ) = O ( n 2 ) ✳ ❚r✐❝❦② ❡①❛♠✐♥❛t✐♦♥ q✉❡st✐♦♥s ❡①♣❧♦✐t t❤✐s ❢❛❝t✳
■■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✷✾ Simple Facts About O Notation O (2 g ( n )) is the same as O ( g ( n )) O (log 10 n ) is the same as O (ln n ) Slide 305 O ( n 2 + 50 n + 36) is the same as O ( n 2 ) O ( n 2 ) is contained in O ( n 3 ) O (2 n ) is contained in O (3 n ) O (log n ) is contained in O ( √ n ) O ♥♦t❛t✐♦♥ ❧❡ts ✉s r❡❛s♦♥ ❛❜♦✉t t❤❡ ❝♦sts ♦❢ ❛❧❣♦r✐t❤♠s ❡❛s✐❧②✳ • ❈♦♥st❛♥t ❢❛❝t♦rs s✉❝❤ ❛s t❤❡ ✷ ✐♥ O (2 g ( n )) ❞r♦♣ ♦✉t✿ ✇❡ ❝❛♥ ✉s❡ O ( g ( n )) ✇✐t❤ t✇✐❝❡ t❤❡ ✈❛❧✉❡ ♦❢ c ✐♥ t❤❡ ❞❡✜♥✐t✐♦♥✳ • ❇❡❝❛✉s❡ ❝♦♥st❛♥t ❢❛❝t♦rs ❞r♦♣ ♦✉t✱ t❤❡ ❜❛s❡ ♦❢ ❧♦❣❛r✐t❤♠s ✐s ✐rr❡❧❡✈❛♥t✳ • ■♥s✐❣♥✐✜❝❛♥t t❡r♠s ❞r♦♣ ♦✉t✳ ❚♦ s❡❡ t❤❛t O ( n 2 + 50 n + 36) ✐s t❤❡ s❛♠❡ ❛s O ( n 2 ) ✱ ❝♦♥s✐❞❡r t❤❡ ✈❛❧✉❡ ♦❢ n 0 ♥❡❡❞❡❞ ✐♥ f ( n ) = O ( n 2 + 50 n + 36) ✳ ❯s✐♥❣ t❤❡ ❧❛✇ ( n + k ) 2 = n 2 + 2 nk + k 2 ✱ ✐t ✐s ❡❛s② t♦ ❝❤❡❝❦ t❤❛t ✉s✐♥❣ n 0 + 25 ❢♦r n 0 ❛♥❞ ❦❡❡♣✐♥❣ t❤❡ s❛♠❡ ✈❛❧✉❡ ♦❢ c ❣✐✈❡s f ( n ) = O ( n 2 ) ✳ ■❢ c ❛♥❞ d ❛r❡ ❝♦♥st❛♥ts ✭t❤❛t ✐s✱ t❤❡② ❛r❡ ✐♥❞❡♣❡♥❞❡♥t ♦❢ n ✮ ✇✐t❤ 0 < c < d t❤❡♥ O ( n c ) ✐s ❝♦♥t❛✐♥❡❞ ✐♥ O ( n d ) O ( c n ) ✐s ❝♦♥t❛✐♥❡❞ ✐♥ O ( d n ) O (log n ) ✐s ❝♦♥t❛✐♥❡❞ ✐♥ O ( n c ) ❚♦ s❛② t❤❛t O ( c n ) ✐s ❝♦♥t❛✐♥❡❞ ✐♥ O ( d n ) ♠❡❛♥s t❤❛t t❤❡ ❢♦r♠❡r ❣✐✈❡s ❛ t✐❣❤t❡r ❜♦✉♥❞ t❤❛♥ t❤❡ ❧❛tt❡r✳ ❋♦r ❡①❛♠♣❧❡✱ ✐❢ f ( n ) = O (2 n ) t❤❡♥ f ( n ) = O (3 n ) tr✐✈✐❛❧❧②✱ ❜✉t t❤❡ ❝♦♥✈❡rs❡ ❞♦❡s ♥♦t ❤♦❧❞✳
■■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✸✵ Common Complexity Classes O (1) constant O (log n ) logarithmic Slide 306 O ( n ) linear O ( n log n ) quasi-linear O ( n 2 ) quadratic O ( n 3 ) cubic O ( a n ) exponential (for fixed a ) ▲♦❣❛r✐t❤♠s ❣r♦✇ ✈❡r② s❧♦✇❧②✱ s♦ O (log n ) ❝♦♠♣❧❡①✐t② ✐s ❡①❝❡❧❧❡♥t✳ ❇❡❝❛✉s❡ O ♥♦t❛t✐♦♥ ✐❣♥♦r❡s ❝♦♥st❛♥t ❢❛❝t♦rs✱ t❤❡ ❜❛s❡ ♦❢ t❤❡ ❧♦❣❛r✐t❤♠ ✐s ✐rr❡❧❡✈❛♥t✦ ❯♥❞❡r ❧✐♥❡❛r ✇❡ ♠✐❣❤t ♠❡♥t✐♦♥ O ( n log n ) ✱ ✇❤✐❝❤ ♦❝❝❛s✐♦♥❛❧❧② ✐s ❝❛❧❧❡❞ q✉❛s✐✲❧✐♥❡❛r ✱ ❛♥❞ ✇❤✐❝❤ s❝❛❧❡s ✉♣ ✇❡❧❧ ❢♦r ❧❛r❣❡ n ✳ ❆♥ ❡①❛♠♣❧❡ ♦❢ q✉❛❞r❛t✐❝ ❝♦♠♣❧❡①✐t② ✐s ♠❛tr✐① ❛❞❞✐t✐♦♥✿ ❢♦r♠✐♥❣ t❤❡ s✉♠ ♦❢ t✇♦ n × n ♠❛tr✐❝❡s ♦❜✈✐♦✉s❧② t❛❦❡s n 2 ❛❞❞✐t✐♦♥s✳ ▼❛tr✐① ♠✉❧t✐♣❧✐❝❛t✐♦♥ ✐s ♦❢ ❝✉❜✐❝ ❝♦♠♣❧❡①✐t②✱ ✇❤✐❝❤ ❧✐♠✐ts t❤❡ s✐③❡ ♦❢ ♠❛tr✐❝❡s t❤❛t ✇❡ ❝❛♥ ♠✉❧t✐♣❧② ✐♥ r❡❛s♦♥❛❜❧❡ t✐♠❡✳ ❆♥ O ( n 2 . 81 ) ❛❧❣♦r✐t❤♠ ❡①✐sts✱ ❜✉t ✐t ✐s t♦♦ ❝♦♠♣❧✐❝❛t❡❞ t♦ ❜❡ ♦❢ ♠✉❝❤ ✉s❡✱ ❡✈❡♥ t❤♦✉❣❤ ✐t ✐s t❤❡♦r❡t✐❝❛❧❧② ❜❡tt❡r✳ ❆♥ ❡①♣♦♥❡♥t✐❛❧ ❣r♦✇t❤ r❛t❡ s✉❝❤ ❛s 2 n r❡str✐❝ts ✉s t♦ s♠❛❧❧ ✈❛❧✉❡s ♦❢ n ✳ ❆❧r❡❛❞② ✇✐t❤ n = 20 t❤❡ ❝♦st ❡①❝❡❡❞s ♦♥❡ ♠✐❧❧✐♦♥✳ ❍♦✇❡✈❡r✱ t❤❡ ✇♦rst ❝❛s❡ ♠✐❣❤t ♥♦t ❛r✐s❡ ✐♥ ♥♦r♠❛❧ ♣r❛❝t✐❝❡✳ ▼▲ t②♣❡✲❝❤❡❝❦✐♥❣ ✐s ❡①♣♦♥❡♥t✐❛❧ ✐♥ t❤❡ ✇♦rst ❝❛s❡✱ ❜✉t ♥♦t ❢♦r ♦r❞✐♥❛r② ♣r♦❣r❛♠s✳
■■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✸✶ Sample Costs in O Notation function time space npower , nsum O ( n ) O ( n ) Slide 307 summing O ( n ) O (1) n ( n + 1) / 2 O (1) O (1) power O (log n ) O (log n ) nthApprox O (2 n ) O ( n ) ❘❡❝❛❧❧ ✭▲❡❝t✳ ✷✮ t❤❛t ♥♣♦✇❡r ❝♦♠♣✉t❡s x n ❜② r❡♣❡❛t❡❞ ♠✉❧t✐♣❧✐❝❛t✐♦♥ ✇❤✐❧❡ ♥s✉♠ ♥❛ï✈❡❧② ❝♦♠♣✉t❡s t❤❡ s✉♠ 1 + · · · + n ✳ ❊❛❝❤ ♦❜✈✐♦✉s❧② ♣❡r❢♦r♠s O ( n ) ❛r✐t❤♠❡t✐❝ ♦♣❡r❛t✐♦♥s✳ ❇❡❝❛✉s❡ t❤❡② ❛r❡ ♥♦t t❛✐❧ r❡❝✉rs✐✈❡✱ t❤❡✐r ✉s❡ ♦❢ s♣❛❝❡ ✐s ❛❧s♦ O ( n ) ✳ ❚❤❡ ❢✉♥❝t✐♦♥ s✉♠♠✐♥❣ ✐s ❛ ✈❡rs✐♦♥ ♦❢ ♥s✉♠ ✇✐t❤ ❛♥ ❛❝❝✉✲ ♠✉❧❛t✐♥❣ ❛r❣✉♠❡♥t❀ ✐ts ✐t❡r❛t✐✈❡ ❜❡❤❛✈✐♦✉r ❧❡ts ✐t ✇♦r❦ ✐♥ ❝♦♥st❛♥t s♣❛❝❡✳ O ♥♦t❛t✐♦♥ s♣❛r❡s ✉s ❢r♦♠ ❤❛✈✐♥❣ t♦ s♣❡❝✐❢② t❤❡ ✉♥✐ts ✉s❡❞ t♦ ♠❡❛s✉r❡ s♣❛❝❡✳ ❊✈❡♥ ✐❣♥♦r✐♥❣ ❝♦♥st❛♥t ❢❛❝t♦rs✱ t❤❡ ✉♥✐ts ❝❤♦s❡♥ ❝❛♥ ✐♥✢✉❡♥❝❡ t❤❡ r❡s✉❧t✳ ▼✉❧t✐♣❧✐❝❛t✐♦♥ ♠❛② ❜❡ r❡❣❛r❞❡❞ ❛s ❛ s✐♥❣❧❡ ✉♥✐t ♦❢ ❝♦st✳ ❍♦✇❡✈❡r✱ t❤❡ ❝♦st ♦❢ ♠✉❧t✐♣❧②✐♥❣ t✇♦ n ✲❞✐❣✐t ♥✉♠❜❡rs ❢♦r ❧❛r❣❡ n ✐s ✐ts❡❧❢ ❛♥ ✐♠♣♦rt❛♥t q✉❡st✐♦♥✱ ❡s♣❡❝✐❛❧❧② ♥♦✇ t❤❛t ♣✉❜❧✐❝✲❦❡② ❝r②♣t♦❣r❛♣❤② ✉s❡s ♥✉♠❜❡rs ❤✉♥❞r❡❞s ♦❢ ❞✐❣✐ts ❧♦♥❣✳ ❋❡✇ t❤✐♥❣s ❝❛♥ r❡❛❧❧② ❜❡ ❞♦♥❡ ✐♥ ❝♦♥st❛♥t t✐♠❡ ♦r st♦r❡❞ ✐♥ ❝♦♥st❛♥t s♣❛❝❡✳ ▼❡r❡❧② t♦ st♦r❡ t❤❡ ♥✉♠❜❡r n r❡q✉✐r❡s O (log n ) ❜✐ts✳ ■❢ ❛ ♣r♦❣r❛♠ ❝♦st ✐s O (1) ✱ t❤❡♥ ✇❡ ❤❛✈❡ ♣r♦❜❛❜❧② ❛ss✉♠❡❞ t❤❛t ❝❡rt❛✐♥ ♦♣❡r❛t✐♦♥s ✐t ♣❡r❢♦r♠s ❛r❡ ❛❧s♦ O (1) ✖t②♣✐❝❛❧❧② ❜❡❝❛✉s❡ ✇❡ ❡①♣❡❝t ♥❡✈❡r t♦ ❡①❝❡❡❞ t❤❡ ❝❛♣❛❝✐t② ♦❢ t❤❡ st❛♥❞❛r❞ ❤❛r❞✇❛r❡ ❛r✐t❤♠❡t✐❝✳ ❲✐t❤ ♣♦✇❡r ✱ t❤❡ ♣r❡❝✐s❡ ♥✉♠❜❡r ♦❢ ♦♣❡r❛t✐♦♥s ❞❡♣❡♥❞s ✉♣♦♥ n ✐♥ ❛ ❝♦♠✲ ♣❧✐❝❛t❡❞ ✇❛②✱ ❞❡♣❡♥❞✐♥❣ ♦♥ ❤♦✇ ♠❛♥② ♦❞❞ ♥✉♠❜❡rs ❛r✐s❡✱ s♦ ✐t ✐s ❝♦♥✈❡♥✐❡♥t t❤❛t ✇❡ ❝❛♥ ❥✉st ✇r✐t❡ O (log n ) ✳ ❆♥ ❛❝❝✉♠✉❧❛t✐♥❣ ❛r❣✉♠❡♥t ❝♦✉❧❞ r❡❞✉❝❡ ✐ts s♣❛❝❡ ❝♦st t♦ O (1) ✳
■■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✸✷ Solving Simple Recurrence Relations T ( n ) : a cost we want to bound using O notation Typical base case : T (1) = 1 Slide 308 Some recurrences : T ( n + 1) = T ( n ) + 1 linear T ( n + 1) = T ( n ) + n quadratic T ( n ) = T ( n/ 2) + 1 logarithmic ❚♦ ❛♥❛❧②③❡ ❛ ❢✉♥❝t✐♦♥✱ ✐♥s♣❡❝t ✐ts ▼▲ ❞❡❝❧❛r❛t✐♦♥✳ ❘❡❝✉rr❡♥❝❡ ❡q✉❛t✐♦♥s ❢♦r t❤❡ ❝♦st ❢✉♥❝t✐♦♥ T ( n ) ❝❛♥ ✉s✉❛❧❧② ❜❡ r❡❛❞ ♦✛✳ ❙✐♥❝❡ ✇❡ ✐❣♥♦r❡ ❝♦♥st❛♥t ❢❛❝t♦rs✱ ✇❡ ❝❛♥ ❣✐✈❡ t❤❡ ❜❛s❡ ❝❛s❡ ❛ ❝♦st ♦❢ ♦♥❡ ✉♥✐t✳ ❈♦♥st❛♥t ✇♦r❦ ❞♦♥❡ ✐♥ t❤❡ r❡❝✉rs✐✈❡ st❡♣ ❝❛♥ ❛❧s♦ ❜❡ ❣✐✈❡♥ ✉♥✐t ❝♦st❀ s✐♥❝❡ ✇❡ ♦♥❧② ♥❡❡❞ ❛♥ ✉♣♣❡r ❜♦✉♥❞✱ t❤✐s ✉♥✐t r❡♣r❡s❡♥ts t❤❡ ❧❛r❣❡r ♦❢ t❤❡ t✇♦ ❛❝t✉❛❧ ❝♦sts✳ ❲❡ ❝♦✉❧❞ ✉s❡ ♦t❤❡r ❝♦♥st❛♥ts ✐❢ ✐t s✐♠♣❧✐✜❡s t❤❡ ❛❧❣❡❜r❛✳ ❋♦r ❡①❛♠♣❧❡✱ r❡❝❛❧❧ ♦✉r ❢✉♥❝t✐♦♥ ♥s✉♠ ✿ ❢✉♥ ♥s✉♠ ♥ ❂ ✐❢ ♥❂✵ t❤❡♥ ✵ ❡❧s❡ ♥ ✰ ♥s✉♠ ✭♥✲✶✮❀ ●✐✈❡♥ n + 1 ✱ ✐t ♣❡r❢♦r♠s ❛ ❝♦♥st❛♥t ❛♠♦✉♥t ♦❢ ✇♦r❦ ✭❛♥ ❛❞❞✐t✐♦♥ ❛♥❞ s✉❜✲ tr❛❝t✐♦♥✮ ❛♥❞ ❝❛❧❧s ✐ts❡❧❢ r❡❝✉rs✐✈❡❧② ✇✐t❤ ❛r❣✉♠❡♥t n ✳ ❲❡ ❣❡t t❤❡ r❡❝✉rr❡♥❝❡ ❡q✉❛t✐♦♥s T (0) = 1 ❛♥❞ T ( n + 1) = T ( n ) + 1 ✳ ❚❤❡ ❝❧♦s❡❞ ❢♦r♠ ✐s ❝❧❡❛r❧② T ( n ) = n + 1 ✱ ❛s ✇❡ ❝❛♥ ❡❛s✐❧② ✈❡r✐❢② ❜② s✉❜st✐t✉t✐♦♥✳ ❚❤❡ ❝♦st ✐s ❧✐♥❡❛r ✳ ❚❤✐s ❢✉♥❝t✐♦♥✱ ❣✐✈❡♥ n + 1 ✱ ❝❛❧❧s ♥s✉♠ ✱ ♣❡r❢♦r♠✐♥❣ O ( n ) ✇♦r❦✳ ❆❣❛✐♥ ✐❣♥♦r✐♥❣ ❝♦♥st❛♥t ❢❛❝t♦rs✱ ✇❡ ❝❛♥ s❛② t❤❛t t❤✐s ❝❛❧❧ t❛❦❡s ❡①❛❝t❧② n ✉♥✐ts✳ ❢✉♥ ♥s✉♠s✉♠ ♥ ❂ ✐❢ ♥❂✵ t❤❡♥ ✵ ❡❧s❡ ♥s✉♠ ♥ ✰ ♥s✉♠s✉♠ ✭♥✲✶✮❀ ❲❡ ❣❡t t❤❡ r❡❝✉rr❡♥❝❡ ❡q✉❛t✐♦♥s T (0) = 1 ❛♥❞ T ( n + 1) = T ( n ) + n ✳ ■t ✐s ❡❛s② t♦ s❡❡ t❤❛t T ( n ) = ( n − 1) + · · · + 1 = n ( n − 1) / 2 = O ( n 2 ) ✳ ❚❤❡ ❝♦st ✐s q✉❛❞r❛t✐❝ ✳ ❚❤❡ ❢✉♥❝t✐♦♥ ♣♦✇❡r ❞✐✈✐❞❡s ✐ts ✐♥♣✉t n ✐♥t♦ t✇♦✱ ✇✐t❤ t❤❡ r❡❝✉rr❡♥❝❡ ❡q✉❛t✐♦♥ T ( n ) = T ( n/ 2) + 1 ✳ ❈❧❡❛r❧② T (2 n ) = n + 1 ✱ s♦ T ( n ) = O (log n ) ✳
■■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✸✸ Recurrence for nthApprox : O (2 n ) T (0) = 1 T ( n + 1) = 2 T ( n ) + 1 Slide 309 Explicit solution: T ( n ) = 2 n +1 − 1 T ( n + 1) = 2 T ( n ) + 1 = 2(2 n +1 − 1) + 1 induction hypothesis = 2 n +2 − 1 ◆♦✇ ✇❡ ❛♥❛❧②③❡ t❤❡ ❢✉♥❝t✐♦♥ ♥t❤❆♣♣r♦① ❣✐✈❡♥ ❛t t❤❡ st❛rt ♦❢ t❤❡ ❧❡❝t✉r❡✳ ❚❤❡ t✇♦ r❡❝✉rs✐✈❡ ❝❛❧❧s ❛r❡ r❡✢❡❝t❡❞ ✐♥ t❤❡ t❡r♠ 2 T ( n ) ♦❢ t❤❡ r❡❝✉rr❡♥❝❡✳ ❆s ❢♦r t❤❡ ❝♦♥st❛♥t ❡✛♦rt✱ ❛❧t❤♦✉❣❤ t❤❡ r❡❝✉rs✐✈❡ ❝❛s❡ ❞♦❡s ♠♦r❡ ✇♦r❦ t❤❛♥ t❤❡ ❜❛s❡ ❝❛s❡✱ ✇❡ ❝❛♥ ❝❤♦♦s❡ ✉♥✐ts s✉❝❤ t❤❛t ❜♦t❤ ❝♦♥st❛♥ts ❛r❡ ♦♥❡✳ ✭❘❡♠❡♠❜❡r✱ ✇❡ s❡❡❦ ❛♥ ✉♣♣❡r ❜♦✉♥❞ r❛t❤❡r t❤❛♥ t❤❡ ❡①❛❝t ❝♦st✳✮ ●✐✈❡♥ t❤❡ r❡❝✉rr❡♥❝❡ ❡q✉❛t✐♦♥s ❢♦r T ( n ) ✱ ❧❡t ✉s s♦❧✈❡ t❤❡♠✳ ■t ❤❡❧♣s ✐❢ ✇❡ ❝❛♥ ❣✉❡ss t❤❡ ❝❧♦s❡❞ ❢♦r♠✱ ✇❤✐❝❤ ✐♥ t❤✐s ❝❛s❡ ♦❜✈✐♦✉s❧② ✐s s♦♠❡t❤✐♥❣ ❧✐❦❡ 2 n ✳ ❊✈❛❧✉❛t✐♥❣ T ( n ) ❢♦r n = 0 ✱ ✶✱ ✷✱ ✸✱ ✳ ✳ ✳ ✱ ✇❡ ❣❡t ✶✱ ✸✱ ✼✱ ✶✺✱ ✳ ✳ ✳ ✳ ❖❜✈✐♦✉s❧② T ( n ) = 2 n +1 − 1 ✱ ✇❤✐❝❤ ✇❡ ❝❛♥ ❡❛s✐❧② ♣r♦✈❡ ❜② ✐♥❞✉❝t✐♦♥ ♦♥ n ✳ ❲❡ ♠✉st ❝❤❡❝❦ t❤❡ ❜❛s❡ ❝❛s❡✿ T (0) = 2 1 − 1 = 1 ■♥ t❤❡ ✐♥❞✉❝t✐✈❡ st❡♣✱ ❢♦r T ( n + 1) ✱ ✇❡ ♠❛② ❛ss✉♠❡ ♦✉r ❡q✉❛t✐♦♥ ✐♥ ♦r❞❡r t♦ r❡♣❧❛❝❡ T ( n ) ❜② 2 n +1 − 1 ✳ ❚❤❡ r❡st ✐s ❡❛s②✳ ❲❡ ❤❛✈❡ ♣r♦✈❡❞ T ( n ) = O (2 n +1 − 1) ✱ ❜✉t ♦❜✈✐♦✉s❧② 2 n ✐s ❛❧s♦ ❛♥ ✉♣♣❡r ❜♦✉♥❞✿ ✇❡ ♠❛② ❝❤♦♦s❡ t❤❡ ❝♦♥st❛♥t ❢❛❝t♦r t♦ ❜❡ t✇♦✳ ❍❡♥❝❡ T ( n ) = O (2 n ) ✳ ❚❤❡ ♣r♦♦❢ ❛❜♦✈❡ ✐s r❛t❤❡r ✐♥❢♦r♠❛❧✳ ❚❤❡ ♦rt❤♦❞♦① ✇❛② ♦❢ ♣r♦✈✐♥❣ f ( n ) = O ( g ( n )) ✐s t♦ ❢♦❧❧♦✇ t❤❡ ❞❡✜♥✐t✐♦♥ ♦❢ O ♥♦t❛t✐♦♥✳ ❇✉t ❛♥ ✐♥❞✉❝t✐✈❡ ♣r♦♦❢ ♦❢ T ( n ) ≤ c 2 n ✱ ✉s✐♥❣ t❤❡ ❞❡✜♥✐t✐♦♥ ♦❢ T ( n ) ✱ r✉♥s ✐♥t♦ ❞✐✣❝✉❧t✐❡s✿ t❤✐s ❜♦✉♥❞ ✐s t♦♦ ❧♦♦s❡✳ ❚✐❣❤t❡♥✐♥❣ t❤❡ ❜♦✉♥❞ t♦ T ( n ) ≤ c 2 n − 1 ❧❡ts t❤❡ ♣r♦♦❢ ❣♦ t❤r♦✉❣❤✳ ❚r② t❤❡ ♣r♦♦❢ s✉❣❣❡st❡❞ ❛❜♦✈❡✳ ❲❤❛t ❞♦❡s ✐t s❛② ❛❜♦✉t c ❄ ❊①❡r❝✐s❡ ✸✳✷
■■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✸✹ An O ( n log n ) Recurrence T (1) = 0 T ( n ) = 2 T ( n/ 2) + n Slide 310 Proof that T ( n ) ≤ n lg n : T ( n ) ≤ 2( n/ 2) lg( n/ 2) + n = n (lg n − 1) + n = n lg n − n + n = n lg n ❚❤✐s r❡❝✉rr❡♥❝❡ ❡q✉❛t✐♦♥ ❛r✐s❡s ✇❤❡♥ ❛ ❢✉♥❝t✐♦♥ ❞✐✈✐❞❡s ✐ts ✐♥♣✉t ✐♥t♦ t✇♦ ❡q✉❛❧ ♣❛rts✱ ❞♦❡s O ( n ) ✇♦r❦ ❛♥❞ ❛❧s♦ ❝❛❧❧s ✐ts❡❧❢ r❡❝✉rs✐✈❡❧② ♦♥ ❡❛❝❤✳ ❙✉❝❤ ❜❛❧❛♥❝✐♥❣ ✐s ❜❡♥❡✜❝✐❛❧✳ ■♥st❡❛❞ ❞✐✈✐❞✐♥❣ t❤❡ ✐♥♣✉t ✐♥t♦ ✉♥❡q✉❛❧ ♣❛rts ♦❢ s✐③❡s ✶ ❛♥❞ n − 1 ❣✐✈❡s t❤❡ r❡❝✉rr❡♥❝❡ T ( n + 1) = T ( n ) + n ✱ ✇❤✐❝❤ ❤❛s q✉❛❞r❛t✐❝ ❝♦♠♣❧❡①✐t②✳ ❙❤♦✇♥ ♦♥ t❤❡ s❧✐❞❡ ✐s t❤❡ r❡s✉❧t ♦❢ s✉❜st✐t✉t✐♥❣ t❤❡ ❝❧♦s❡❞ ❢♦r♠ T ( n ) = cn lg n ✐♥t♦ t❤❡ ♦r✐❣✐♥❛❧ ❡q✉❛t✐♦♥s✳ ❚❤✐s ✐s ❛♥♦t❤❡r ♣r♦♦❢ ❜② ✐♥❞✉❝t✐♦♥✳ ❚❤❡ ❧❛st st❡♣ ❤♦❧❞s ♣r♦✈✐❞❡❞ c ≥ 1 ✳ ❙♦♠❡t❤✐♥❣ ✐s ✇r♦♥❣✱ ❤♦✇❡✈❡r✳ ❚❤❡ ❜❛s❡ ❝❛s❡ ❢❛✐❧s✿ ✐❢ n = 1 t❤❡♥ cn lg n = 0 ✱ ✇❤✐❝❤ ✐s ♥♦t ❛♥ ✉♣♣❡r ❜♦✉♥❞ ❢♦r T (1) ✳ ❲❡ ❝♦✉❧❞ ❧♦♦❦ ❢♦r ❛ ♣r❡❝✐s❡ ❝❧♦s❡❞ ❢♦r♠ ❢♦r T ( n ) ✱ ❜✉t ✐t ✐s s✐♠♣❧❡r t♦ r❡❝❛❧❧ t❤❛t O ♥♦t❛t✐♦♥ ❧❡ts ✉s ✐❣♥♦r❡ ❛ ✜♥✐t❡ ♥✉♠❜❡r ♦❢ ❛✇❦✇❛r❞ ❝❛s❡s✳ ❈❤♦♦s✐♥❣ n = 2 ❛♥❞ n = 3 ❛s ❜❛s❡ ❝❛s❡s ❡❧✐♠✐♥❛t❡s n = 1 ❡♥t✐r❡❧② ❢r♦♠ ❝♦♥s✐❞❡r❛t✐♦♥✳ ❚❤❡ ❝♦♥str❛✐♥ts T (2) ≤ 2 c lg 2 ❛♥❞ T (3) ≤ 3 c lg 3 ❝❛♥ ❜❡ s❛t✐s✜❡❞ ❢♦r c ≥ 2 ✳ ❙♦ T ( n ) = O ( n log n ) ✳ ■♥❝✐❞❡♥t❛❧❧②✱ ✐♥ t❤❡s❡ r❡❝✉rr❡♥❝❡s n/ 2 st❛♥❞s ❢♦r ✐♥t❡❣❡r ❞✐✈✐s✐♦♥✳ ❚♦ ❜❡ ♣r❡❝✐s❡✱ ✇❡ s❤♦✉❧❞ ✐♥❞✐❝❛t❡ tr✉♥❝❛t✐♦♥ t♦ t❤❡ ♥❡①t s♠❛❧❧❡r ✐♥t❡❣❡r ❜② ✇r✐t✐♥❣ ⌊ n/ 2 ⌋ ✳ ❖♥❡✲❤❛❧❢ ♦❢ ❛♥ ♦❞❞ ♥✉♠❜❡r ✐s ❣✐✈❡♥ ❜② ⌊ (2 n +1) / 2 ⌋ = n ✳ ❋♦r ❡①❛♠♣❧❡✱ ⌊ 2 . 9 ⌋ = 2 ✱ ❛♥❞ ⌊ n ⌋ = n ✐❢ n ✐s ❛♥ ✐♥t❡❣❡r✳
■■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✸✺ ❋♦r ❛ ❞❡❡♣❡r tr❡❛t♠❡♥t ♦❢ ❝♦♠♣❧❡①✐t②✱ ②♦✉ ♠✐❣❤t ❧♦♦❦ ❛t ▲❡❛r♥✐♥❣ ❣✉✐❞❡✳ ❈❤❛♣t❡r ✷ ♦❢ ■♥tr♦❞✉❝t✐♦♥ t♦ ❆❧❣♦r✐t❤♠s ❬✺❪✳ ❋✐♥❞ ❛♥ ✉♣♣❡r ❜♦✉♥❞ ❢♦r t❤❡ r❡❝✉rr❡♥❝❡ ❣✐✈❡♥ ❜② T (1) = 1 ❊①❡r❝✐s❡ ✸✳✸ ❛♥❞ T ( n ) = 2 T ( n/ 2) + 1 ✳ ❨♦✉ s❤♦✉❧❞ ❜❡ ❛❜❧❡ t♦ ✜♥❞ ❛ t✐❣❤t❡r ❜♦✉♥❞ t❤❛♥ O ( n log n ) ✳ Pr♦✈❡ t❤❛t t❤❡ r❡❝✉rr❡♥❝❡ ❊①❡r❝✐s❡ ✸✳✹ � ✐❢ 1 ≤ n < 4 1 T ( n ) = ✐❢ n ≥ 4 T ( ⌈ n/ 4 ⌉ ) + T ( ⌊ 3 n/ 4 ⌋ ) + n ✐s O ( n log n ) ✳ ❚❤❡ ♥♦t❛t✐♦♥ ⌈ x ⌉ ♠❡❛♥s tr✉♥❝❛t✐♦♥ t♦ t❤❡ ♥❡①t ❧❛r❣❡r ✐♥t❡❣❡r❀ ❢♦r ❡①❛♠♣❧❡✱ ⌈ 3 . 1 ⌉ = 4 ✳
■❱ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✸✻ Lists [3,5,9]; > [3, 5, 9] : int list Slide 401 it @ [2,10]; > [3, 5, 9, 2, 10] : int list rev [(1,"one"), (2,"two")]; > [(2, "two"), (1, "one")] : (int * string) list ❆ ❧✐st ✐s ❛♥ ♦r❞❡r❡❞ s❡r✐❡s ♦❢ ❡❧❡♠❡♥ts❀ r❡♣❡t✐t✐♦♥s ❛r❡ s✐❣♥✐✜❝❛♥t✳ ❙♦ ❬✸✱✺✱✾❪ ❞✐✛❡rs ❢r♦♠ ❬✺✱✸✱✾❪ ❛♥❞ ❢r♦♠ ❬✸✱✸✱✺✱✾❪✳ ❆❧❧ ❡❧❡♠❡♥ts ♦❢ ❛ ❧✐st ♠✉st ❤❛✈❡ t❤❡ s❛♠❡ t②♣❡✳ ❆❜♦✈❡ ✇❡ s❡❡ ❛ ❧✐st ♦❢ ✐♥t❡❣❡rs ❛♥❞ ❛ ❧✐st ♦❢ ✭✐♥t❡❣❡r✱ str✐♥❣✮ ♣❛✐rs✳ ❖♥❡ ❝❛♥ ❛❧s♦ ❤❛✈❡ ❧✐sts ♦❢ ❧✐sts✱ s✉❝❤ ❛s ❬❬✸❪✱ ❬❪✱ ❬✺✱✻❪❪✱ ✇❤✐❝❤ ❤❛s t②♣❡ ✐♥t ❧✐st ❧✐st ✳ ■♥ t❤❡ ❣❡♥❡r❛❧ ❝❛s❡✱ ✐❢ x 1 ✱ ✳ ✳ ✳ ✱ x n ❛❧❧ ❤❛✈❡ t❤❡ s❛♠❡ t②♣❡ ✭s❛② τ ✮ t❤❡♥ t❤❡ ❧✐st [ x 1 , . . . , x n ] ❤❛s t②♣❡ ( τ ) list ✳ ▲✐sts ❛r❡ t❤❡ s✐♠♣❧❡st ❞❛t❛ str✉❝t✉r❡ t❤❛t ❝❛♥ ❜❡ ✉s❡❞ t♦ ♣r♦❝❡ss ❝♦❧✲ ❧❡❝t✐♦♥s ♦❢ ✐t❡♠s✳ ❈♦♥✈❡♥t✐♦♥❛❧ ❧❛♥❣✉❛❣❡s ✉s❡ ❛rr❛②s ✱ ✇❤♦s❡ ❡❧❡♠❡♥ts ❛r❡ ❛❝❝❡ss❡❞ ✉s✐♥❣ s✉❜s❝r✐♣t✐♥❣✿ ❢♦r ❡①❛♠♣❧❡✱ A [ i ] ②✐❡❧❞s t❤❡ i t❤ ❡❧❡♠❡♥t ♦❢ t❤❡ ❛rr❛② A ✳ ❙✉❜s❝r✐♣t✐♥❣ ❡rr♦rs ❛r❡ ❛ ❦♥♦✇♥ ❝❛✉s❡ ♦❢ ♣r♦❣r❛♠♠❡r ❣r✐❡❢✱ ❤♦✇✲ ❡✈❡r✱ s♦ ❛rr❛②s s❤♦✉❧❞ ❜❡ r❡♣❧❛❝❡❞ ❜② ❤✐❣❤❡r✲❧❡✈❡❧ ❞❛t❛ str✉❝t✉r❡s ✇❤❡♥❡✈❡r ♣♦ss✐❜❧❡✳ ❚❤❡ ✐♥✜① ♦♣❡r❛t♦r ❅ ✱ ❝❛❧❧❡❞ ❛♣♣❡♥❞ ✱ ❝♦♥❝❛t❡♥❛t❡s t✇♦ ❧✐sts✳ ❆❧s♦ ❜✉✐❧t✲✐♥ ✐s r❡✈ ✱ ✇❤✐❝❤ r❡✈❡rs❡s ❛ ❧✐st✳ ❚❤❡s❡ ❛r❡ ❞❡♠♦♥str❛t❡❞ ✐♥ t❤❡ s❡ss✐♦♥ ❛❜♦✈❡✳
■❱ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✸✼ The List Primitives The two kinds of list nil or [] is the empty list x :: l is the list with head x and tail l Slide 402 List notation [ x 1 , x 2 , . . . , x n ] ≡ x 1 :: ( x 2 :: · · · ( x n :: nil )) � �� � tail head ❚❤❡ ♦♣❡r❛t♦r ✿✿✱ ❝❛❧❧❡❞ ❝♦♥s ✭❢♦r ❵❝♦♥str✉❝t✬✮✱ ♣✉ts ❛ ♥❡✇ ❡❧❡♠❡♥t ♦♥ t♦ t❤❡ ❤❡❛❞ ♦❢ ❛♥ ❡①✐st✐♥❣ ❧✐st✳ ❲❤✐❧❡ ✇❡ s❤♦✉❧❞ ♥♦t ❜❡ t♦♦ ♣r❡♦❝❝✉♣✐❡❞ ✇✐t❤ ✐♠♣❧❡♠❡♥t❛t✐♦♥ ❞❡t❛✐❧s✱ ✐t ✐s ❡ss❡♥t✐❛❧ t♦ ❦♥♦✇ t❤❛t ✿✿ ✐s ❛♥ O (1) ♦♣❡r❛t✐♦♥✳ ■t ✉s❡s ❝♦♥st❛♥t t✐♠❡ ❛♥❞ s♣❛❝❡✱ r❡❣❛r❞❧❡ss ♦❢ t❤❡ ❧❡♥❣t❤ ♦❢ t❤❡ r❡s✉❧t✐♥❣ ❧✐st✳ ▲✐sts ❛r❡ r❡♣r❡s❡♥t❡❞ ✐♥t❡r♥❛❧❧② ✇✐t❤ ❛ ❧✐♥❦❡❞ str✉❝t✉r❡❀ ❛❞❞✐♥❣ ❛ ♥❡✇ ❡❧❡♠❡♥t t♦ ❛ ❧✐st ♠❡r❡❧② ❤♦♦❦s t❤❡ ♥❡✇ ❡❧❡♠❡♥t t♦ t❤❡ ❢r♦♥t ♦❢ t❤❡ ❡①✐st✐♥❣ str✉❝t✉r❡✳ ▼♦r❡♦✈❡r✱ t❤❛t str✉❝t✉r❡ ❝♦♥t✐♥✉❡s t♦ ❞❡♥♦t❡ t❤❡ s❛♠❡ ❧✐st ❛s ✐t ❞✐❞ ❜❡❢♦r❡❀ t♦ s❡❡ t❤❡ ♥❡✇ ❧✐st✱ ♦♥❡ ♠✉st ❧♦♦❦ ❛t t❤❡ ♥❡✇ ✿✿ ♥♦❞❡ ✭♦r ❝♦♥s ❝❡❧❧ ✮ ❥✉st ❝r❡❛t❡❞✳ ❍❡r❡ ✇❡ s❡❡ t❤❡ ❡❧❡♠❡♥t ✶ ❜❡✐♥❣ ❝♦♥s❡❞ t♦ t❤❡ ❢r♦♥t ♦❢ t❤❡ ❧✐st ❬✸✱✺✱✾❪✿ :: → · · · :: → :: → :: → nil ↓ ↓ ↓ ↓ 1 3 5 9 ●✐✈❡♥ ❛ ❧✐st✱ t❛❦✐♥❣ ✐ts ✜rst ❡❧❡♠❡♥t ✭✐ts ❤❡❛❞ ✮ ♦r ✐ts ❧✐st ♦❢ r❡♠❛✐♥✐♥❣ ❡❧❡♠❡♥ts ✭✐ts t❛✐❧ ✮ ❛❧s♦ t❛❦❡s ❝♦♥st❛♥t t✐♠❡✳ ❊❛❝❤ ♦♣❡r❛t✐♦♥ ❥✉st ❢♦❧❧♦✇s ❛ ❧✐♥❦✳ ■♥ t❤❡ ❞✐❛❣r❛♠ ❛❜♦✈❡✱ t❤❡ ✜rst ↓ ❛rr♦✇ ❧❡❛❞s t♦ t❤❡ ❤❡❛❞ ❛♥❞ t❤❡ ❧❡❢t♠♦st → ❛rr♦✇ ❧❡❛❞s t♦ t❤❡ t❛✐❧✳ ❖♥❝❡ ✇❡ ❤❛✈❡ t❤❡ t❛✐❧✱ ✐ts ❤❡❛❞ ✐s t❤❡ s❡❝♦♥❞ ❡❧❡♠❡♥t ♦❢ t❤❡ ♦r✐❣✐♥❛❧ ❧✐st✱ ❡t❝✳ ❚❤❡ t❛✐❧ ✐s ♥♦t t❤❡ ❧❛st ❡❧❡♠❡♥t❀ ✐t ✐s t❤❡ ❧✐st ♦❢ ❛❧❧ ❡❧❡♠❡♥ts ♦t❤❡r t❤❛♥ t❤❡ ❤❡❛❞✦
■❱ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✸✽ Getting at the Head and Tail fun null [] = true | null (x::l) = false; > val null = fn : ’a list -> bool Slide 403 fun hd (x::l) = x; > Warning: pattern matching is not exhaustive > val hd = fn : ’a list -> ’a tl [7,6,5]; > val it = [6, 5] : int list ❚❤❡r❡ ❛r❡ t❤r❡❡ ❜❛s✐❝ ❢✉♥❝t✐♦♥s ❢♦r ✐♥s♣❡❝t✐♥❣ ❧✐sts✳ ◆♦t❡ t❤❡✐r ♣♦❧②♠♦r✲ ♣❤✐❝ t②♣❡s✦ ♥✉❧❧ ✿ ✬❛ ❧✐st ✲❃ ❜♦♦❧ ✐s ❛ ❧✐st ❡♠♣t②❄ ❤❞ ✿ ✬❛ ❧✐st ✲❃ ✬❛ ❤❡❛❞ ♦❢ ❛ ♥♦♥✲❡♠♣t② ❧✐st t❧ ✿ ✬❛ ❧✐st ✲❃ ✬❛ ❧✐st t❛✐❧ ♦❢ ❛ ♥♦♥✲❡♠♣t② ❧✐st ❚❤❡ ❡♠♣t② ❧✐st ❤❛s ♥❡✐t❤❡r ❤❡❛❞ ♥♦r t❛✐❧✳ ❆♣♣❧②✐♥❣ ❡✐t❤❡r ♦♣❡r❛t✐♦♥ t♦ ♥✐❧ ✐s ❛♥ ❡rr♦r✖str✐❝t❧② s♣❡❛❦✐♥❣✱ ❛♥ ❡①❝❡♣t✐♦♥ ✳ ❚❤❡ ❢✉♥❝t✐♦♥ ♥✉❧❧ ❝❛♥ ❜❡ ✉s❡❞ t♦ ❝❤❡❝❦ ❢♦r t❤❡ ❡♠♣t② ❧✐st ❜❡❢♦r❡ ❛♣♣❧②✐♥❣ ❤❞ ♦r t❧ ✳ ❚♦ ❧♦♦❦ ❞❡❡♣ ✐♥s✐❞❡ ❛ ❧✐st ♦♥❡ ❝❛♥ ❛♣♣❧② ❝♦♠❜✐♥❛t✐♦♥s ♦❢ t❤❡s❡ ❢✉♥❝t✐♦♥s✱ ❜✉t t❤✐s st②❧❡ ✐s ❤❛r❞ t♦ r❡❛❞✳ ❋♦rt✉♥❛t❡❧②✱ ✐t ✐s s❡❧❞♦♠ ♥❡❝❡ss❛r② ❜❡❝❛✉s❡ ♦❢ ♣❛tt❡r♥✲♠❛t❝❤✐♥❣ ✳ ❚❤❡ ❞❡❝❧❛r❛t✐♦♥ ♦❢ ♥✉❧❧ ❛❜♦✈❡ ❤❛s t✇♦ ❝❧❛✉s❡s✿ ♦♥❡ ❢♦r t❤❡ ❡♠♣t② ❧✐st ✭❢♦r ✇❤✐❝❤ ✐t r❡t✉r♥s tr✉❡ ✮ ❛♥❞ ♦♥❡ ❢♦r ♥♦♥✲❡♠♣t② ❧✐sts ✭❢♦r ✇❤✐❝❤ ✐t r❡t✉r♥s ❢❛❧s❡ ✮✳ ❚❤❡ ❞❡❝❧❛r❛t✐♦♥ ♦❢ ❤❞ ❛❜♦✈❡ ❤❛s ♦♥❧② ♦♥❡ ❝❧❛✉s❡✱ ❢♦r ♥♦♥✲❡♠♣t② ❧✐sts✳ ❚❤❡② ❤❛✈❡ t❤❡ ❢♦r♠ ①✿✿❧ ❛♥❞ t❤❡ ❢✉♥❝t✐♦♥ r❡t✉r♥s ① ✱ ✇❤✐❝❤ ✐s t❤❡ ❤❡❛❞✳ ▼▲ ♣r✐♥ts ❛ ✇❛r♥✐♥❣ t♦ t❡❧❧ ✉s t❤❛t ❝❛❧❧✐♥❣ t❤❡ ❢✉♥❝t✐♦♥ ❝♦✉❧❞ r❛✐s❡ ❡①❝❡♣t✐♦♥ ▼❛t❝❤ ✱ ✇❤✐❝❤ ✐♥❞✐❝❛t❡s ❢❛✐❧✉r❡ ♦❢ ♣❛tt❡r♥✲♠❛t❝❤✐♥❣✳ ❚❤❡ ❞❡❝❧❛r❛t✐♦♥ ♦❢ t❧ ✐s ♦♠✐tt❡❞ ❜❡❝❛✉s❡ ✐t ✐s s✐♠✐❧❛r t♦ ❤❞ ✳ ■♥st❡❛❞✱ t❤❡r❡ ✐s ❛♥ ❡①❛♠♣❧❡ ♦❢ ❛♣♣❧②✐♥❣ t❧ ✳
■❱ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✸✾ Computing the Length of a List fun nlength [] = 0 | nlength (x::xs) = 1 + nlength xs; > val nlength = fn: ’a list -> int Slide 404 nlength [ a, b, c ] ⇒ 1 + nlength [ b, c ] ⇒ 1 + (1 + nlength [ c ]) ⇒ 1 + (1 + (1 + nlength [])) ⇒ 1 + (1 + (1 + 0)) ⇒ . . . ⇒ 3 ▼♦st ❧✐st ♣r♦❝❡ss✐♥❣ ✐♥✈♦❧✈❡s r❡❝✉rs✐♦♥✳ ❚❤✐s ✐s ❛ s✐♠♣❧❡ ❡①❛♠♣❧❡❀ ♣❛tt❡r♥s ❝❛♥ ❜❡ ♠♦r❡ ❝♦♠♣❧❡①✳ ❖❜s❡r✈❡ t❤❡ ✉s❡ ♦❢ ❛ ✈❡rt✐❝❛❧ ❜❛r ✭ ⑤ ✮ t♦ s❡♣❛r❛t❡ t❤❡ ❢✉♥❝t✐♦♥✬s ❝❧❛✉s❡s✳ ❲❡ ❤❛✈❡ ♦♥❡ ❢✉♥❝t✐♦♥ ❞❡❝❧❛r❛t✐♦♥ t❤❛t ❤❛♥❞❧❡s t✇♦ ❝❛s❡s✳ ❚♦ ✉♥❞❡rst❛♥❞ ✐ts r♦❧❡✱ ❝♦♥s✐❞❡r t❤❡ ❢♦❧❧♦✇✐♥❣ ❢❛✉❧t② ❝♦❞❡✿ ❢✉♥ ♥❧❡♥❣t❤ ❬❪ ❂ ✵❀ ❃ ❲❛r♥✐♥❣✿ ♣❛tt❡r♥ ♠❛t❝❤✐♥❣ ✐s ♥♦t ❡①❤❛✉st✐✈❡ ❃ ✈❛❧ ♥❧❡♥❣t❤ ❂ ❢♥✿ ✬❛ ❧✐st ✲❃ ✐♥t ❢✉♥ ♥❧❡♥❣t❤ ✭①✿✿①s✮ ❂ ✶ ✰ ♥❧❡♥❣t❤ ①s❀ ❃ ❲❛r♥✐♥❣✿ ♣❛tt❡r♥ ♠❛t❝❤✐♥❣ ✐s ♥♦t ❡①❤❛✉st✐✈❡ ❃ ✈❛❧ ♥❧❡♥❣t❤ ❂ ❢♥✿ ✬❛ ❧✐st ✲❃ ✐♥t ❚❤❡s❡ ❛r❡ t✇♦ ❞❡❝❧❛r❛t✐♦♥s✱ ♥♦t ♦♥❡✳ ❋✐rst ✇❡ ❞❡❝❧❛r❡ ♥❧❡♥❣t❤ t♦ ❜❡ ❛ ❢✉♥❝✲ t✐♦♥ t❤❛t ❤❛♥❞❧❡s ♦♥❧② ❡♠♣t② ❧✐sts✳ ❚❤❡♥ ✇❡ r❡❞❡❝❧❛r❡ ✐t t♦ ❜❡ ❛ ❢✉♥❝t✐♦♥ t❤❛t ❤❛♥❞❧❡s ♦♥❧② ♥♦♥✲❡♠♣t② ❧✐sts❀ ✐t ❝❛♥ ♥❡✈❡r ❞❡❧✐✈❡r ❛ r❡s✉❧t✳ ❲❡ s❡❡ t❤❛t ❛ s❡❝♦♥❞ ❢✉♥ ❞❡❝❧❛r❛t✐♦♥ r❡♣❧❛❝❡s ❛♥② ♣r❡✈✐♦✉s ♦♥❡ r❛t❤❡r t❤❛♥ ❡①t❡♥❞✐♥❣ ✐t t♦ ❝♦✈❡r ♥❡✇ ❝❛s❡s✳ ◆♦✇✱ ❧❡t ✉s r❡t✉r♥ t♦ t❤❡ ❞❡❝❧❛r❛t✐♦♥ s❤♦✇♥ ♦♥ t❤❡ s❧✐❞❡✳ ❚❤❡ ❧❡♥❣t❤ ❢✉♥❝t✐♦♥ ✐s ♣♦❧②♠♦r♣❤✐❝ ✿ ✐t ❛♣♣❧✐❡s t♦ ❛❧❧ ❧✐sts r❡❣❛r❞❧❡ss ♦❢ ❡❧❡♠❡♥t t②♣❡✦ ▼♦st ♣r♦❣r❛♠♠✐♥❣ ❧❛♥❣✉❛❣❡s ❧❛❝❦ s✉❝❤ ✢❡①✐❜✐❧✐t②✳ ❯♥❢♦rt✉♥❛t❡❧②✱ t❤✐s ❧❡♥❣t❤ ❝♦♠♣✉t❛t✐♦♥ ✐s ♥❛ï✈❡ ❛♥❞ ✇❛st❡❢✉❧✳ ▲✐❦❡ ♥s✉♠ ✐♥ ▲❡❝t✳ ✷✱ ✐t ✐s ♥♦t t❛✐❧✲r❡❝✉rs✐✈❡✳ ■t ✉s❡s O ( n ) s♣❛❝❡✱ ✇❤❡r❡ n ✐s t❤❡ ❧❡♥❣t❤ ♦❢ ✐ts ✐♥♣✉t✳ ❆s ✉s✉❛❧✱ t❤❡ s♦❧✉t✐♦♥ ✐s t♦ ❛❞❞ ❛♥ ❛❝❝✉♠✉❧❛t✐♥❣ ❛r❣✉♠❡♥t✳
■❱ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✹✵ Efficiently Computing the Length of a List fun addlen (n, [ ]) = n | addlen (n, x::xs) = addlen (n+1, xs); > val addlen = fn: int * ’a list -> int Slide 405 addlen (0 , [ a, b, c ]) ⇒ addlen (1 , [ b, c ]) ⇒ addlen (2 , [ c ]) ⇒ addlen (3 , []) ⇒ 3 P❛tt❡r♥s ❝❛♥ ❜❡ ❛s ❝♦♠♣❧✐❝❛t❡❞ ❛s ✇❡ ❧✐❦❡✳ ❍❡r❡✱ t❤❡ t✇♦ ♣❛tt❡r♥s ❛r❡ ✭♥✱❬❪✮ ❛♥❞ ✭♥✱①✿✿①s✮ ✳ ❋✉♥❝t✐♦♥ ❛❞❞❧❡♥ ✐s ❛❣❛✐♥ ♣♦❧②♠♦r♣❤✐❝✳ ■ts t②♣❡ ♠❡♥t✐♦♥s t❤❡ ✐♥t❡❣❡r ❛❝❝✉♠✉❧❛t♦r✳ ◆♦✇ ✇❡ ♠❛② ❞❡❝❧❛r❡ ❛♥ ❡✣❝✐❡♥t ❧❡♥❣t❤ ❢✉♥❝t✐♦♥✳ ■t ✐s s✐♠♣❧② ❛ ✇r❛♣♣❡r ❢♦r ❛❞❞❧❡♥ ✱ s✉♣♣❧②✐♥❣ ③❡r♦ ❛s t❤❡ ✐♥✐t✐❛❧ ✈❛❧✉❡ ♦❢ ♥ ✳ ❢✉♥ ❧❡♥❣t❤ ①s ❂ ❛❞❞❧❡♥✭✵✱①s✮❀ ❃ ✈❛❧ ❧❡♥❣t❤ ❂ ❢♥ ✿ ✬❛ ❧✐st ✲❃ ✐♥t ❚❤❡ r❡❝✉rs✐✈❡ ❝❛❧❧s ❞♦ ♥♦t ♥❡st✿ t❤✐s ✈❡rs✐♦♥ ✐s ✐t❡r❛t✐✈❡✳ ■t t❛❦❡s O (1) s♣❛❝❡✳ ❖❜✈✐♦✉s❧② ✐ts t✐♠❡ r❡q✉✐r❡♠❡♥t ✐s O ( n ) ❜❡❝❛✉s❡ ✐t t❛❦❡s ❛t ❧❡❛st n st❡♣s t♦ ✜♥❞ t❤❡ ❧❡♥❣t❤ ♦❢ ❛♥ n ✲❡❧❡♠❡♥t ❧✐st✳
■❱ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✹✶ Append: List Concatenation fun append([], ys) = ys | append(x::xs, ys) = x :: append(xs,ys); > val append = fn: ’a list * ’a list -> ’a list Slide 406 append ([1 , 2 , 3] , [4]) ⇒ 1 :: append ([2 , 3] , [4]) ⇒ 1 :: (2 :: append ([3] , [4])) ⇒ 1 :: (2 :: (3 :: append ([] , [4]))) ⇒ 1 :: (2 :: (3 :: [4])) ⇒ [1 , 2 , 3 , 4] ❍❡r❡ ✐s ❤♦✇ ❛♣♣❡♥❞ ♠✐❣❤t ❜❡ ❞❡❝❧❛r❡❞✱ ✐❣♥♦r✐♥❣ t❤❡ ❞❡t❛✐❧s ♦❢ ❤♦✇ ❅ ✐s ♠❛❞❡ ❛♥ ✐♥✜① ♦♣❡r❛t♦r✳ ❚❤✐s ❢✉♥❝t✐♦♥ ✐s ❛❧s♦ ♥♦t ✐t❡r❛t✐✈❡✳ ■t s❝❛♥s ✐ts ✜rst ❛r❣✉♠❡♥t✱ s❡ts ✉♣ ❛ str✐♥❣ ♦❢ ❵❝♦♥s✬ ♦♣❡r❛t✐♦♥s ✭ ✿✿ ✮ ❛♥❞ ✜♥❛❧❧② ❞♦❡s t❤❡♠✳ ■t ✉s❡s O ( n ) s♣❛❝❡ ❛♥❞ t✐♠❡✱ ✇❤❡r❡ n ✐s t❤❡ ❧❡♥❣t❤ ♦❢ ✐ts ✜rst ❛r❣✉♠❡♥t✳ ■ts ❝♦sts ❛r❡ ✐♥❞❡♣❡♥❞❡♥t ♦❢ ✐ts s❡❝♦♥❞ ❛r❣✉♠❡♥t✳ ❆♥ ❛❝❝✉♠✉❧❛t✐♥❣ ❛r❣✉♠❡♥t ❝♦✉❧❞ ♠❛❦❡ ✐t ✐t❡r❛t✐✈❡✱ ❜✉t ✇✐t❤ ❝♦♥s✐❞❡r✲ ❛❜❧❡ ❝♦♠♣❧✐❝❛t✐♦♥✳ ❚❤❡ ✐t❡r❛t✐✈❡ ✈❡rs✐♦♥ ✇♦✉❧❞ st✐❧❧ r❡q✉✐r❡ O ( n ) s♣❛❝❡ ❛♥❞ t✐♠❡ ❜❡❝❛✉s❡ ❝♦♥❝❛t❡♥❛t✐♦♥ r❡q✉✐r❡s ❝♦♣②✐♥❣ ❛❧❧ t❤❡ ❡❧❡♠❡♥ts ♦❢ t❤❡ ✜rst ❧✐st✳ ❚❤❡r❡❢♦r❡✱ ✇❡ ❝❛♥♥♦t ❤♦♣❡ ❢♦r ❛s②♠♣t♦t✐❝ ❣❛✐♥s❀ ❛t ❜❡st ✇❡ ❝❛♥ ❞❡❝r❡❛s❡ t❤❡ ❝♦♥st❛♥t ❢❛❝t♦r ✐♥✈♦❧✈❡❞ ✐♥ O ( n ) ✱ ❜✉t ❝♦♠♣❧✐❝❛t✐♥❣ t❤❡ ❝♦❞❡ ✐s ❧✐❦❡❧② t♦ ✐♥❝r❡❛s❡ t❤❛t ❢❛❝t♦r✳ ◆❡✈❡r ❛❞❞ ❛♥ ❛❝❝✉♠✉❧❛t♦r ♠❡r❡❧② ♦✉t ♦❢ ❤❛❜✐t✳ ◆♦t❡ ❛♣♣❡♥❞✬s ♣♦❧②♠♦r♣❤✐❝ t②♣❡✳ ❚✇♦ ❧✐sts ❝❛♥ ❜❡ ❥♦✐♥❡❞ ✐❢ t❤❡✐r ❡❧❡♠❡♥t t②♣❡s ❛❣r❡❡✳
■❱ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✹✷ Reversing a List in O ( n 2 ) fun nrev [] = [] | nrev(x::xs) = (nrev xs) @ [x]; > val nrev = fn: ’a list -> ’a list Slide 407 nrev [ a, b, c ] ⇒ nrev [ b, c ] @ [ a ] ⇒ ( nrev [ c ] @ [ b ]) @ [ a ] ⇒ (( nrev [] @ [ c ]) @ [ b ]) @ [ a ] ⇒ (([] @ [ c ]) @ [ b ]) @ [ a ] ⇒ . . . ⇒ [ c, b, a ] ❚❤✐s r❡✈❡rs❡ ❢✉♥❝t✐♦♥ ✐s ❣r♦ss❧② ✐♥❡✣❝✐❡♥t ❞✉❡ t♦ ♣♦♦r ✉s❛❣❡ ♦❢ ❛♣♣❡♥❞✱ ✇❤✐❝❤ ❝♦♣✐❡s ✐ts ✜rst ❛r❣✉♠❡♥t✳ ■❢ ♥r❡✈ ✐s ❣✐✈❡♥ ❛ ❧✐st ♦❢ ❧❡♥❣t❤ n > 0 ✱ t❤❡♥ ❛♣♣❡♥❞ ♠❛❦❡s n − 1 ❝♦♥s❡s t♦ ❝♦♣② t❤❡ r❡✈❡rs❡❞ t❛✐❧✳ ❈♦♥str✉❝t✐♥❣ t❤❡ ❧✐st ❬①❪ ❝❛❧❧s ❝♦♥s ❛❣❛✐♥✱ ❢♦r ❛ t♦t❛❧ ♦❢ n ❝❛❧❧s✳ ❘❡✈❡rs✐♥❣ t❤❡ t❛✐❧ r❡q✉✐r❡s n − 1 ♠♦r❡ ❝♦♥s❡s✱ ❛♥❞ s♦ ❢♦rt❤✳ ❚❤❡ t♦t❛❧ ♥✉♠❜❡r ♦❢ ❝♦♥s❡s ✐s 0 + 1 + 2 + · · · + n = n ( n + 1) / 2 . ❚❤❡ t✐♠❡ ❝♦♠♣❧❡①✐t② ✐s t❤❡r❡❢♦r❡ O ( n 2 ) ✳ ❙♣❛❝❡ ❝♦♠♣❧❡①✐t② ✐s ♦♥❧② O ( n ) ❜❡❝❛✉s❡ t❤❡ ❝♦♣✐❡s ❞♦♥✬t ❛❧❧ ❡①✐st ❛t t❤❡ s❛♠❡ t✐♠❡✳
■❱ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✹✸ Reversing a List in O ( n ) fun revApp ([], ys) = ys | revApp (x::xs, ys) = revApp (xs, x::ys); > val revApp = fn: ’a list * ’a list -> ’a list Slide 408 revApp ([ a, b, c ] , []) ⇒ revApp ([ b, c ] , [ a ]) ⇒ revApp ([ c ] , [ b, a ]) ⇒ revApp ([] , [ c, b, a ]) ⇒ [ c, b, a ] ❈❛❧❧✐♥❣ r❡✈❆♣♣ ✭①s✱②s✮ r❡✈❡rs❡s t❤❡ ❡❧❡♠❡♥ts ♦❢ ①s ❛♥❞ ♣r❡♣❡♥❞s t❤❡♠ t♦ ②s ✳ ◆♦✇ ✇❡ ♠❛② ❞❡❝❧❛r❡ ❢✉♥ r❡✈ ①s ❂ r❡✈❆♣♣✭①s✱❬❪✮❀ ❃ ✈❛❧ r❡✈ ❂ ❢♥ ✿ ✬❛ ❧✐st ✲❃ ✬❛ ❧✐st ■t ✐s ❡❛s② t♦ s❡❡ t❤❛t t❤✐s r❡✈❡rs❡ ❢✉♥❝t✐♦♥ ♣❡r❢♦r♠s ❥✉st n ❝♦♥s❡s✱ ❣✐✈❡♥ ❛♥ n ✲❡❧❡♠❡♥t ❧✐st✳ ❋♦r ❜♦t❤ r❡✈❡rs❡ ❢✉♥❝t✐♦♥s✱ ✇❡ ❝♦✉❧❞ ❝♦✉♥t t❤❡ ♥✉♠❜❡r ♦❢ ❝♦♥s❡s ♣r❡❝✐s❡❧②✖♥♦t ❥✉st ✉♣ t♦ ❛ ❝♦♥st❛♥t ❢❛❝t♦r✳ O ♥♦t❛t✐♦♥ ✐s st✐❧❧ ✉s❡❢✉❧ t♦ ❞❡s❝r✐❜❡ t❤❡ ♦✈❡r❛❧❧ r✉♥♥✐♥❣ t✐♠❡✿ t❤❡ t✐♠❡ t❛❦❡♥ ❜② ❛ ❝♦♥s ✈❛r✐❡s ❢r♦♠ ♦♥❡ s②st❡♠ t♦ ❛♥♦t❤❡r✳ ❚❤❡ ❛❝❝✉♠✉❧❛t♦r y ♠❛❦❡s t❤❡ ❢✉♥❝t✐♦♥ ✐t❡r❛t✐✈❡✳ ❇✉t t❤❡ ❣❛✐♥ ✐♥ ❝♦♠✲ ♣❧❡①✐t② ❛r✐s❡s ❢r♦♠ t❤❡ r❡♠♦✈❛❧ ♦❢ ❛♣♣❡♥❞✳ ❘❡♣❧❛❝✐♥❣ ❛♥ ❡①♣❡♥s✐✈❡ ♦♣❡r❛t✐♦♥ ✭❛♣♣❡♥❞✮ ❜② ❛ s❡r✐❡s ♦❢ ❝❤❡❛♣ ♦♣❡r❛t✐♦♥s ✭❝♦♥s✮ ✐s ❝❛❧❧❡❞ r❡❞✉❝t✐♦♥ ✐♥ str❡♥❣t❤ ✱ ❛♥❞ ✐s ❛ ❝♦♠♠♦♥ t❡❝❤♥✐q✉❡ ✐♥ ❝♦♠♣✉t❡r s❝✐❡♥❝❡✳ ■t ♦r✐❣✐♥❛t❡❞ ✇❤❡♥ ♠❛♥② ❝♦♠♣✉t❡rs ❞✐❞ ♥♦t ❤❛✈❡ ❛ ❤❛r❞✇❛r❡ ♠✉❧t✐♣❧② ✐♥str✉❝t✐♦♥❀ t❤❡ s❡r✐❡s ♦❢ ♣r♦❞✲ ✉❝ts i × r ❢♦r i = 0 ✱ ✳ ✳ ✳ ✱ n ❝♦✉❧❞ ♠♦r❡ ❡✣❝✐❡♥t❧② ❜❡ ❝♦♠♣✉t❡❞ ❜② r❡♣❡❛t❡❞ ❛❞❞✐t✐♦♥✳ ❘❡❞✉❝t✐♦♥ ✐♥ str❡♥❣t❤ ❝❛♥ ❜❡ ❞♦♥❡ ✐♥ ✈❛r✐♦✉s ✇❛②s❀ ✇❡ s❤❛❧❧ s❡❡ ♠❛♥② ✐♥st❛♥❝❡s ♦❢ r❡♠♦✈✐♥❣ ❛♣♣❡♥❞✳ ❈♦♥s✐♥❣ t♦ ❛♥ ❛❝❝✉♠✉❧❛t♦r ♣r♦❞✉❝❡s t❤❡ r❡s✉❧t ✐♥ r❡✈❡rs❡✳ ■❢ t❤❛t ❢♦r❝❡s t❤❡ ✉s❡ ♦❢ ❛♥ ❡①tr❛ ❧✐st r❡✈❡rs❛❧ t❤❡♥ t❤❡ ✐t❡r❛t✐✈❡ ❢✉♥❝t✐♦♥ ♠❛② ❜❡ ♠✉❝❤ s❧♦✇❡r t❤❛♥ t❤❡ r❡❝✉rs✐✈❡ ♦♥❡✳
■❱ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✹✹ Lists, Strings and Characters #"A" #"\"" character constants . . . "" "B" "Oh, no!" string constants . . . Slide 409 explode ( s ) list of the characters in string s implode ( l ) string made of the characters in list l size ( s ) number of chars in string s s 1 ^ s 2 concatenation of strings s 1 and s 2 ❙tr✐♥❣s ❛r❡ ♣r♦✈✐❞❡❞ ✐♥ ♠♦st ♣r♦❣r❛♠♠✐♥❣ ❧❛♥❣✉❛❣❡s t♦ ❛❧❧♦✇ t❡①t ♣r♦✲ ❝❡ss✐♥❣✳ ❆t ❛ ❜❛r❡ ♠✐♥✐♠✉♠✱ ♥✉♠❜❡rs ♠✉st ❜❡ ❝♦♥✈❡rt❡❞ t♦ ♦r ❢r♦♠ ❛ t❡①t✉❛❧ r❡♣r❡s❡♥t❛t✐♦♥✳ Pr♦❣r❛♠s ✐ss✉❡ t❡①t✉❛❧ ♠❡ss❛❣❡s t♦ ✉s❡rs ❛♥❞ ❛♥❛❧②③❡ t❤❡✐r r❡s♣♦♥s❡s✳ ❙tr✐♥❣s ❛r❡ ❡ss❡♥t✐❛❧ ✐♥ ♣r❛❝t✐❝❡✱ ❜✉t t❤❡② ❜r✐♥❣ ✉♣ ❢❡✇ ✐ss✉❡s r❡❧❡✈❛♥t t♦ t❤✐s ❝♦✉rs❡✳ ❚❤❡ ❢✉♥❝t✐♦♥s ❡①♣❧♦❞❡ ❛♥❞ ✐♠♣❧♦❞❡ ❝♦♥✈❡rt ❜❡t✇❡❡♥ str✐♥❣s ❛♥❞ ❧✐sts ♦❢ ❝❤❛r❛❝t❡rs✳ ■♥ ❛ ❢❡✇ ♣r♦❣r❛♠♠✐♥❣ ❧❛♥❣✉❛❣❡s✱ str✐♥❣s s✐♠♣❧② ❛r❡ ❧✐sts ♦❢ ❝❤❛r✲ ❛❝t❡rs✱ ❜✉t t❤✐s ✐s ♣♦♦r ❞❡s✐❣♥✳ ❙tr✐♥❣s ❛r❡ ❛♥ ❛❜str❛❝t ❝♦♥❝❡♣t ✐♥ t❤❡♠s❡❧✈❡s✳ ❚r❡❛t✐♥❣ t❤❡♠ ❛s ❧✐sts ❧❡❛❞s t♦ ❝❧✉♠s② ❛♥❞ ✐♥❡✣❝✐❡♥t ❝♦❞❡✳ ❙✐♠✐❧❛r❧②✱ ❝❤❛r❛❝t❡rs ❛r❡ ♥♦t str✐♥❣s ♦❢ s✐③❡ ♦♥❡✱ ❜✉t ❛r❡ ❛ ♣r✐♠✐t✐✈❡ ❝♦♥✲ ❝❡♣t✳ ❈❤❛r❛❝t❡r ❝♦♥st❛♥ts ✐♥ ▼▲ ❤❛✈❡ t❤❡ ❢♦r♠ ★✧ c ✧ ✱ ✇❤❡r❡ c ✐s ❛♥② ❝❤❛r❛❝✲ t❡r✳ ❋♦r ❡①❛♠♣❧❡✱ t❤❡ ❝♦♠♠❛ ❝❤❛r❛❝t❡r ✐s ★✧✱✧ ✳ ■♥ ❛❞❞✐t✐♦♥ t♦ t❤❡ ♦♣❡r❛t♦rs ❞❡s❝r✐❜❡❞ ❛❜♦✈❡✱ t❤❡ r❡❧❛t✐♦♥s ❁ ❁❂ ❃ ❃❂ ✇♦r❦ ❢♦r str✐♥❣s ❛♥❞ ②✐❡❧❞ ❛❧♣❤❛❜❡t✐❝ ♦r❞❡r ✭♠♦r❡ ♣r❡❝✐s❡❧②✱ ❧❡①✐❝♦❣r❛♣❤✐❝ ♦r❞❡r ✇✐t❤ r❡s♣❡❝t t♦ ❆❙❈■■ ❝❤❛r❛❝t❡r ❝♦❞❡s✮✳
■❱ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✹✺ ❘❡❧❛t❡❞ ♠❛t❡r✐❛❧ ✐s ✐♥ ▼▲ ❢♦r t❤❡ ❲♦r❦✐♥❣ Pr♦❣r❛♠♠❡r ✱ ▲❡❛r♥✐♥❣ ❣✉✐❞❡✳ ♣❛❣❡s ✻✾✕✽✵✳ ❈♦❞❡ ❛ r❡❝✉rs✐✈❡ ❢✉♥❝t✐♦♥ t♦ ❝♦♠♣✉t❡ t❤❡ s✉♠ ♦❢ ❛ ❧✐st✬s ❊①❡r❝✐s❡ ✹✳✶ ❡❧❡♠❡♥ts✳ ❚❤❡♥ ❝♦❞❡ ❛♥ ✐t❡r❛t✐✈❡ ✈❡rs✐♦♥ ❛♥❞ ❝♦♠♠❡♥t ♦♥ t❤❡ ✐♠♣r♦✈❡♠❡♥t ✐♥ ❡✣❝✐❡♥❝②✳
❱ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✹✻ List Utilities: take and drop Removing the first i elements fun take ([], _) = [] | take (x::xs, i) = if i>0 Slide 501 then x :: take(xs, i-1) else []; fun drop ([], _) = [] | drop (x::xs, i) = if i>0 then drop(xs,i-1) else x::xs; ❚❤✐s ❧❡❝t✉r❡ ❡①❛♠✐♥❡s ♠♦r❡ ❧✐st ✉t✐❧✐t✐❡s✱ ✐❧❧✉str❛t✐♥❣ ♠♦r❡ ♣❛tt❡r♥s ♦❢ r❡❝✉rs✐♦♥✱ ❛♥❞ ❝♦♥❝❧✉❞❡s ✇✐t❤ ❛ s♠❛❧❧ ♣r♦❣r❛♠ ❢♦r ♠❛❦✐♥❣ ❝❤❛♥❣❡✳ ❚❤❡ ❢✉♥❝t✐♦♥s t❛❦❡ ❛♥❞ ❞r♦♣ ❞✐✈✐❞❡ ❛ ❧✐st ✐♥t♦ ♣❛rts✱ r❡t✉r♥✐♥❣ ♦r ❞✐s✲ ❝❛r❞✐♥❣ t❤❡ ✜rst i ❡❧❡♠❡♥ts✳ xs = [ x 0 , . . . , x i − 1 , x i , . . . , x n − 1 ] � �� � � �� � take ( xs, i ) drop ( xs, i ) ❆♣♣❧✐❝❛t✐♦♥s ♦❢ t❛❦❡ ❛♥❞ ❞r♦♣ ✇✐❧❧ ❛♣♣❡❛r ✐♥ ❢✉t✉r❡ ❧❡❝t✉r❡s✳ ❚②♣✐❝❛❧❧②✱ t❤❡② ❞✐✈✐❞❡ ❛ ❝♦❧❧❡❝t✐♦♥ ♦❢ ✐t❡♠s ✐♥t♦ ❡q✉❛❧ ♣❛rts ❢♦r r❡❝✉rs✐✈❡ ♣r♦❝❡ss✐♥❣✳ ❚❤❡ s♣❡❝✐❛❧ ♣❛tt❡r♥ ✈❛r✐❛❜❧❡ ❴ ❛♣♣❡❛rs ✐♥ ❜♦t❤ ❢✉♥❝t✐♦♥s✳ ❚❤✐s ✇✐❧❞❝❛r❞ ♣❛tt❡r♥ ♠❛t❝❤❡s ❛♥②t❤✐♥❣✳ ❲❡ ❝♦✉❧❞ ❤❛✈❡ ✇r✐tt❡♥ ✐ ✐♥ ❜♦t❤ ♣♦s✐t✐♦♥s✱ ❜✉t t❤❡ ✇✐❧❞❝❛r❞ r❡♠✐♥❞s ✉s t❤❛t t❤❡ r❡❧❡✈❛♥t ❝❧❛✉s❡ ✐❣♥♦r❡s t❤✐s ❛r❣✉♠❡♥t✳ ❋✉♥❝t✐♦♥ t❛❦❡ ✐s ♥♦t ✐t❡r❛t✐✈❡✱ ❜✉t ♠❛❦✐♥❣ ✐t s♦ ✇♦✉❧❞ ♥♦t ✐♠♣r♦✈❡ ✐ts ❡✣❝✐❡♥❝②✳ ❚❤❡ t❛s❦ r❡q✉✐r❡s ❝♦♣②✐♥❣ ✉♣ t♦ i ❧✐st ❡❧❡♠❡♥ts✱ ✇❤✐❝❤ ♠✉st t❛❦❡ O ( i ) s♣❛❝❡ ❛♥❞ t✐♠❡✳ ❋✉♥❝t✐♦♥ ❞r♦♣ s✐♠♣❧② s❦✐♣s ♦✈❡r i ❧✐st ❡❧❡♠❡♥ts✳ ❚❤✐s r❡q✉✐r❡s O ( i ) t✐♠❡ ❜✉t ♦♥❧② ❝♦♥st❛♥t s♣❛❝❡✳ ■t ✐s ✐t❡r❛t✐✈❡ ❛♥❞ ♠✉❝❤ ❢❛st❡r t❤❛♥ t❛❦❡ ✳ ❇♦t❤ ❢✉♥❝t✐♦♥s ✉s❡ O ( i ) t✐♠❡✱ ❜✉t s❦✐♣♣✐♥❣ ❡❧❡♠❡♥ts ✐s ❢❛st❡r t❤❛♥ ❝♦♣②✐♥❣ t❤❡♠✿ ❞r♦♣ ✬s ❝♦♥st❛♥t ❢❛❝t♦r ✐s s♠❛❧❧❡r✳ ❇♦t❤ ❢✉♥❝t✐♦♥s t❛❦❡ ❛ ❧✐st ❛♥❞ ❛♥ ✐♥t❡❣❡r✱ r❡t✉r♥✐♥❣ ❛ ❧✐st ♦❢ t❤❡ s❛♠❡ t②♣❡✳ ❙♦ t❤❡✐r t②♣❡ ✐s ✬❛ ❧✐st ✯ ✐♥t ✲❃ ✬❛ ❧✐st ✳
❱ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✹✼ Linear Search find x in list [ x 1 , . . . , x n ] by comparing with each element Slide 502 obviously O ( n ) TIME simple & general ordered searching needs only O (log n ) indexed lookup needs only O (1) ▲✐♥❡❛r s❡❛r❝❤ ✐s t❤❡ ♦❜✈✐♦✉s ✇❛② t♦ ✜♥❞ ❛ ❞❡s✐r❡❞ ✐t❡♠ ✐♥ ❛ ❝♦❧❧❡❝t✐♦♥✿ s✐♠♣❧② ❧♦♦❦ t❤r♦✉❣❤ ❛❧❧ t❤❡ ✐t❡♠s✱ ♦♥❡ ❛t ❛ t✐♠❡✳ ■❢ x ✐s ✐♥ t❤❡ ❧✐st✱ t❤❡♥ ✐t ✇✐❧❧ ❜❡ ❢♦✉♥❞ ✐♥ n/ 2 st❡♣s ♦♥ ❛✈❡r❛❣❡✱ ❛♥❞ ❡✈❡♥ t❤❡ ✇♦rst ❝❛s❡ ✐s ♦❜✈✐♦✉s❧② O ( n ) ✳ ▲❛r❣❡ ❝♦❧❧❡❝t✐♦♥s ♦❢ ❞❛t❛ ❛r❡ ✉s✉❛❧❧② ♦r❞❡r❡❞ ♦r ✐♥❞❡①❡❞ s♦ t❤❛t ✐t❡♠s ❝❛♥ ❜❡ ❢♦✉♥❞ ✐♥ O (log n ) t✐♠❡✱ ✇❤✐❝❤ ✐s ❡①♣♦♥❡♥t✐❛❧❧② ❜❡tt❡r t❤❛♥ O ( n ) ✳ ❊✈❡♥ O (1) ✐s ❛❝❤✐❡✈❛❜❧❡ ✭✉s✐♥❣ ❛ ❤❛s❤ t❛❜❧❡ ✮✱ t❤♦✉❣❤ s✉❜❥❡❝t t♦ t❤❡ ✉s✉❛❧ ♣r♦✈✐s♦ t❤❛t ♠❛❝❤✐♥❡ ❧✐♠✐ts ❛r❡ ♥♦t ❡①❝❡❡❞❡❞✳ ❊✣❝✐❡♥t ✐♥❞❡①✐♥❣ ♠❡t❤♦❞s ❛r❡ ♦❢ ♣r✐♠❡ ✐♠♣♦rt❛♥❝❡✿ ❝♦♥s✐❞❡r ❲❡❜ s❡❛r❝❤ ❡♥❣✐♥❡s✳ ◆❡✈❡rt❤❡❧❡ss✱ ❧✐♥❡❛r s❡❛r❝❤ ✐s ♦❢t❡♥ ✉s❡❞ t♦ s❡❛r❝❤ s♠❛❧❧ ❝♦❧❧❡❝t✐♦♥s ❜❡❝❛✉s❡ ✐t ✐s s♦ s✐♠♣❧❡ ❛♥❞ ❣❡♥❡r❛❧✱ ❛♥❞ ✐t ✐s t❤❡ st❛rt✐♥❣ ♣♦✐♥t ❢♦r ❜❡tt❡r ❛❧❣♦r✐t❤♠s✳
❱ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✹✽ Types with Equality The membership test has a strange polymorphic type. Slide 503 fun member(x, []) = false | member(x, y::l) = (x=y) orelse member(x,l); > val member = fn : ’’a * ’’a list -> bool Here, ”a stands for any equality type . Equality testing is OK for integers but NOT for functions. ❆❧❧ t❤❡ ❧✐st ❢✉♥❝t✐♦♥s ✇❡ ❤❛✈❡ ❡♥❝♦✉♥t❡r❡❞ ✉♣ t♦ ♥♦✇ ❤❛✈❡ ❜❡❡♥ ♣♦❧②♠♦r✲ ♣❤✐❝ ✱ ✇♦r❦✐♥❣ ❢♦r ❧✐sts ♦❢ ❛♥② t②♣❡✳ ❋✉♥❝t✐♦♥ ♠❡♠❜❡r ✉s❡s ❧✐♥❡❛r s❡❛r❝❤ t♦ r❡♣♦rt ✇❤❡t❤❡r ♦r ♥♦t ① ♦❝❝✉rs ✐♥ ❧ ✳ ■ts ♣♦❧②♠♦r♣❤✐s♠ ✐s r❡str✐❝t❡❞ t♦ t❤❡ s♦✲❝❛❧❧❡❞ ❡q✉❛❧✐t② t②♣❡s ✳ ❚❤❡s❡ ✐♥❝❧✉❞❡ ✐♥t❡❣❡rs✱ str✐♥❣s✱ ❜♦♦❧❡❛♥s✱ ❛♥❞ t✉♣❧❡s ♦r ❧✐sts ♦❢ ♦t❤❡r ❡q✉❛❧✐t② t②♣❡s✳ ❊q✉❛❧✐t② t❡st✐♥❣ ✐s ♥♦t ❛✈❛✐❧❛❜❧❡ ❢♦r ❡✈❡r② t②♣❡✱ ❤♦✇❡✈❡r✳ ❋✉♥❝t✐♦♥s ❛r❡ ✈❛❧✉❡s ✐♥ ▼▲✱ ❛♥❞ t❤❡r❡ ✐s ♥♦ ✇❛② ♦❢ ❝♦♠♣❛r✐♥❣ t✇♦ ❢✉♥❝t✐♦♥s t❤❛t ✐s ❜♦t❤ ♣r❛❝t✐❝❛❧ ❛♥❞ ♠❡❛♥✐♥❣❢✉❧✳ ❆❜str❛❝t t②♣❡s ❝❛♥ ❜❡ ❞❡❝❧❛r❡❞ ✐♥ ▼▲✱ ❤✐❞✐♥❣ t❤❡✐r ✐♥t❡r♥❛❧ r❡♣r❡s❡♥t❛t✐♦♥✱ ✐♥❝❧✉❞✐♥❣ ✐ts ❡q✉❛❧✐t② t❡st✳ ❊q✉❛❧✐t② ✐s ♥♦t ❡✈❡♥ ❛❧❧♦✇❡❞ ❢♦r t②♣❡ r❡❛❧ ✱ t❤♦✉❣❤ s♦♠❡ ▼▲ s②st❡♠s ✐❣♥♦r❡ t❤✐s✳ ❲❡ s❤❛❧❧ ❞✐s❝✉ss ❢✉♥❝t✐♦♥ ✈❛❧✉❡s ❛♥❞ ❛❜str❛❝t t②♣❡s ❧❛t❡r✳ ■❢ ❛ ❢✉♥❝t✐♦♥✬s t②♣❡ ❝♦♥t❛✐♥s ❡q✉❛❧✐t② t②♣❡ ✈❛r✐❛❜❧❡s ✱ s✉❝❤ ❛s ✑❛ ✱ ✑❜ ✱ t❤❡♥ ✐t ✉s❡s ♣♦❧②♠♦r♣❤✐❝ ❡q✉❛❧✐t② t❡st✐♥❣✳
❱ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✹✾ Equality Polymorphism fun inter([], ys) = [] | inter(x::xs, ys) = Slide 504 if member(x,ys) then x::inter(xs, ys) else inter(xs, ys); > val inter = fn: ’’a list * ’’a list -> ’’a list ML notices that inter uses equality indirectly , by member . ML will OBJECT if we apply these functions to non-equality types. ❋✉♥❝t✐♦♥ ✐♥t❡r ❝♦♠♣✉t❡s t❤❡ ❵✐♥t❡rs❡❝t✐♦♥✬ ♦❢ t✇♦ ❧✐sts✱ r❡t✉r♥✐♥❣ t❤❡ ❧✐st ♦❢ ❡❧❡♠❡♥ts ❝♦♠♠♦♥ t♦ ❜♦t❤✳ ■t ❝❛❧❧s ♠❡♠❜❡r ✳ ❚❤❡ ❡q✉❛❧✐t② t②♣❡ ✈❛r✐❛❜❧❡s ♣r♦♣❛❣❛t❡✿ t❤❡ ✐♥t❡rs❡❝t✐♦♥ ❢✉♥❝t✐♦♥ ❛❧s♦ ❤❛s t❤❡♠ ❡✈❡♥ t❤♦✉❣❤ ✐ts ✉s❡ ♦❢ ❡q✉❛❧✐t② ✐s ✐♥❞✐r❡❝t✳ ❚r②✐♥❣ t♦ ❛♣♣❧② ♠❡♠❜❡r ♦r ✐♥t❡r t♦ ❛ ❧✐st ♦❢ ❢✉♥❝t✐♦♥s ❝❛✉s❡s ▼▲ t♦ ❝♦♠♣❧❛✐♥ ♦❢ ❛ t②♣❡ ❡rr♦r ✳ ■t ❞♦❡s s♦ ❛t ❝♦♠♣✐❧❡ t✐♠❡ ✿ ✐t ❞❡t❡❝ts t❤❡ ❡rr♦rs ❜② t②♣❡s ❛❧♦♥❡✱ ✇✐t❤♦✉t ❡①❡❝✉t✐♥❣ t❤❡ ♦✛❡♥❞✐♥❣ ❝♦❞❡✳ ❊q✉❛❧✐t② ♣♦❧②♠♦r♣❤✐s♠ ✐s ❛ ❝♦♥t❡♥t✐♦✉s ❢❡❛t✉r❡✳ ❙♦♠❡ r❡s❡❛r❝❤❡rs ❝♦♠✲ ♣❧❛✐♥ t❤❛t ✐t ♠❛❦❡s ▼▲ t♦♦ ❝♦♠♣❧✐❝❛t❡❞ ❛♥❞ ❧❡❛❞s ♣r♦❣r❛♠♠❡rs t♦ ✉s❡ ❧✐♥❡❛r s❡❛r❝❤ ❡①❝❡ss✐✈❡❧②✳ ❚❤❡ ❢✉♥❝t✐♦♥❛❧ ♣r♦❣r❛♠♠✐♥❣ ❧❛♥❣✉❛❣❡ ❍❛s❦❡❧❧ ❣❡♥❡r❛❧✲ ✐③❡s t❤❡ ❝♦♥❝❡♣t✱ ❛❧❧♦✇✐♥❣ ♣r♦❣r❛♠♠❡rs t♦ ✐♥tr♦❞✉❝❡ ♥❡✇ ❝❧❛ss❡s ♦❢ t②♣❡s s✉♣♣♦rt✐♥❣ ❛♥② ❞❡s✐r❡❞ ❝♦❧❧❡❝t✐♦♥ ♦❢ ♦♣❡r❛t✐♦♥s✳
❱ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✺✵ Building a List of Pairs fun zip (x::xs,y::ys) = (x,y) :: zip(xs,ys) | zip _ = []; Slide 505 � [ x 1 , . . . , x n ] �− → [( x 1 , y 1 ) , . . . , ( x n , y n )] [ y 1 , . . . , y n ] The wildcard pattern ( _ ) catches empty lists. T HE PATTERNS ARE TRIED IN ORDER . ❆ ❧✐st ♦❢ ♣❛✐rs ♦❢ t❤❡ ❢♦r♠ [( x 1 , y 1 ) , . . . , ( x n , y n )] ❛ss♦❝✐❛t❡s ❡❛❝❤ x i ✇✐t❤ y i ✳ ❈♦♥❝❡♣t✉❛❧❧②✱ ❛ t❡❧❡♣❤♦♥❡ ❞✐r❡❝t♦r② ❝♦✉❧❞ ❜❡ r❡❣❛r❞❡❞ ❛s s✉❝❤ ❛ ❧✐st✱ ✇❤❡r❡ x i r❛♥❣❡s ♦✈❡r ♥❛♠❡s ❛♥❞ y i ♦✈❡r t❤❡ ❝♦rr❡s♣♦♥❞✐♥❣ t❡❧❡♣❤♦♥❡ ♥✉♠❜❡r✳ ▲✐♥❡❛r s❡❛r❝❤ ✐♥ s✉❝❤ ❛ ❧✐st ❝❛♥ ✜♥❞ t❤❡ y i ❛ss♦❝✐❛t❡❞ ✇✐t❤ ❛ ❣✐✈❡♥ x i ✱ ♦r ✈✐❝❡ ✈❡rs❛✖ ✈❡r② s❧♦✇❧②✳ ■♥ ♦t❤❡r ❝❛s❡s✱ t❤❡ ( x i , y i ) ♣❛✐rs ♠✐❣❤t ❤❛✈❡ ❜❡❡♥ ❣❡♥❡r❛t❡❞ ❜② ❛♣♣❧②✐♥❣ ❛ ❢✉♥❝t✐♦♥ t♦ t❤❡ ❡❧❡♠❡♥ts ♦❢ ❛♥♦t❤❡r ❧✐st [ z 1 , . . . , z n ] ✳ ❚❤❡ ❢✉♥❝t✐♦♥s ③✐♣ ❛♥❞ ✉♥③✐♣ ❜✉✐❧❞ ❛♥❞ t❛❦❡ ❛♣❛rt ❧✐sts ♦❢ ♣❛✐rs✿ ③✐♣ ♣❛✐rs ✉♣ ❝♦rr❡s♣♦♥❞✐♥❣ ❧✐st ❡❧❡♠❡♥ts ❛♥❞ ✉♥③✐♣ ✐♥✈❡rts t❤✐s ♦♣❡r❛t✐♦♥✳ ❚❤❡✐r t②♣❡s r❡✢❡❝t ✇❤❛t t❤❡② ❞♦✿ ③✐♣ ✿ ✭✬❛ ❧✐st ✯ ✬❜ ❧✐st✮ ✲❃ ✭✬❛ ✯ ✬❜✮ ❧✐st ✉♥③✐♣ ✿ ✭✬❛ ✯ ✬❜✮ ❧✐st ✲❃ ✭✬❛ ❧✐st ✯ ✬❜ ❧✐st✮ ■❢ t❤❡ ❧✐sts ❛r❡ ♦❢ ✉♥❡q✉❛❧ ❧❡♥❣t❤✱ ③✐♣ ❞✐s❝❛r❞s s✉r♣❧✉s ✐t❡♠s ❛t t❤❡ ❡♥❞ ♦❢ t❤❡ ❧♦♥❣❡r ❧✐st✳ ■ts ✜rst ♣❛tt❡r♥ ♦♥❧② ♠❛t❝❤❡s ❛ ♣❛✐r ♦❢ ♥♦♥✲❡♠♣t② ❧✐sts✳ ❚❤❡ s❡❝♦♥❞ ♣❛tt❡r♥ ✐s ❥✉st ❛ ✇✐❧❞❝❛r❞ ❛♥❞ ❝♦✉❧❞ ♠❛t❝❤ ❛♥②t❤✐♥❣✳ ▼▲ tr✐❡s t❤❡ ❝❧❛✉s❡s ✐♥ t❤❡ ♦r❞❡r ❣✐✈❡♥✱ s♦ t❤❡ ✜rst ♣❛tt❡r♥ ✐s tr✐❡❞ ✜rst✳ ❚❤❡ s❡❝♦♥❞ ♦♥❧② ❣❡ts ❛r❣✉♠❡♥ts ✇❤❡r❡ ❛t ❧❡❛st ♦♥❡ ♦❢ t❤❡ ❧✐sts ✐s ❡♠♣t②✳
❱ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✺✶ Building a Pair of Results fun unzip [] = ([],[]) | unzip ((x,y)::pairs) = let val (xs,ys) = unzip pairs Slide 506 in (x::xs, y::ys) end; fun revUnzip ([], xs, ys) = (xs,ys) | revUnzip ((x,y)::pairs, xs, ys) = revUnzip(pairs, x::xs, y::ys); ●✐✈❡♥ ❛ ❧✐st ♦❢ ♣❛✐rs✱ ✉♥③✐♣ ❤❛s t♦ ❜✉✐❧❞ t✇♦ ❧✐sts ♦❢ r❡s✉❧ts✱ ✇❤✐❝❤ ✐s ❛✇❦✇❛r❞ ✉s✐♥❣ r❡❝✉rs✐♦♥✳ ❚❤❡ ✈❡rs✐♦♥ s❤♦✇♥ ❛❜♦✉t ✉s❡s t❤❡ ❧♦❝❛❧ ❞❡❝❧❛r❛t✐♦♥ ❧❡t D ✐♥ E ❡♥❞ ✱ ✇❤❡r❡ D ❝♦♥s✐sts ♦❢ ❞❡❝❧❛r❛t✐♦♥s ❛♥❞ E ✐s t❤❡ ❡①♣r❡ss✐♦♥ t❤❛t ❝❛♥ ✉s❡ t❤❡♠✳ ◆♦t❡ ❡s♣❡❝✐❛❧❧② t❤❡ ❞❡❝❧❛r❛t✐♦♥ ✈❛❧ ✭①s✱②s✮ ❂ ✉♥③✐♣ ♣❛✐rs ✇❤✐❝❤ ❜✐♥❞s ①s ❛♥❞ ②s t♦ t❤❡ r❡s✉❧ts ♦❢ t❤❡ r❡❝✉rs✐✈❡ ❝❛❧❧✳ ■♥ ❣❡♥❡r❛❧✱ t❤❡ ❞❡❝❧❛r❛t✐♦♥ ✈❛❧ P ❂ E ♠❛t❝❤❡s t❤❡ ♣❛tt❡r♥ P ❛❣❛✐♥st t❤❡ ✈❛❧✉❡ ♦❢ ❡①♣r❡s✲ s✐♦♥ E ✳ ■t ❜✐♥❞s ❛❧❧ t❤❡ ✈❛r✐❛❜❧❡s ✐♥ P t♦ t❤❡ ❝♦rr❡s♣♦♥❞✐♥❣ ✈❛❧✉❡s✳ ❍❡r❡ ✐s ✈❡rs✐♦♥ ♦❢ ✉♥③✐♣ t❤❛t r❡♣❧❛❝❡s t❤❡ ❧♦❝❛❧ ❞❡❝❧❛r❛t✐♦♥ ❜② ❛ ❢✉♥❝t✐♦♥ ✭ ❝♦♥s♣❛✐r ✮ ❢♦r t❛❦✐♥❣ ❛♣❛rt t❤❡ ♣❛✐r ♦❢ ❧✐sts ✐♥ t❤❡ r❡❝✉rs✐✈❡ ❝❛❧❧✳ ■t ❞❡✜♥❡s t❤❡ s❛♠❡ ❝♦♠♣✉t❛t✐♦♥ ❛s t❤❡ ♣r❡✈✐♦✉s ✈❡rs✐♦♥ ♦❢ ③✐♣ ❛♥❞ ✐s ♣♦ss✐❜❧② ❝❧❡❛r❡r✱ ❜✉t ♥♦t ❡✈❡r② ❧♦❝❛❧ ❞❡❝❧❛r❛t✐♦♥ ❝❛♥ ❜❡ ❡❧✐♠✐♥❛t❡❞ ❛s ❡❛s✐❧②✳ ❢✉♥ ❝♦♥s♣❛✐r ✭✭①✱②✮✱ ✭①s✱②s✮✮ ❂ ✭①✿✿①s✱ ②✿✿②s✮❀ ❢✉♥ ✉♥③✐♣ ❬❪ ❂ ✭❬❪✱❬❪✮ ⑤ ✉♥③✐♣✭①②✿✿♣❛✐rs✮ ❂ ❝♦♥s♣❛✐r✭①②✱ ✉♥③✐♣ ♣❛✐rs✮❀ ▼❛❦✐♥❣ t❤❡ ❢✉♥❝t✐♦♥ ✐t❡r❛t✐✈❡ ②✐❡❧❞s r❡✈❯♥③✐♣ ❛❜♦✈❡✱ ✇❤✐❝❤ ✐s ✈❡r② s✐♠✲ ♣❧❡✳ ■t❡r❛t✐♦♥ ❝❛♥ ❝♦♥str✉❝t ♠❛♥② r❡s✉❧ts ❛t ♦♥❝❡ ✐♥ ❞✐✛❡r❡♥t ❛r❣✉♠❡♥t ♣♦s✐✲ t✐♦♥s✳ ❇♦t❤ ♦✉t♣✉t ❧✐sts ❛r❡ ❜✉✐❧t ✐♥ r❡✈❡rs❡ ♦r❞❡r✱ ✇❤✐❝❤ ❝❛♥ ❜❡ ❝♦rr❡❝t❡❞ ❜② r❡✈❡rs✐♥❣ t❤❡ ✐♥♣✉t t♦ r❡✈❯♥③✐♣ ✳ ❚❤❡ t♦t❛❧ ❝♦sts ✇✐❧❧ ♣r♦❜❛❜❧② ❡①❝❡❡❞ t❤♦s❡ ♦❢ ✉♥③✐♣ ❞❡s♣✐t❡ t❤❡ ❛❞✈❛♥t❛❣❡s ♦❢ ✐t❡r❛t✐♦♥✳
❱ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✺✷ An Application: Making Change fun change (till, 0) = [] | change (c::till, amt) = if amt<c then change(till, amt) Slide 507 else c :: change(c::till, amt-c) > Warning: pattern matching is not exhaustive > val change = fn : int list * int -> int list • The recursion terminates when amt = 0. • Tries the largest coin first to use large coins. • The algorithm is greedy , and it CAN FAIL ! ❚❤❡ t✐❧❧ ❤❛s ✉♥❧✐♠✐t❡❞ s✉♣♣❧✐❡s ♦❢ ❝♦✐♥s✳ ❚❤❡ ❧❛r❣❡st ❝♦✐♥s s❤♦✉❧❞ ❜❡ tr✐❡❞ ✜rst✱ t♦ ❛✈♦✐❞ ❣✐✈✐♥❣ ❝❤❛♥❣❡ ❛❧❧ ✐♥ ♣❡♥♥✐❡s✳ ❚❤❡ ❧✐st ♦❢ ❧❡❣❛❧ ❝♦✐♥ ✈❛❧✉❡s✱ ❝❛❧❧❡❞ t✐❧❧ ✱ ✐s ❣✐✈❡♥ ✐♥ ❞❡s❝❡♥❞✐♥❣ ♦r❞❡r✱ s✉❝❤ ❛s ✺✵✱ ✷✵✱ ✶✵✱ ✺✱ ✷ ❛♥❞ ✶✳ ✭❘❡❝❛❧❧ t❤❛t t❤❡ ❤❡❛❞ ♦❢ ❛ ❧✐st ✐s t❤❡ ❡❧❡♠❡♥t ♠♦st ❡❛s✐❧② r❡❛❝❤❡❞✳✮ ❚❤❡ ❝♦❞❡ ❢♦r ❝❤❛♥❣❡ ✐s ❜❛s❡❞ ♦♥ s✐♠♣❧❡ ♦❜s❡r✈❛t✐♦♥s✳ • ❈❤❛♥❣❡ ❢♦r ③❡r♦ ❝♦♥s✐sts ♦❢ ♥♦ ❝♦✐♥s ❛t ❛❧❧✳ ✭◆♦t❡ t❤❡ ♣❛tt❡r♥ ♦❢ ✵ ✐♥ t❤❡ ✜rst ❝❧❛✉s❡✳✮ • ❋♦r ❛ ♥♦♥③❡r♦ ❛♠♦✉♥t✱ tr② t❤❡ ❧❛r❣❡st ❛✈❛✐❧❛❜❧❡ ❝♦✐♥✳ ■❢ ✐t ✐s s♠❛❧❧ ❡♥♦✉❣❤✱ ✉s❡ ✐t ❛♥❞ ❞❡❝r❡❛s❡ t❤❡ ❛♠♦✉♥t ❛❝❝♦r❞✐♥❣❧②✳ • ❊①❝❧✉❞❡ ❢r♦♠ ❝♦♥s✐❞❡r❛t✐♦♥ ❛♥② ❝♦✐♥s t❤❛t ❛r❡ t♦♦ ❧❛r❣❡✳ ❆❧t❤♦✉❣❤ ♥♦❜♦❞② ❝♦♥s✐❞❡rs ♠❛❦✐♥❣ ❝❤❛♥❣❡ ❢♦r ③❡r♦✱ t❤✐s ✐s t❤❡ s✐♠♣❧❡st ✇❛② t♦ ♠❛❦❡ t❤❡ ❛❧❣♦r✐t❤♠ t❡r♠✐♥❛t❡✳ ▼♦st ✐t❡r❛t✐✈❡ ♣r♦❝❡❞✉r❡s ❜❡❝♦♠❡ s✐♠♣❧❡st ✐❢✱ ✐♥ t❤❡✐r ❜❛s❡ ❝❛s❡✱ t❤❡② ❞♦ ♥♦t❤✐♥❣✳ ❆ ❜❛s❡ ❝❛s❡ ♦❢ ♦♥❡ ✐♥st❡❛❞ ♦❢ ③❡r♦ ✐s ♦❢t❡♥ ❛ s✐❣♥ ♦❢ ❛ ♥♦✈✐❝❡ ♣r♦❣r❛♠♠❡r✳ ❚❤❡ ❢✉♥❝t✐♦♥ ❝❛♥ t❡r♠✐♥❛t❡ ❡✐t❤❡r ✇✐t❤ s✉❝❝❡ss ♦r ❢❛✐❧✉r❡✳ ■t ❢❛✐❧s ❜② r❛✐s✐♥❣ ❡①❝❡♣t✐♦♥ ▼❛t❝❤ ✳ ❚❤❡ ❡①❝❡♣t✐♦♥ ♦❝❝✉rs ✐❢ ♥♦ ♣❛tt❡r♥ ♠❛t❝❤❡s✱ ♥❛♠❡❧② ✐❢ t✐❧❧ ❜❡❝♦♠❡s ❡♠♣t② ✇❤✐❧❡ ❛♠♦✉♥t ✐s st✐❧❧ ♥♦♥③❡r♦✳ ❯♥❢♦rt✉♥❛t❡❧②✱ ❢❛✐❧✉r❡ ❝❛♥ ♦❝❝✉r ❡✈❡♥ ✇❤❡♥ ❝❤❛♥❣❡ ❝❛♥ ❜❡ ♠❛❞❡✳ ❚❤❡ ❣r❡❡❞② ❵❧❛r❣❡st ❝♦✐♥ ✜rst✬ ❛♣♣r♦❛❝❤ ✐s t♦ ❜❧❛♠❡✳ ❙✉♣♣♦s❡ ✇❡ ❤❛✈❡ ❝♦✐♥s ♦❢ ✈❛❧✉❡s ✺ ❛♥❞ ✷✱ ❛♥❞ ♠✉st ♠❛❦❡ ❝❤❛♥❣❡ ❢♦r ✻❀ t❤❡ ♦♥❧② ✇❛② ✐s 6 = 2 + 2 + 2 ✱ ✐❣♥♦r✐♥❣ t❤❡ ✺✳ ●r❡❡❞② ❛❧❣♦r✐t❤♠s ❛r❡ ♦❢t❡♥ ❡✛❡❝t✐✈❡✱ ❜✉t ♥♦t ❤❡r❡✳
❱ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✺✸ A LL Ways of Making Change fun change (till, 0) = [[]] | change ([], amt) = [] | change (c::till, amt) = Slide 508 if amt<c then change(till, amt) else let fun allc [] = [] | allc(cs::css) = (c::cs)::allc css in allc (change(c::till, amt-c)) @ change(till, amt) end; ▲❡t ✉s ❣❡♥❡r❛❧✐③❡ t❤❡ ♣r♦❜❧❡♠ t♦ ✜♥❞ ❛❧❧ ♣♦ss✐❜❧❡ ✇❛②s ♦❢ ♠❛❦✐♥❣ ❝❤❛♥❣❡✱ r❡t✉r♥✐♥❣ t❤❡♠ ❛s ❛ ❧✐st ♦❢ s♦❧✉t✐♦♥s✳ ▲♦♦❦ ❛t t❤❡ t②♣❡✿ t❤❡ r❡s✉❧t ✐s ♥♦✇ ❛ ❧✐st ♦❢ ❧✐sts✳ ❃ ❝❤❛♥❣❡ ✿ ✐♥t ❧✐st ✯ ✐♥t ✲❃ ✐♥t ❧✐st ❧✐st ❚❤❡ ❝♦❞❡ ✇✐❧❧ ♥❡✈❡r r❛✐s❡ ❡①❝❡♣t✐♦♥s✳ ■t ❡①♣r❡ss❡s ❢❛✐❧✉r❡ ❜② r❡t✉r♥✐♥❣ ❛♥ ❡♠♣t② ❧✐st ♦❢ s♦❧✉t✐♦♥s✿ ✐t r❡t✉r♥s ❬❪ ✐❢ t❤❡ t✐❧❧ ✐s ❡♠♣t② ❛♥❞ t❤❡ ❛♠♦✉♥t ✐s ♥♦♥③❡r♦✳ ■❢ t❤❡ ❛♠♦✉♥t ✐s ③❡r♦✱ t❤❡♥ t❤❡r❡ ✐s ♦♥❧② ♦♥❡ ✇❛② ♦❢ ♠❛❦✐♥❣ ❝❤❛♥❣❡❀ t❤❡ r❡s✉❧t s❤♦✉❧❞ ❜❡ ❬❬❪❪ ✳ ❚❤✐s ✐s s✉❝❝❡ss ✐♥ t❤❡ ❜❛s❡ ❝❛s❡✳ ■♥ ♥♦♥tr✐✈✐❛❧ ❝❛s❡s✱ t❤❡r❡ ❛r❡ t✇♦ s♦✉r❝❡s ♦❢ s♦❧✉t✐♦♥s✿ t♦ ✉s❡ ❛ ❝♦✐♥ ✭✐❢ ♣♦ss✐❜❧❡✮ ❛♥❞ ❞❡❝r❡❛s❡ t❤❡ ❛♠♦✉♥t ❛❝❝♦r❞✐♥❣❧②✱ ♦r t♦ r❡♠♦✈❡ t❤❡ ❝✉rr❡♥t ❝♦✐♥ ✈❛❧✉❡ ❢r♦♠ ❝♦♥s✐❞❡r❛t✐♦♥✳ ❚❤❡ ❢✉♥❝t✐♦♥ ❛❧❧❝ ✐s ❞❡❝❧❛r❡❞ ❧♦❝❛❧❧② ✐♥ ♦r❞❡r t♦ ♠❛❦❡ ✉s❡ ♦❢ ❝ ✱ t❤❡ ❝✉rr❡♥t ❝♦✐♥✳ ■t ❛❞❞s ❛♥ ❡①tr❛ ❝ t♦ ❛❧❧ t❤❡ s♦❧✉t✐♦♥s r❡t✉r♥❡❞ ❜② t❤❡ r❡❝✉rs✐✈❡ ❝❛❧❧ t♦ ♠❛❦❡ ❝❤❛♥❣❡ ❢♦r ❛♠t✲❝ ✳ ❖❜s❡r✈❡ t❤❡ ♥❛♠✐♥❣ ❝♦♥✈❡♥t✐♦♥ ✿ ❝s ✐s ❛ ❧✐st ♦❢ ❝♦✐♥s✱ ✇❤✐❧❡ ❝ss ✐s ❛ ❧✐st ♦❢ s✉❝❤ ❧✐sts✳ ❚❤❡ tr❛✐❧✐♥❣ ❵s✬ ✐s s✉❣❣❡st✐✈❡ ♦❢ ❛ ♣❧✉r❛❧✳
❱ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✺✹ A LL Ways of Making Change — Faster! fun change(till, 0, chg, chgs) = chg::chgs | change([], amt, chg, chgs) = chgs | change(c::till, amt, chg, chgs) = Slide 509 if amt<0 then chgs else change(c::till, amt-c, c::chg, change(till, amt, chg, chgs)) We’ve added another accumulating parameter! Repeatedly improving simple code is called stepwise refinement . ❚✇♦ ❡①tr❛ ❛r❣✉♠❡♥ts ❡❧✐♠✐♥❛t❡ ♠❛♥② ✿✿ ❛♥❞ ❛♣♣❡♥❞ ♦♣❡r❛t✐♦♥s ❢r♦♠ t❤❡ ♣r❡✈✐♦✉s s❧✐❞❡✬s ❝❤❛♥❣❡ ❢✉♥❝t✐♦♥✳ ❚❤❡ ✜rst✱ ❝❤❣ ✱ ❛❝❝✉♠✉❧❛t❡s t❤❡ ❝♦✐♥s ❝❤♦s❡♥ s♦ ❢❛r❀ ♦♥❡ ❡✈❛❧✉❛t✐♦♥ ♦❢ ❝✿✿❝❤❣ r❡♣❧❛❝❡s ♠❛♥② ❡✈❛❧✉❛t✐♦♥s ♦❢ ❛❧❧❝ ✳ ❚❤❡ s❡❝♦♥❞✱ ❝❤❣s ✱ ❛❝❝✉♠✉❧❛t❡s t❤❡ ❧✐st ♦❢ s♦❧✉t✐♦♥s s♦ ❢❛r❀ ✐t ❛✈♦✐❞s t❤❡ ♥❡❡❞ ❢♦r ❛♣♣❡♥❞✳ ❚❤✐s ✈❡rs✐♦♥ r✉♥s s❡✈❡r❛❧ t✐♠❡s ❢❛st❡r t❤❛♥ t❤❡ ♣r❡✈✐♦✉s ♦♥❡✳ ▼❛❦✐♥❣ ❝❤❛♥❣❡ ✐s st✐❧❧ ❡①tr❡♠❡❧② s❧♦✇ ❢♦r ❛♥ ♦❜✈✐♦✉s r❡❛s♦♥✿ t❤❡ ♥✉♠❜❡r ♦❢ s♦❧✉t✐♦♥s ❣r♦✇s r❛♣✐❞❧② ✐♥ t❤❡ ❛♠♦✉♥t ❜❡✐♥❣ ❝❤❛♥❣❡❞✳ ❯s✐♥❣ ✺✵✱ ✷✵✱ ✶✵✱ ✺✱ ✷ ❛♥❞ ✶✱ t❤❡r❡ ❛r❡ ✹✸✻✻ ✇❛②s ♦❢ ❡①♣r❡ss✐♥❣ ✾✾✳ ❲❡ s❤❛❧❧ r❡✈✐s✐t t❤❡ ❵♠❛❦✐♥❣ ❝❤❛♥❣❡✬ t❛s❦ ❧❛t❡r t♦ ✐❧❧✉str❛t❡ ❡①❝❡♣t✐♦♥✲ ❤❛♥❞❧✐♥❣✳ ❖✉r t❤r❡❡ ❝❤❛♥❣❡ ❢✉♥❝t✐♦♥s ✐❧❧✉str❛t❡ ❛ ❜❛s✐❝ t❡❝❤♥✐q✉❡✿ ♣r♦❣r❛♠ ❞❡✈❡❧✲ ♦♣♠❡♥t ❜② st❡♣✇✐s❡ r❡✜♥❡♠❡♥t ✳ ❇❡❣✐♥ ❜② ✇r✐t✐♥❣ ❛ ✈❡r② s✐♠♣❧❡ ♣r♦❣r❛♠ ❛♥❞ ❛❞❞ r❡q✉✐r❡♠❡♥ts ✐♥❞✐✈✐❞✉❛❧❧②✳ ❆❞❞ ❡✣❝✐❡♥❝② r❡✜♥❡♠❡♥ts ❧❛st ♦❢ ❛❧❧✳ ❊✈❡♥ ✐❢ t❤❡ s✐♠♣❧❡r ♣r♦❣r❛♠ ❝❛♥♥♦t ❜❡ ✐♥❝❧✉❞❡❞ ✐♥ t❤❡ ♥❡①t ✈❡rs✐♦♥ ❛♥❞ ❤❛s t♦ ❜❡ ❞✐s❝❛r❞❡❞✱ ♦♥❡ ❤❛s ❧❡❛r♥❡❞ ❛❜♦✉t t❤❡ t❛s❦ ❜② ✇r✐t✐♥❣ ✐t✳
❱ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✺✺ ❘❡❧❛t❡❞ ♠❛t❡r✐❛❧ ✐s ✐♥ ▼▲ ❢♦r t❤❡ ❲♦r❦✐♥❣ Pr♦❣r❛♠♠❡r ✱ ▲❡❛r♥✐♥❣ ❣✉✐❞❡✳ ♣❛❣❡s ✽✷✲✶✵✼✱ t❤♦✉❣❤ ②♦✉ ♠❛② ✇❛♥t t♦ s❦✐♣ s♦♠❡ ♦❢ t❤❡ ❤❛r❞❡r ❡①❛♠♣❧❡s✳ ❍♦✇ ❞♦❡s t❤✐s ✈❡rs✐♦♥ ♦❢ ③✐♣ ❞✐✛❡r ❢r♦♠ t❤❡ ♦♥❡ ❛❜♦✈❡❄ ❊①❡r❝✐s❡ ✺✳✶ ❢✉♥ ③✐♣ ✭①✿✿①s✱②✿✿②s✮ ❂ ✭①✱②✮ ✿✿ ③✐♣✭①s✱②s✮ ⑤ ③✐♣ ✭❬❪✱ ❬❪✮ ❂ ❬❪❀ ❲❤❛t ❛ss✉♠♣t✐♦♥s ❞♦ t❤❡ ❵♠❛❦✐♥❣ ❝❤❛♥❣❡✬ ❢✉♥❝t✐♦♥s ♠❛❦❡ ❊①❡r❝✐s❡ ✺✳✷ ❛❜♦✉t t❤❡ ✈❛r✐❛❜❧❡s t✐❧❧ ✱ ❝ ❛♥❞ ❛♠t ❄ ■❧❧✉str❛t❡ ✇❤❛t ❝♦✉❧❞ ❤❛♣♣❡♥ ✐❢ s♦♠❡ ♦❢ t❤❡s❡ ❛ss✉♠♣t✐♦♥s ✇❡r❡ ✈✐♦❧❛t❡❞✳ ❙❤♦✇ t❤❛t t❤❡ ♥✉♠❜❡r ♦❢ ✇❛②s ♦❢ ♠❛❦✐♥❣ ❝❤❛♥❣❡ ❢♦r n ✭✐❣✲ ❊①❡r❝✐s❡ ✺✳✸ ♥♦r✐♥❣ ♦r❞❡r✮ ✐s O ( n ) ✐❢ t❤❡r❡ ❛r❡ t✇♦ ❧❡❣❛❧ ❝♦✐♥ ✈❛❧✉❡s✳ ❲❤❛t ✐❢ t❤❡r❡ ❛r❡ t❤r❡❡✱ ❢♦✉r✱ ✳ ✳ ✳ ❝♦✐♥ ✈❛❧✉❡s❄
❱■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✺✻ Sorting: Arranging Items into Order a few applications: Slide 601 • fast search • fast merging • finding duplicates • inverting tables • graphics algorithms ❙♦rt✐♥❣ ✐s ♣❡r❤❛♣s t❤❡ ♠♦st ❞❡❡♣❧② st✉❞✐❡❞ ❛s♣❡❝t ♦❢ ❛❧❣♦r✐t❤♠ ❞❡s✐❣♥✳ ❑♥✉t❤✬s s❡r✐❡s ❚❤❡ ❆rt ♦❢ ❈♦♠♣✉t❡r Pr♦❣r❛♠♠✐♥❣ ❞❡✈♦t❡s ❛♥ ❡♥t✐r❡ ✈♦❧✉♠❡ t♦ s♦rt✐♥❣ ❛♥❞ s❡❛r❝❤✐♥❣ ❬✾❪✦ ❙❡❞❣❡✇✐❝❦ ❬✶✹❪ ❛❧s♦ ❝♦✈❡rs s♦rt✐♥❣✳ ❙♦rt✐♥❣ ❤❛s ❝♦✉♥t❧❡ss ❛♣♣❧✐❝❛t✐♦♥s✳ ❙♦rt✐♥❣ ❛ ❝♦❧❧❡❝t✐♦♥ ❛❧❧♦✇s ✐t❡♠s t♦ ❜❡ ❢♦✉♥❞ q✉✐❝❦❧②✳ ❘❡❝❛❧❧ t❤❛t ❧✐♥❡❛r s❡❛r❝❤ r❡q✉✐r❡s O ( n ) st❡♣s t♦ s❡❛r❝❤ ❛♠♦♥❣ n ✐t❡♠s✳ ❆ s♦rt❡❞ ❝♦❧❧❡❝t✐♦♥ ❛❞♠✐ts ❜✐♥❛r② s❡❛r❝❤ ✱ ✇❤✐❝❤ r❡q✉✐r❡s ♦♥❧② O (log n ) t✐♠❡✳ ❚❤❡ ✐❞❡❛ ♦❢ ❜✐♥❛r② s❡❛r❝❤ ✐s t♦ ❝♦♠♣❛r❡ t❤❡ ✐t❡♠ ❜❡✐♥❣ s♦✉❣❤t ✇✐t❤ t❤❡ ♠✐❞❞❧❡ ✐t❡♠ ✭✐♥ ♣♦s✐t✐♦♥ n/ 2 ✮ ❛♥❞ t❤❡♥ t♦ ❞✐s❝❛r❞ ❡✐t❤❡r t❤❡ ❧❡❢t ❤❛❧❢ ♦r t❤❡ r✐❣❤t✱ ❞❡♣❡♥❞✐♥❣ ♦♥ t❤❡ r❡s✉❧t ♦❢ t❤❡ ❝♦♠♣❛r✐s♦♥✳ ❇✐♥❛r② s❡❛r❝❤ ♥❡❡❞s ❛rr❛②s ♦r tr❡❡s✱ ♥♦t ❧✐sts❀ ✇❡ s❤❛❧❧ ❝♦♠❡ t♦ ❜✐♥❛r② s❡❛r❝❤ tr❡❡s ❧❛t❡r✳ ❚✇♦ s♦rt❡❞ ✜❧❡s ❝❛♥ q✉✐❝❦❧② ❜❡ ♠❡r❣❡❞ t♦ ❢♦r♠ ❛ ❧❛r❣❡r s♦rt❡❞ ✜❧❡✳ ❖t❤❡r ❛♣♣❧✐❝❛t✐♦♥s ✐♥❝❧✉❞❡ ✜♥❞✐♥❣ ❞✉♣❧✐❝❛t❡s ✿ ❛❢t❡r s♦rt✐♥❣✱ t❤❡② ❛r❡ ❛❞❥❛❝❡♥t✳ ❆ t❡❧❡♣❤♦♥❡ ❞✐r❡❝t♦r② ✐s s♦rt❡❞ ❛❧♣❤❛❜❡t✐❝❛❧❧② ❜② ♥❛♠❡✳ ❚❤❡ s❛♠❡ ✐♥❢♦r✲ ♠❛t✐♦♥ ❝❛♥ ✐♥st❡❛❞ ❜❡ s♦rt❡❞ ❜② t❡❧❡♣❤♦♥❡ ♥✉♠❜❡r ✭✉s❡❢✉❧ t♦ t❤❡ ♣♦❧✐❝❡✮ ♦r ❜② str❡❡t ❛❞❞r❡ss ✭✉s❡❢✉❧ t♦ ❥✉♥❦✲♠❛✐❧ ✜r♠s✮✳ ❙♦rt✐♥❣ ✐♥❢♦r♠❛t✐♦♥ ✐♥ ❞✐✛❡r❡♥t ✇❛②s ❣✐✈❡s ✐t ❞✐✛❡r❡♥t ❛♣♣❧✐❝❛t✐♦♥s✳ ❈♦♠♠♦♥ s♦rt✐♥❣ ❛❧❣♦r✐t❤♠s ✐♥❝❧✉❞❡ ✐♥s❡rt✐♦♥ s♦rt ✱ q✉✐❝❦s♦rt ✱ ♠❡r❣❡s♦rt ❛♥❞ ❤❡❛♣s♦rt ✳ ❲❡ s❤❛❧❧ ❝♦♥s✐❞❡r t❤❡ ✜rst t❤r❡❡ ♦❢ t❤❡s❡✳ ❊❛❝❤ ❛❧❣♦r✐t❤♠ ❤❛s ✐ts ❛❞✈❛♥t❛❣❡s✳ ❆s ❛ ❝♦♥❝r❡t❡ ❜❛s✐s ❢♦r ❝♦♠♣❛r✐s♦♥✱ r✉♥t✐♠❡s ❛r❡ q✉♦t❡❞ ❢♦r ❉❊❈st❛t✐♦♥ ❝♦♠♣✉t❡rs✳ ✭❚❤❡s❡ ✇❡r❡ ❜❛s❡❞ ♦♥ t❤❡ ▼■P❙ ❝❤✐♣✱ ❛♥ ❡❛r❧② ❘■❙❈ ❞❡s✐❣♥✳✮
❱■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✺✼ How Fast Can We Sort? typically count comparisons C ( n ) Slide 602 there are n ! permutations of n elements each comparison distinguishes two permutations 2 C ( n ) ≥ n ! , therefore C ( n ) ≥ log( n !) ≈ n log n − 1 . 44 n ❚❤❡ ✉s✉❛❧ ♠❡❛s✉r❡ ♦❢ ❡✣❝✐❡♥❝② ❢♦r s♦rt✐♥❣ ❛❧❣♦r✐t❤♠s ✐s t❤❡ ♥✉♠❜❡r ♦❢ ❝♦♠♣❛r✐s♦♥ ♦♣❡r❛t✐♦♥s r❡q✉✐r❡❞✳ ▼❡r❣❡s♦rt r❡q✉✐r❡s ♦♥❧② O ( n log n ) ❝♦♠♣❛r✲ ✐s♦♥s t♦ s♦rt ❛♥ ✐♥♣✉t ♦❢ n ✐t❡♠s✳ ■t ✐s str❛✐❣❤t❢♦r✇❛r❞ t♦ ♣r♦✈❡ t❤❛t ❛t t❤✐s ❝♦♠♣❧❡①✐t② ✐s t❤❡ ❜❡st ♣♦ss✐❜❧❡ ❬✷✱ ♣❛❣❡s ✽✻✕✼❪✳ ❚❤❡r❡ ❛r❡ n ! ♣❡r♠✉t❛t✐♦♥s ♦❢ n ❡❧❡♠❡♥ts ❛♥❞ ❡❛❝❤ ❝♦♠♣❛r✐s♦♥ ❞✐st✐♥❣✉✐s❤❡s t✇♦ ♣❡r♠✉t❛t✐♦♥s✳ ❚❤❡ ❧♦✇❡r ❜♦✉♥❞ ♦♥ t❤❡ ♥✉♠❜❡r ♦❢ ❝♦♠♣❛r✐s♦♥s✱ C ( n ) ✱ ✐s ♦❜t❛✐♥❡❞ ❜② s♦❧✈✐♥❣ 2 C ( n ) ≥ n ! ❀ t❤❡r❡❢♦r❡ C ( n ) ≥ log( n !) ≈ n log n − 1 . 44 n ✳ ■♥ ♦r❞❡r t♦ ❝♦♠♣❛r❡ t❤❡ s♦rt✐♥❣ ❛❧❣♦r✐t❤♠s✱ ✇❡ ✉s❡ t❤❡ ❢♦❧❧♦✇✐♥❣ s♦✉r❝❡ ♦❢ ♣s❡✉❞♦✲r❛♥❞♦♠ ♥✉♠❜❡rs ❬✶✷❪✿ ❧♦❝❛❧ ✈❛❧ ❛ ❂ ✶✻✽✵✼✳✵ ❛♥❞ ♠ ❂ ✷✶✹✼✹✽✸✻✹✼✳✵ ✐♥ ❢✉♥ ♥❡①tr❛♥❞♦♠ s❡❡❞ ❂ ❧❡t ✈❛❧ t ❂ ❛✯s❡❡❞ ✐♥ t ✲ ♠ ✯ r❡❛❧✭❢❧♦♦r✭t✴♠✮✮ ❡♥❞ ❛♥❞ tr✉♥❝t♦ ❦ r ❂ ✶ ✰ ❢❧♦♦r✭✭r ✴ ♠✮ ✯ ✭r❡❛❧ ❦✮✮ ❡♥❞❀ ❲❡ ❜✐♥❞ t❤❡ ✐❞❡♥t✐✜❡r rs t♦ ❛ ❧✐st ♦❢ ✶✵✱✵✵✵ r❛♥❞♦♠ ♥✉♠❜❡rs✳ ❢✉♥ r❛♥❞❧✐st ✭♥✱s❡❡❞✱s❡❡❞s✮ ❂ ✐❢ ♥❂✵ t❤❡♥ ✭s❡❡❞✱s❡❡❞s✮ ❡❧s❡ r❛♥❞❧✐st✭♥✲✶✱ ♥❡①tr❛♥❞♦♠ s❡❡❞✱ s❡❡❞✿✿s❡❡❞s✮❀ ✈❛❧ ✭s❡❡❞✱rs✮ ❂ r❛♥❞❧✐st✭✶✵✵✵✵✱ ✶✳✵✱ ❬❪✮❀ ◆❡✈❡r ♠✐♥❞ ❤♦✇ t❤✐s ✇♦r❦s✱ ❜✉t ♥♦t❡ t❤❛t ❣❡♥❡r❛t✐♥❣ st❛t✐st✐❝❛❧❧② ❣♦♦❞ r❛♥✲ ❞♦♠ ♥✉♠❜❡rs ✐s ❤❛r❞✳ ▼✉❝❤ ❡✛♦rt ❤❛s ❣♦♥❡ ✐♥t♦ t❤♦s❡ ❢❡✇ ❧✐♥❡s ♦❢ ❝♦❞❡✳
❱■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✺✽ Insertion Sort Insert does n/ 2 comparisons on average fun ins (x:real, []) = [x] | ins (x:real, y::ys) = Slide 603 if x<=y then x::y::ys else y::ins(x,ys); Insertion sort takes O ( n 2 ) comparisons on average fun insort [] = [] | insort (x::xs) = ins(x, insort xs); 174 seconds to sort 10,000 random numbers ■t❡♠s ❢r♦♠ t❤❡ ✐♥♣✉t ❛r❡ ❝♦♣✐❡❞ ♦♥❡ ❛t ❛ t✐♠❡ t♦ t❤❡ ♦✉t♣✉t✳ ❊❛❝❤ ♥❡✇ ✐t❡♠ ✐s ✐♥s❡rt❡❞ ✐♥t♦ t❤❡ r✐❣❤t ♣❧❛❝❡ s♦ t❤❛t t❤❡ ♦✉t♣✉t ✐s ❛❧✇❛②s ✐♥ ♦r❞❡r✳ ❲❡ ❝♦✉❧❞ ❡❛s✐❧② ✇r✐t❡ ✐t❡r❛t✐✈❡ ✈❡rs✐♦♥s ♦❢ t❤❡s❡ ❢✉♥❝t✐♦♥s✱ ❜✉t t♦ ♥♦ ♣✉r♣♦s❡✳ ■♥s❡rt✐♦♥ s♦rt ✐s s❧♦✇ ❜❡❝❛✉s❡ ✐t ❞♦❡s O ( n 2 ) ❝♦♠♣❛r✐s♦♥s ✭❛♥❞ ❛ ❧♦t ♦❢ ❧✐st ❝♦♣②✐♥❣✮✱ ♥♦t ❜❡❝❛✉s❡ ✐t ✐s r❡❝✉rs✐✈❡✳ ■ts q✉❛❞r❛t✐❝ r✉♥t✐♠❡ ♠❛❦❡s ✐t ♥❡❛r❧② ✉s❡❧❡ss✿ ✐t t❛❦❡s ✶✼✹ s❡❝♦♥❞s ❢♦r ♦✉r ❡①❛♠♣❧❡ ✇❤✐❧❡ t❤❡ ♥❡①t✲✇♦rst ✜❣✉r❡ ✐s ✶✳✹ s❡❝♦♥❞s✳ ■♥s❡rt✐♦♥ s♦rt ✐s ✇♦rt❤ ❝♦♥s✐❞❡r✐♥❣ ❜❡❝❛✉s❡ ✐t ✐s ❡❛s② t♦ ❝♦❞❡ ❛♥❞ ✐❧❧✉s✲ tr❛t❡s t❤❡ ❝♦♥❝❡♣ts✳ ❚✇♦ ❡✣❝✐❡♥t s♦rt✐♥❣ ❛❧❣♦r✐t❤♠s✱ ♠❡r❣❡s♦rt ❛♥❞ ❤❡❛♣s♦rt✱ ❝❛♥ ❜❡ r❡❣❛r❞❡❞ ❛s r❡✜♥❡♠❡♥ts ♦❢ ✐♥s❡rt✐♦♥ s♦rt✳ ❚❤❡ t②♣❡ ❝♦♥str❛✐♥t ✿r❡❛❧ r❡s♦❧✈❡s t❤❡ ♦✈❡r❧♦❛❞✐♥❣ ♦❢ t❤❡ ❁❂ ♦♣❡r❛t♦r❀ r❡❝❛❧❧ ▲❡❝t✳ ✷✳ ❆❧❧ ♦✉r s♦rt✐♥❣ ❢✉♥❝t✐♦♥s ✇✐❧❧ ♥❡❡❞ ❛ t②♣❡ ❝♦♥str❛✐♥t s♦♠❡✲ ✇❤❡r❡✳ ❚❤❡ ♥♦t✐♦♥ ♦❢ s♦rt✐♥❣ ❞❡♣❡♥❞s ✉♣♦♥ t❤❡ ❢♦r♠ ♦❢ ❝♦♠♣❛r✐s♦♥ ❜❡✐♥❣ ❞♦♥❡✱ ✇❤✐❝❤ ✐♥ t✉r♥ ❞❡t❡r♠✐♥❡s t❤❡ t②♣❡ ♦❢ t❤❡ s♦rt✐♥❣ ❢✉♥❝t✐♦♥✳
❱■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✺✾ Quicksort: The Idea • choose a pivot element, a • Divide : partition the input into two sublists: Slide 604 – those at most a in value – those exceeding a • Conquer using recursive calls to sort the sublists • Combine the sorted lists by appending one to the other ◗✉✐❝❦s♦rt ✇❛s ✐♥✈❡♥t❡❞ ❜② ❈✳ ❆✳ ❘✳ ❍♦❛r❡✱ ✇❤♦ ❤❛s ❥✉st ♠♦✈❡❞ ❢r♦♠ ❖①❢♦r❞ t♦ ▼✐❝r♦s♦❢t ❘❡s❡❛r❝❤✱ ❈❛♠❜r✐❞❣❡✳ ◗✉✐❝❦s♦rt ✇♦r❦s ❜② ❞✐✈✐❞❡ ❛♥❞ ❝♦♥q✉❡r ✱ ❛ ❜❛s✐❝ ❛❧❣♦r✐t❤♠ ❞❡s✐❣♥ ♣r✐♥❝✐♣❧❡✳ ◗✉✐❝❦s♦rt ❝❤♦♦s❡s ❢r♦♠ t❤❡ ✐♥♣✉t s♦♠❡ ✈❛❧✉❡ a ✱ ❝❛❧❧❡❞ t❤❡ ♣✐✈♦t ✳ ■t ♣❛rt✐t✐♦♥s t❤❡ r❡♠❛✐♥✐♥❣ ✐t❡♠s ✐♥t♦ t✇♦ ♣❛rts✿ t❤♦s❡ ≤ a ✱ ❛♥❞ t❤♦s❡ > a ✳ ■t s♦rts ❡❛❝❤ ♣❛rt r❡❝✉rs✐✈❡❧②✱ t❤❡♥ ♣✉ts t❤❡ s♠❛❧❧❡r ♣❛rt ❜❡❢♦r❡ t❤❡ ❣r❡❛t❡r✳ ❚❤❡ ❝❧❡✈❡r❡st ❢❡❛t✉r❡ ♦❢ ❍♦❛r❡✬s ❛❧❣♦r✐t❤♠ ✇❛s t❤❛t t❤❡ ♣❛rt✐t✐♦♥ ❝♦✉❧❞ ❜❡ ❞♦♥❡ ✐♥ ♣❧❛❝❡ ❜② ❡①❝❤❛♥❣✐♥❣ ❛rr❛② ❡❧❡♠❡♥ts✳ ◗✉✐❝❦s♦rt ✇❛s ✐♥✈❡♥t❡❞ ❜❡❢♦r❡ r❡❝✉rs✐♦♥ ✇❛s ✇❡❧❧ ❦♥♦✇♥✱ ❛♥❞ ♣❡♦♣❧❡ ❢♦✉♥❞ ✐t ❡①tr❡♠❡❧② ❤❛r❞ t♦ ✉♥❞❡rst❛♥❞✳ ❆s ✉s✉❛❧✱ ✇❡ s❤❛❧❧ ❝♦♥s✐❞❡r ❛ ❧✐st ✈❡rs✐♦♥ ❜❛s❡❞ ♦♥ ❢✉♥❝t✐♦♥❛❧ ♣r♦❣r❛♠♠✐♥❣✳
❱■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✻✵ Quicksort: The Code fun quick [] = [] | quick [x] = [x] | quick (a::bs) = let fun part (l,r,[]) : real list = Slide 605 (quick l) @ (a :: quick r) | part (l, r, x::xs) = if x<=a then part(x::l, r, xs) else part(l, x::r, xs) in part([],[],bs) end; 0.74 seconds to sort 10,000 random numbers ❖✉r ▼▲ q✉✐❝❦s♦rt ❝♦♣✐❡s t❤❡ ✐t❡♠s✳ ■t ✐s st✐❧❧ ♣r❡tt② ❢❛st✱ ❛♥❞ ✐t ✐s ♠✉❝❤ ❡❛s✐❡r t♦ ✉♥❞❡rst❛♥❞✳ ■t t❛❦❡s r♦✉❣❤❧② ✵✳✼✹ s❡❝♦♥❞s t♦ s♦rt rs ✱ ♦✉r ❧✐st ♦❢ r❛♥❞♦♠ ♥✉♠❜❡rs✳ ❚❤❡ ❢✉♥❝t✐♦♥ ❞❡❝❧❛r❛t✐♦♥ ❝♦♥s✐sts ♦❢ t❤r❡❡ ❝❧❛✉s❡s✳ ❚❤❡ ✜rst ❤❛♥❞❧❡s t❤❡ ❡♠♣t② ❧✐st❀ t❤❡ s❡❝♦♥❞ ❤❛♥❞❧❡s s✐♥❣❧❡t♦♥ ❧✐sts ✭t❤♦s❡ ♦❢ t❤❡ ❢♦r♠ ❬①❪ ✮❀ t❤❡ t❤✐r❞ ❤❛♥❞❧❡s ❧✐sts ♦❢ t✇♦ ♦r ♠♦r❡ ❡❧❡♠❡♥ts✳ ❖❢t❡♥✱ ❧✐sts ♦❢ ❧❡♥❣t❤ ✉♣ t♦ ✜✈❡ ♦r s♦ ❛r❡ tr❡❛t❡❞ ❛s s♣❡❝✐❛❧ ❝❛s❡s t♦ ❜♦♦st s♣❡❡❞✳ ❚❤❡ ❧♦❝❛❧❧② ❞❡❝❧❛r❡❞ ❢✉♥❝t✐♦♥ ♣❛rt ♣❛rt✐t✐♦♥s t❤❡ ✐♥♣✉t ✉s✐♥❣ ❛ ❛s t❤❡ ♣✐✈♦t✳ ❚❤❡ ❛r❣✉♠❡♥ts ❧ ❛♥❞ r ❛❝❝✉♠✉❧❛t❡ ✐t❡♠s ❢♦r t❤❡ ❧❡❢t ✭ ≤ a ✮ ❛♥❞ r✐❣❤t ✭ > a ✮ ♣❛rts ♦❢ t❤❡ ✐♥♣✉t✱ r❡s♣❡❝t✐✈❡❧②✳ ■t ✐s ♥♦t ❤❛r❞ t♦ ♣r♦✈❡ t❤❛t q✉✐❝❦s♦rt ❞♦❡s n log n ❝♦♠♣❛r✐s♦♥s✱ ✐♥ t❤❡ ❛✈❡r❛❣❡ ❝❛s❡ ❬✷✱ ♣❛❣❡ ✾✹❪✳ ❲✐t❤ r❛♥❞♦♠ ❞❛t❛✱ t❤❡ ♣✐✈♦t ✉s✉❛❧❧② ❤❛s ❛♥ ❛✈❡r❛❣❡ ✈❛❧✉❡ t❤❛t ❞✐✈✐❞❡s t❤❡ ✐♥♣✉t ✐♥ t✇♦ ❛♣♣r♦①✐♠❛t❡❧② ❡q✉❛❧ ♣❛rts✳ ❲❡ ❤❛✈❡ t❤❡ r❡❝✉rr❡♥❝❡ T (1) = 1 ❛♥❞ T ( n ) = 2 T ( n/ 2) + n ✱ ✇❤✐❝❤ ✐s O ( n log n ) ✳ ■♥ ♦✉r ❡①❛♠♣❧❡✱ ✐t ✐s ❛❜♦✉t ✷✸✺ t✐♠❡s ❢❛st❡r t❤❛♥ ✐♥s❡rt✐♦♥ s♦rt✳ ■♥ t❤❡ ✇♦rst ❝❛s❡✱ q✉✐❝❦s♦rt✬s r✉♥♥✐♥❣ t✐♠❡ ✐s q✉❛❞r❛t✐❝✦ ❆♥ ❡①❛♠♣❧❡ ✐s ✇❤❡♥ ✐ts ✐♥♣✉t ✐s ❛❧♠♦st s♦rt❡❞ ♦r r❡✈❡rs❡ s♦rt❡❞✳ ◆❡❛r❧② ❛❧❧ ♦❢ t❤❡ ✐t❡♠s ❡♥❞ ✉♣ ✐♥ ♦♥❡ ♣❛rt✐t✐♦♥❀ ✇♦r❦ ✐s ♥♦t ❞✐✈✐❞❡❞ ❡✈❡♥❧②✳ ❲❡ ❤❛✈❡ t❤❡ r❡❝✉rr❡♥❝❡ T (1) = 1 ❛♥❞ T ( n + 1) = T ( n ) + n ✱ ✇❤✐❝❤ ✐s O ( n 2 ) ✳ ❘❛♥❞♦♠✐③✐♥❣ t❤❡ ✐♥♣✉t ♠❛❦❡s t❤❡ ✇♦rst ❝❛s❡ ❤✐❣❤❧② ✉♥❧✐❦❡❧②✳
❱■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✻✶ Append-Free Quicksort fun quik([], sorted) = sorted | quik([x], sorted) = x::sorted | quik(a::bs, sorted) = Slide 606 let fun part (l, r, []) : real list = quik(l, a :: quik(r,sorted)) | part (l, r, x::xs) = if x<=a then part(x::l, r, xs) else part(l, x::r, xs) in part([],[],bs) end; 0.53 seconds to sort 10,000 random numbers ❚❤❡ ❧✐st s♦rt❡❞ ❛❝❝✉♠✉❧❛t❡s t❤❡ r❡s✉❧t ✐♥ t❤❡ ❝♦♠❜✐♥❡ st❛❣❡ ♦❢ t❤❡ q✉✐❝❦✲ s♦rt ❛❧❣♦r✐t❤♠✳ ❲❡ ❤❛✈❡ ❛❣❛✐♥ ✉s❡❞ t❤❡ st❛♥❞❛r❞ t❡❝❤♥✐q✉❡ ❢♦r ❡❧✐♠✐♥❛t✐♥❣ ❛♣♣❡♥❞✳ ❈❛❧❧✐♥❣ q✉✐❦✭①s✱s♦rt❡❞✮ r❡✈❡rs❡s t❤❡ ❡❧❡♠❡♥ts ♦❢ ①s ❛♥❞ ♣r❡♣❡♥❞s t❤❡♠ t♦ t❤❡ ❧✐st s♦rt❡❞ ✳ ▲♦♦❦✐♥❣ ❝❧♦s❡❧② ❛t ♣❛rt ✱ ♦❜s❡r✈❡ t❤❛t q✉✐❦✭r✱s♦rt❡❞✮ ✐s ♣❡r❢♦r♠❡❞ ✜rst✳ ❚❤❡♥ ❛ ✐s ❝♦♥s❡❞ t♦ t❤✐s s♦rt❡❞ ❧✐st✳ ❋✐♥❛❧❧②✱ q✉✐❦ ✐s ❝❛❧❧❡❞ ❛❣❛✐♥ t♦ s♦rt t❤❡ ❡❧❡♠❡♥ts ♦❢ ❧ ✳ ❚❤❡ s♣❡❡❞✉♣ ✐s s✐❣♥✐✜❝❛♥t✳ ❆♥ ✐♠♣❡r❛t✐✈❡ q✉✐❝❦s♦rt ❝♦❞❡❞ ✐♥ P❛s❝❛❧ ✭t❛❦❡♥ ❢r♦♠ ❙❡❞❣❡✇✐❝❦ ❬✶✹❪✮ ✐s ❥✉st s❧✐❣❤t❧② ❢❛st❡r t❤❛♥ ❢✉♥❝t✐♦♥ q✉✐❦ ✳ ❚❤❡ ♥❡❛r✲❛❣r❡❡♠❡♥t ✐s s✉r♣r✐s✐♥❣ ❜❡❝❛✉s❡ t❤❡ ❝♦♠♣✉t❛t✐♦♥❛❧ ♦✈❡r❤❡❛❞s ♦❢ ❧✐sts ❡①✲ ❝❡❡❞ t❤♦s❡ ♦❢ ❛rr❛②s✳ ■♥ r❡❛❧✐st✐❝ ❛♣♣❧✐❝❛t✐♦♥s✱ ❝♦♠♣❛r✐s♦♥s ❛r❡ t❤❡ ❞♦♠✐♥❛♥t ❝♦st ❛♥❞ t❤❡ ♦✈❡r❤❡❛❞s ♠❛tt❡r ❡✈❡♥ ❧❡ss✳
❱■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✻✷ Merging Two Lists Merge joins two sorted lists fun merge([],ys) = ys : real list Slide 607 | merge(xs,[]) = xs | merge(x::xs, y::ys) = if x<=y then x::merge(xs, y::ys) else y::merge(x::xs, ys); Generalises Insert to two lists Does at most m + n − 1 comparisons ▼❡r❣✐♥❣ ♠❡❛♥s ❝♦♠❜✐♥✐♥❣ t✇♦ s♦rt❡❞ ❧✐sts t♦ ❢♦r♠ ❛ ❧❛r❣❡r s♦rt❡❞ ❧✐st✳ ■t ❞♦❡s ❛t ♠♦st m + n ❝♦♠♣❛r✐s♦♥s✱ ✇❤❡r❡ m ❛♥❞ n ❛r❡ t❤❡ ❧❡♥❣t❤s ♦❢ t❤❡ ✐♥♣✉t ❧✐sts✳ ■❢ m ❛♥❞ n ❛r❡ r♦✉❣❤❧② ❡q✉❛❧ t❤❡♥ ✇❡ ❤❛✈❡ ❛ ❢❛st ✇❛② ♦❢ ❝♦♥str✉❝t✐♥❣ s♦rt❡❞ ❧✐sts❀ ✐❢ n = 1 t❤❡♥ ♠❡r❣✐♥❣ ❞❡❣❡♥❡r❛t❡s t♦ ✐♥s❡rt✐♦♥✱ ❞♦✐♥❣ ♠✉❝❤ ✇♦r❦ ❢♦r ❧✐tt❧❡ ❣❛✐♥✳ ▼❡r❣✐♥❣ ✐s t❤❡ ❜❛s✐s ♦❢ s❡✈❡r❛❧ s♦rt✐♥❣ ❛❧❣♦r✐t❤♠s❀ ✇❡ ❧♦♦❦ ❛t ❛ ❞✐✈✐❞❡✲ ❛♥❞✲❝♦♥q✉❡r ♦♥❡✳ ▼❡r❣❡s♦rt ✐s s❡❧❞♦♠ ❢♦✉♥❞ ✐♥ ❝♦♥✈❡♥t✐♦♥❛❧ ♣r♦❣r❛♠♠✐♥❣ ❜❡❝❛✉s❡ ✐t ✐s ❤❛r❞ t♦ ❝♦❞❡ ❢♦r ❛rr❛②s❀ ✐t ✇♦r❦s ♥✐❝❡❧② ✇✐t❤ ❧✐sts✳ ■t ❞✐✈✐❞❡s t❤❡ ✐♥♣✉t ✭✐❢ ♥♦♥✲tr✐✈✐❛❧✮ ✐♥t♦ t✇♦ r♦✉❣❤❧② ❡q✉❛❧ ♣❛rts✱ s♦rts t❤❡♠ r❡❝✉rs✐✈❡❧②✱ t❤❡♥ ♠❡r❣❡s t❤❡♠✳ ❋✉♥❝t✐♦♥ ♠❡r❣❡ ✐s ♥♦t ✐t❡r❛t✐✈❡❀ t❤❡ r❡❝✉rs✐♦♥ ✐s ❞❡❡♣✳ ❆♥ ✐t❡r❛t✐✈❡ ✈❡rs✐♦♥ ✐s ♦❢ ❧✐tt❧❡ ❜❡♥❡✜t ❢♦r t❤❡ s❛♠❡ r❡❛s♦♥s t❤❛t ❛♣♣❧② t♦ ❛♣♣❡♥❞ ✭▲❡❝t✳ ✹✮✳
❱■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✻✸ Top-down Merge sort fun tmergesort [] = [] | tmergesort [x] = [x] | tmergesort xs = Slide 608 let val k = length xs div 2 in merge(tmergesort (take(xs, k)), tmergesort (drop(xs, k))) end; O ( n log n ) comparisons in worst case 1.4 seconds to sort 10,000 random numbers ▼❡r❣❡s♦rt✬s ❞✐✈✐❞❡ st❛❣❡ ❞✐✈✐❞❡s t❤❡ ✐♥♣✉t ♥♦t ❜② ❝❤♦♦s✐♥❣ ❛ ♣✐✈♦t ✭❛s ✐♥ q✉✐❝❦s♦rt✮ ❜✉t ❜② s✐♠♣❧② ❝♦✉♥t✐♥❣ ♦✉t ❤❛❧❢ ♦❢ t❤❡ ❡❧❡♠❡♥ts✳ ❚❤❡ ❝♦♥q✉❡r st❛❣❡ ❛❣❛✐♥ ✐♥✈♦❧✈❡s r❡❝✉rs✐✈❡ ❝❛❧❧s✱ ❛♥❞ t❤❡ ❝♦♠❜✐♥❡ st❛❣❡ ✐♥✈♦❧✈❡s ♠❡r❣✐♥❣✳ ❋✉♥❝t✐♦♥ t♠❡r❣❡s♦rt t❛❦❡s r♦✉❣❤❧② ✶✳✹ s❡❝♦♥❞s t♦ s♦rt t❤❡ ❧✐st rs ✳ ■♥ t❤❡ ✇♦rst ❝❛s❡✱ ♠❡r❣❡s♦rt ❞♦❡s O ( n log n ) ❝♦♠♣❛r✐s♦♥s✱ ✇✐t❤ t❤❡ s❛♠❡ r❡❝✉rr❡♥❝❡ ❡q✉❛t✐♦♥ ❛s ✐♥ q✉✐❝❦s♦rt✬s ❛✈❡r❛❣❡ ❝❛s❡✳ ❇❡❝❛✉s❡ t❛❦❡ ❛♥❞ ❞r♦♣ ❞✐✈✐❞❡ t❤❡ ✐♥♣✉t ✐♥ t✇♦ ❡q✉❛❧ ♣❛rts ✭t❤❡② ❞✐✛❡r ❛t ♠♦st ❜② ♦♥❡ ❡❧❡♠❡♥t✮✱ ✇❡ ❛❧✇❛②s ❤❛✈❡ T ( n ) = 2 T ( n/ 2) + n ✳ ◗✉✐❝❦s♦rt ✐s ♥❡❛r❧② ✸ t✐♠❡s ❛s ❢❛st ✐♥ t❤❡ ❡①❛♠♣❧❡✳ ❇✉t ✐t r✐s❦s ❛ q✉❛❞r❛t✐❝ ✇♦rst ❝❛s❡✦ ▼❡r❣❡ s♦rt ✐s s❛❢❡ ❜✉t s❧♦✇✳ ❙♦ ✇❤✐❝❤ ❛❧❣♦r✐t❤♠ ✐s ❜❡st❄ ❲❡ ❤❛✈❡ s❡❡♥ ❛ t♦♣✲❞♦✇♥ ♠❡r❣❡s♦rt✳ ❇♦tt♦♠✲✉♣ ❛❧❣♦r✐t❤♠s ❛❧s♦ ❡①✐st✳ ❚❤❡② st❛rt ✇✐t❤ ❛ ❧✐st ♦❢ ♦♥❡✲❡❧❡♠❡♥t ❧✐sts ❛♥❞ r❡♣❡❛t❡❞❧② ♠❡r❣❡ ❛❞❥❛❝❡♥t ❧✐sts ✉♥t✐❧ ♦♥❧② ♦♥❡ ✐s ❧❡❢t✳ ❆ r❡✜♥❡♠❡♥t✱ ✇❤✐❝❤ ❡①♣❧♦✐ts ❛♥② ✐♥✐t✐❛❧ ♦r❞❡r ❛♠♦♥❣ t❤❡ ✐♥♣✉t✱ ✐s t♦ st❛rt ✇✐t❤ ❛ ❧✐st ♦❢ ✐♥❝r❡❛s✐♥❣ ♦r ❞❡❝r❡❛s✐♥❣ r✉♥s ♦❢ ✐♥♣✉t ✐t❡♠s✳
❱■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✻✹ Summary of Sorting Algorithms Optimal is O ( n log n ) comparisons Slide 609 Insertion sort : simple to code; too slow ( quadratic ) [174 secs] Quicksort : fast on average; quadratic in worst case [0.53 secs] Mergesort : optimal in theory; often slower than quicksort [1.4 secs] M ATCH THE ALGORITHM TO THE APPLICATION ◗✉✐❝❦s♦rt✬s ✇♦rst ❝❛s❡ ❝❛♥♥♦t ❜❡ ✐❣♥♦r❡❞✳ ❋♦r ❧❛r❣❡ n ✱ ❛ ❝♦♠♣❧❡①✐t② ♦❢ O ( n 2 ) ✐s ❝❛t❛str♦♣❤✐❝✳ ▼❡r❣❡s♦rt ❤❛s ❛♥ O ( n log n ) ✇♦rst ❝❛s❡ r✉♥♥✐♥❣ t✐♠❡✱ ✇❤✐❝❤ ✐s ♦♣t✐♠❛❧✱ ❜✉t ✐t ✐s t②♣✐❝❛❧❧② s❧♦✇❡r t❤❛♥ q✉✐❝❦s♦rt ❢♦r r❛♥❞♦♠ ❞❛t❛✳ ◆♦♥✲❝♦♠♣❛r✐s♦♥ s♦rt✐♥❣ ❞❡s❡r✈❡s ♠❡♥t✐♦♥✐♥❣✳ ❲❡ ❝❛♥ s♦rt ❛ ❧❛r❣❡ ♥✉♠❜❡r ♦❢ s♠❛❧❧ ✐♥t❡❣❡rs ✉s✐♥❣ t❤❡✐r r❛❞✐① r❡♣r❡s❡♥t❛t✐♦♥ ✐♥ O ( n ) t✐♠❡✳ ❚❤✐s r❡s✉❧t ❞♦❡s ♥♦t ❝♦♥tr❛❞✐❝t t❤❡ ❝♦♠♣❛r✐s♦♥✲❝♦✉♥t✐♥❣ ❛r❣✉♠❡♥t ❜❡❝❛✉s❡ ❝♦♠♣❛r✐s♦♥s ❛r❡ ♥♦t ✉s❡❞ ❛t ❛❧❧✳ ▲✐♥❡❛r t✐♠❡ ✐s ❛❝❤✐❡✈❛❜❧❡ ♦♥❧② ✐❢ t❤❡ ❣r❡❛t❡st ✐♥t❡❣❡r ✐s ✜①❡❞ ✐♥ ❛❞✈❛♥❝❡❀ ❛s n ❣♦❡s t♦ ✐♥✜♥✐t②✱ ✐♥❝r❡❛s✐♥❣❧② ♠❛♥② ♦❢ t❤❡ ✐t❡♠s ❛r❡ t❤❡ s❛♠❡✳ ■t ✐s ❛ s✐♠♣❧❡ s♣❡❝✐❛❧ ❝❛s❡✳ ▼❛♥② ♦t❤❡r s♦rt✐♥❣ ❛❧❣♦r✐t❤♠s ❡①✐st✳ ❲❡ ❤❛✈❡ ♥♦t ❝♦♥s✐❞❡r❡❞ t❤❡ ♣r♦❜✲ ❧❡♠ ♦❢ s♦rt✐♥❣ ❤✉❣❡ ❛♠♦✉♥ts ♦❢ ❞❛t❛ ✉s✐♥❣ ❡①t❡r♥❛❧ st♦r❛❣❡ ♠❡❞✐❛ s✉❝❤ ❛s ♠❛❣♥❡t✐❝ t❛♣❡✳ ❘❡❧❛t❡❞ ♠❛t❡r✐❛❧ ✐s ✐♥ ▼▲ ❢♦r t❤❡ ❲♦r❦✐♥❣ Pr♦❣r❛♠♠❡r ✱ ▲❡❛r♥✐♥❣ ❣✉✐❞❡✳ ♣❛❣❡s ✶✵✽✕✶✶✸✳
❱■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✻✺ An Enumeration Type datatype vehicle = Bike | Motorbike Slide 701 | Car | Lorry; • We have declared a new type , namely vehicle , • . . . along with four new constants . • They are the constructors of the datatype. ❚❤❡ ❞❛t❛t②♣❡ ❞❡❝❧❛r❛t✐♦♥ ❛❞❞s ❛ ♥❡✇ t②♣❡ t♦ ♦✉r ▼▲ s❡ss✐♦♥✳ ❚②♣❡ ✈❡❤✐❝❧❡ ✐s ❛s ❣♦♦❞ ❛s ❛♥② ❜✉✐❧t✲✐♥ t②♣❡ ❛♥❞ ❡✈❡♥ ❛❞♠✐ts ♣❛tt❡r♥✲♠❛t❝❤✐♥❣✳ ❚❤❡ ❢♦✉r ♥❡✇ ✐❞❡♥t✐✜❡rs ♦❢ t②♣❡ ✈❡❤✐❝❧❡ ❛r❡ ❝❛❧❧❡❞ ❝♦♥str✉❝t♦rs ✳ ❲❡ ❝♦✉❧❞ r❡♣r❡s❡♥t t❤❡ ✈❛r✐♦✉s ✈❡❤✐❝❧❡s ❜② t❤❡ ♥✉♠❜❡rs ✵✕✸✳ ❍♦✇❡✈❡r✱ t❤❡ ❝♦❞❡ ✇♦✉❧❞ ❜❡ ❤❛r❞ t♦ r❡❛❞ ❛♥❞ ❡✈❡♥ ❤❛r❞❡r t♦ ♠❛✐♥t❛✐♥✳ ❈♦♥s✐❞❡r ❛❞❞✐♥❣ ❚r✐❝②❝❧❡ ❛s ❛ ♥❡✇ ✈❡❤✐❝❧❡✳■❢ ✇❡ ✇❛♥t❡❞ t♦ ❛❞❞ ✐t ❜❡❢♦r❡ ❇✐❦❡ ✱ t❤❡♥ ❛❧❧ t❤❡ ♥✉♠❜❡rs ✇♦✉❧❞ ❤❛✈❡ t♦ ❜❡ ❝❤❛♥❣❡❞✳ ❯s✐♥❣ ❞❛t❛t②♣❡ ✱ s✉❝❤ ❛❞❞✐t✐♦♥s ❛r❡ tr✐✈✐❛❧ ❛♥❞ t❤❡ ❝♦♠♣✐❧❡r ❝❛♥ ✭❛t ❧❡❛st s♦♠❡t✐♠❡s✮ ✇❛r♥ ✉s ✇❤❡♥ ✐t ❡♥❝♦✉♥t❡rs ❛ ❢✉♥❝t✐♦♥ ❞❡❝❧❛r❛t✐♦♥ t❤❛t ❞♦❡s♥✬t ②❡t ❤❛✈❡ ❛ ❝❛s❡ ❢♦r ❚r✐❝②❝❧❡ ✳ ❘❡♣r❡s❡♥t✐♥❣ ✈❡❤✐❝❧❡s ❜② str✐♥❣s ❧✐❦❡ ✧❇✐❦❡✧ ✱ ✧❈❛r✧ ✱ ❡t❝✳✱ ✐s ❛❧s♦ ❜❛❞✳ ❈♦♠♣❛r✐♥❣ str✐♥❣ ✈❛❧✉❡s ✐s s❧♦✇ ❛♥❞ t❤❡ ❝♦♠♣✐❧❡r ❝❛♥✬t ✇❛r♥ ✉s ♦❢ ♠✐s✲ s♣❡❧❧✐♥❣s ❧✐❦❡ ✧▼❖t♦r❜✐❦❡✧ ✿ t❤❡② ✇✐❧❧ ♠❛❦❡ ♦✉r ❝♦❞❡ ❢❛✐❧✳ ▼♦st ♣r♦❣r❛♠♠✐♥❣ ❧❛♥❣✉❛❣❡s ❛❧❧♦✇ t❤❡ ❞❡❝❧❛r❛t✐♦♥ ♦❢ t②♣❡s ❧✐❦❡ ✈❡❤✐❝❧❡ ✳ ❇❡❝❛✉s❡ t❤❡② ❝♦♥s✐st ♦❢ ❛ s❡r✐❡s ♦❢ ✐❞❡♥t✐✜❡rs✱ t❤❡② ❛r❡ ❝❛❧❧❡❞ ❡♥✉♠❡r❛t✐♦♥ t②♣❡s ✳ ❖t❤❡r ❝♦♠♠♦♥ ❡①❛♠♣❧❡s ❛r❡ ❞❛②s ♦❢ t❤❡ ✇❡❡❦ ♦r ❝♦❧♦✉rs✳ ❚❤❡ ❝♦♠♣✐❧❡r ❝❤♦♦s❡s t❤❡ ✐♥t❡❣❡rs ❢♦r ✉s❀ t②♣❡✲❝❤❡❝❦✐♥❣ ♣r❡✈❡♥ts ✉s ❢r♦♠ ❝♦♥❢✉s✐♥❣ ❇✐❦❡ ✇✐t❤ ❘❡❞ ♦r ❙✉♥❞❛② ✳
❱■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✻✻ Declaring a Function on Vehicles fun wheels Bike = 2 | wheels Motorbike = 2 Slide 702 | wheels Car = 4 | wheels Lorry = 18; > val wheels = fn : vehicle -> int • Datatype constructors can be used in patterns. • Pattern-matching is fast, even complicated nested patterns. ❚❤❡ ❜❡❛✉t② ♦❢ ❞❛t❛t②♣❡ ❞❡❝❧❛r❛t✐♦♥s ✐s t❤❛t t❤❡ ♥❡✇ t②♣❡s ❜❡❤❛✈❡ ❛s ✐❢ t❤❡② ✇❡r❡ ❜✉✐❧t ✐♥t♦ ▼▲✳ ❚②♣❡✲❝❤❡❝❦✐♥❣ ❝❛t❝❤❡s ❝♦♠♠♦♥ ❡rr♦rs✱ s✉❝❤ ❛s ♠✐①✐♥❣ ✉♣ ❞✐✛❡r❡♥t ❞❛t❛t②♣❡s ✐♥ ❛ ❢✉♥❝t✐♦♥ ❧✐❦❡ ✇❤❡❡❧s ✱ ❛s ✇❡❧❧ ❛s ♠✐ss✐♥❣ ❛♥❞ r❡❞✉♥❞❛♥t ♣❛tt❡r♥s✳ ◆♦t❡ ✿ ▼▲ ❞♦❡s ♥♦t ❛❧✇❛②s ❝❛t❝❤ ♠✐ss♣❡❧t ❝♦♥str✉❝t♦rs✳ ■❢ ♦♥❡ ❛♣♣❡❛rs ❛s t❤❡ ❧❛st ♣❛tt❡r♥✱ ✐t ♠✐❣❤t ❜❡ t❛❦❡♥ ❛s ❛ ✈❛r✐❛❜❧❡ ♥❛♠❡✳ ▼② ❜♦♦❦ ❣✐✈❡s ❛♥ ❡①❛♠♣❧❡ ❬✶✸✱ ♣❛❣❡ ✶✸✶❪✳
❱■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✻✼ A Datatype with Constructor Functions datatype vehicle = Bike | Motorbike of int Slide 703 | Car of bool | Lorry of int; • Constructor functions (like Lorry ) make distinct values . • Different kinds of vehicle can belong to one list: [Bike, Car true, Motorbike 450]; ▼▲ ❣❡♥❡r❛❧✐③❡s t❤❡ ♥♦t✐♦♥ ♦❢ ❡♥✉♠❡r❛t✐♦♥ t②♣❡ t♦ ❛❧❧♦✇ ❞❛t❛ t♦ ❜❡ ❛ss♦✲ ❝✐❛t❡❞ ✇✐t❤ ❡❛❝❤ ❝♦♥str✉❝t♦r✳ ❚❤❡ ❝♦♥str✉❝t♦r ❇✐❦❡ ✐s ❛ ✈❡❤✐❝❧❡ ❛❧❧ ❜② ✐ts❡❧❢✱ ❜✉t t❤❡ ♦t❤❡r t❤r❡❡ ❝♦♥str✉❝t♦rs ❛r❡ ❢✉♥❝t✐♦♥s ❢♦r ❝r❡❛t✐♥❣ ✈❡❤✐❝❧❡s✳ ❙✐♥❝❡ ✇❡ ♠✐❣❤t ✜♥❞ ✐t ❤❛r❞ t♦ r❡♠❡♠❜❡r ✇❤❛t t❤❡ ✈❛r✐♦✉s ✐♥t ❛♥❞ ❜♦♦❧ ❝♦♠♣♦♥❡♥ts ❛r❡ ❢♦r✱ ✐t ✐s ✇✐s❡ t♦ ✐♥❝❧✉❞❡ ❝♦♠♠❡♥ts ✐♥ ❝♦♠♣❧❡① ❞❡❝❧❛r❛t✐♦♥s✳ ■♥ ▼▲✱ ❝♦♠♠❡♥ts ❛r❡ ❡♥❝❧♦s❡❞ ✐♥ t❤❡ ❜r❛❝❦❡ts ✭✯ ❛♥❞ ✯✮ ✳ Pr♦❣r❛♠♠❡rs s❤♦✉❧❞ ❝♦♠♠❡♥t t❤❡✐r ❝♦❞❡ t♦ ❡①♣❧❛✐♥ ❞❡s✐❣♥ ❞❡❝✐s✐♦♥s ❛♥❞ ❦❡② ❢❡❛t✉r❡s ♦❢ t❤❡ ❛❧❣♦r✐t❤♠s ✭s♦♠❡t✐♠❡s ❜② ❝✐t✐♥❣ ❛ r❡❢❡r❡♥❝❡ ✇♦r❦✮✳ ❞❛t❛t②♣❡ ✈❡❤✐❝❧❡ ❂ ❇✐❦❡ ⑤ ▼♦t♦r❜✐❦❡ ♦❢ ✐♥t ✭✯❡♥❣✐♥❡ s✐③❡ ✐♥ ❈❈s✯✮ ⑤ ❈❛r ♦❢ ❜♦♦❧ ✭✯tr✉❡ ✐❢ ❛ ❘❡❧✐❛♥t ❘♦❜✐♥✯✮ ⑤ ▲♦rr② ♦❢ ✐♥t❀ ✭✯♥✉♠❜❡r ♦❢ ✇❤❡❡❧s✯✮ ❚❤❡ ❧✐st s❤♦✇♥ ♦♥ t❤❡ s❧✐❞❡ r❡♣r❡s❡♥ts ❛ ❜✐❝②❝❧❡✱ ❛ ❘❡❧✐❛♥t ❘♦❜✐♥ ❛♥❞ ❛ ❧❛r❣❡ ♠♦t♦r❜✐❦❡✳ ■t ❝❛♥ ❜❡ ❛❧♠♦st s❡❡♥ ❛s ❛ ♠✐①❡❞✲t②♣❡ ❧✐st ❝♦♥t❛✐♥✐♥❣ ✐♥t❡❣❡rs ❛♥❞ ❜♦♦❧❡❛♥s✳ ■t ✐s ❛❝t✉❛❧❧② ❛ ❧✐st ♦❢ ✈❡❤✐❝❧❡s❀ ❞❛t❛t②♣❡s ❧❡ss❡♥ t❤❡ ✐♠♣❛❝t ♦❢ t❤❡ r❡str✐❝t✐♦♥ t❤❛t ❛❧❧ ❧✐st ❡❧❡♠❡♥ts ♠✉st ❤❛✈❡ t❤❡ s❛♠❡ t②♣❡✳
❱■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✻✽ A Finer Wheel Computation fun wheels Bike = 2 Slide 704 | wheels (Motorbike _) = 2 | wheels (Car robin) = if robin then 3 else 4 | wheels (Lorry w) = w; > val wheels = fn : vehicle -> int ❚❤✐s ❢✉♥❝t✐♦♥ ❝♦♥s✐sts ♦❢ ❢♦✉r ❝❧❛✉s❡s✿ • ❆ ❇✐❦❡ ❤❛s t✇♦ ✇❤❡❡❧s✳ • ❆ ▼♦t♦r❜✐❦❡ ❤❛s t✇♦ ✇❤❡❡❧s✳ • ❆ ❘❡❧✐❛♥t ❘♦❜✐♥ ❤❛s t❤r❡❡ ✇❤❡❡❧s❀ ❛❧❧ ♦t❤❡r ❝❛rs ❤❛✈❡ ❢♦✉r✳ • ❆ ▲♦rr② ❤❛s t❤❡ ♥✉♠❜❡r ♦❢ ✇❤❡❡❧s st♦r❡❞ ✇✐t❤ ✐ts ❝♦♥str✉❝t♦r✳ ❚❤❡r❡ ✐s ♥♦ ♦✈❡r❧❛♣ ❜❡t✇❡❡♥ t❤❡ ▼♦t♦r❜✐❦❡ ❛♥❞ ▲♦rr② ❝❛s❡s✳ ❆❧t❤♦✉❣❤ ▼♦t♦r❜✐❦❡ ❛♥❞ ▲♦rr② ❜♦t❤ ❤♦❧❞ ❛♥ ✐♥t❡❣❡r✱ ▼▲ t❛❦❡s t❤❡ ❝♦♥str✉❝t♦r ✐♥t♦ ❛❝❝♦✉♥t✳ ❆ ▼♦t♦r❜✐❦❡ ✐s ❞✐st✐♥❝t ❢r♦♠ ❛♥② ▲♦rr②✳ ❱❡❤✐❝❧❡s ❛r❡ ♦♥❡ ❡①❛♠♣❧❡ ♦❢ ❛ ❝♦♥❝❡♣t ❝♦♥s✐st✐♥❣ ♦❢ s❡✈❡r❛❧ ✈❛r✐❡t✐❡s ✇✐t❤ ❞✐st✐♥❝t ❢❡❛t✉r❡s✳ ▼♦st ♣r♦❣r❛♠♠✐♥❣ ❧❛♥❣✉❛❣❡s ❝❛♥ r❡♣r❡s❡♥t s✉❝❤ ❝♦♥❝❡♣ts ✉s✐♥❣ s♦♠❡t❤✐♥❣ ❛♥❛❧♦❣♦✉s t♦ ❞❛t❛t②♣❡s✳ ✭❚❤❡② ❛r❡ s♦♠❡t✐♠❡s ❝❛❧❧❡❞ ✉♥✐♦♥ t②♣❡s ♦r ✈❛r✐❛♥t r❡❝♦r❞s ✱ ✇❤♦s❡ t❛❣ ✜❡❧❞s ♣❧❛② t❤❡ r♦❧❡ ♦❢ t❤❡ ❝♦♥str✉❝t♦rs✳✮
❱■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✻✾ Nested Pattern-Matching fun greener (_, Bike) = false | greener (Bike, _) = true | greener (_, Motorbike _) = false Slide 705 | greener (Motorbike _, _) = true | greener (_, Car _) = false | greener (Car _, _) = true | greener (_, Lorry _) = false; note wildcards in patterns order of evaluation is crucial! ❋♦r ❛♥♦t❤❡r ❡①❛♠♣❧❡ ♦❢ ♣❛tt❡r♥✲♠❛t❝❤✐♥❣✱ ❤❡r❡ ✐s ❛ ❢✉♥❝t✐♦♥ t♦ ❝♦♠♣❛r❡ ✈❡❤✐❝❧❡s ❢♦r ❡♥✈✐r♦♥♠❡♥t❛❧ ❢r✐❡♥❞❧✐♥❡ss✳ ❆ ❇✐❦❡ ✐s ❣r❡❡♥❡r t❤❛♥ ❛ ▼♦t♦r❜✐❦❡✱ ✇❤✐❝❤ ✐s ❣r❡❡♥❡r t❤❛♥ ❛ ❈❛r✱ ✇❤✐❝❤ ✐s ❣r❡❡♥❡r t❤❛♥ ❛ ▲♦rr②✳ ❚❤❡ ❝♦❞❡ s❤♦✇♥ ❛❜♦✈❡ ✐s ❝♦♠♣❧✐❝❛t❡❞ ❛♥❞ r❡❧✐❡s ❤❡❛✈✐❧② ♦♥ ▼▲✬s ♦r❞❡r ♦❢ ❡✈❛❧✉❛t✐♦♥✳ ◆♦t❤✲ ✐♥❣ ✐s ❣r❡❡♥❡r t❤❛♥ ❛ ❇✐❦❡❀ ❛ ❇✐❦❡ ✐s ❣r❡❡♥❡r t❤❛♥ ❡✈❡r②t❤✐♥❣ ❡❧s❡❀ ♥♦t❤✐♥❣ ❧❡❢t ✭❇✐❦❡s ❤❛✈❡ ❜❡❡♥ ❞❡❛❧t ✇✐t❤✮ ✐s ❣r❡❡♥❡r t❤❛♥ ❛ ▼♦t♦r❜✐❦❡✱ ❡t❝✳ ❚❤❡ ❛❧t❡r♥❛t✐♥❣ tr✉❡ s ❛♥❞ ❢❛❧s❡ s ♠❛❦❡ t❤❡ ❝♦❞❡ ❤❛r❞ t♦ r❡❛❞✳ ❈❧❡❛r❡r ✐s t♦ ❧✐st ❛❧❧ t❤❡ tr✉❡ ❝❛s❡s ❛♥❞ ❧❡t ♦♥❡ ✇✐❧❞❝❛r❞ ❝❛t❝❤ ❛❧❧ t❤❡ ❢❛❧s❡ ♦♥❡s✳ ❇✉t ✇❤❛t ❤❛♣♣❡♥s ✐♥ t❤✐s st②❧❡ ✐❢ ✇❡ ❛❞❞ ❛ ❢❡✇ ♠♦r❡ ❝♦♥str✉❝t♦rs❄ ❢✉♥ ❣r❡❡♥❡r ✭❇✐❦❡✱ ▼♦t♦r❜✐❦❡ ❴✮ ❂ tr✉❡ ⑤ ❣r❡❡♥❡r ✭❇✐❦❡✱ ❈❛r ❴✮ ❂ tr✉❡ ⑤ ❣r❡❡♥❡r ✭❇✐❦❡✱ ▲♦rr② ❴✮ ❂ tr✉❡ ⑤ ❣r❡❡♥❡r ✭▼♦t♦r❜✐❦❡ ❴✱ ❈❛r ❴✮ ❂ tr✉❡ ⑤ ❣r❡❡♥❡r ✭▼♦t♦r❜✐❦❡ ❴✱ ▲♦rr② ❴✮ ❂ tr✉❡ ⑤ ❣r❡❡♥❡r ✭❈❛r ❴✱ ▲♦rr② ❴✮ ❂ tr✉❡ ⑤ ❣r❡❡♥❡r ❴ ❂ ❢❛❧s❡❀ ❈❧❛✉s❡s t❤❛t ❞❡♣❡♥❞ ✉♣♦♥ t❤❡ ♦r❞❡r ♦❢ ❡✈❛❧✉❛t✐♦♥ ❛r❡ ♥♦t tr✉❡ ❡q✉❛t✐♦♥s✳ ■❢ t❤❡r❡ ❛r❡ ♠❛♥② ❝♦♥str✉❝t♦rs✱ t❤❡ ❜❡st ✇❛② ♦❢ ❝♦♠♣❛r✐♥❣ t❤❡♠ ✐s ❜② ♠❛♣♣✐♥❣ ❜♦t❤ t♦ ✐♥t❡❣❡rs ❛♥❞ ❝♦♠♣❛r✐♥❣ t❤♦s❡ ✭✉s✐♥❣ < ✮✳ ❚❤❡ ♣♦✐♥t t♦ t❛❦❡ ❢r♦♠ t❤✐s ❡①❛♠♣❧❡ ✐s t❤❛t ♣❛tt❡r♥s ♠❛② ❝♦♠❜✐♥❡ ❞❛t❛t②♣❡ ❝♦♥str✉❝t♦rs ✇✐t❤ t✉♣❧❡s✱ ❧✐sts✱ ♥✉♠❜❡rs✱ str✐♥❣s✱ ❡t❝✳ ❚❤❡r❡ ✐s ♥♦ ❧✐♠✐t ♦♥ t❤❡ s✐③❡ ♦❢ ♣❛tt❡r♥s ♦r t❤❡ ♥✉♠❜❡r ♦❢ ❝❧❛✉s❡s ✐♥ ❛ ❢✉♥❝t✐♦♥ ❞❡❝❧❛r❛✲ t✐♦♥✳ ▼♦st ▼▲ s②st❡♠s ♣❡r❢♦r♠ ♣❛tt❡r♥✲♠❛t❝❤✐♥❣ ❡✣❝✐❡♥t❧②✳
❱■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✼✵ Error Handling: Exceptions What if a FAULT occurs during a computation? • (Arithmetic overflow or division by zero are hard to predict.) Slide 706 Exception-handling lets us recover gracefully. • Raising an exception abandons the current computation. • Handling the exception attempts an alternative computation. • The raising and handling can be far apart in the code. • Errors of different sorts can be handled separately. ❊①❝❡♣t✐♦♥s ❛r❡ ♥❡❝❡ss❛r② ❜❡❝❛✉s❡ ✐t ✐s ♥♦t ❛❧✇❛②s ♣♦ss✐❜❧❡ t♦ t❡❧❧ ✐♥ ❛❞✲ ✈❛♥❝❡ ✇❤❡t❤❡r ♦r ♥♦t ❛ ❛ s❡❛r❝❤ ✇✐❧❧ ❧❡❛❞ t♦ ❛ ❞❡❛❞ ❡♥❞ ♦r ✇❤❡t❤❡r ❛ ♥✉♠❡r✐❝❛❧ ❝❛❧❝✉❧❛t✐♦♥ ✇✐❧❧ ❡♥❝♦✉♥t❡r ❡rr♦rs s✉❝❤ ❛s ♦✈❡r✢♦✇ ♦r ❞✐✈✐❞❡ ❜② ③❡r♦✳ ❘❛t❤❡r t❤❛♥ ❥✉st ❝r❛s❤✐♥❣✱ ♣r♦❣r❛♠s s❤♦✉❧❞ ❝❤❡❝❦ ✇❤❡t❤❡r t❤✐♥❣s ❤❛✈❡ ❣♦♥❡ ✇r♦♥❣✱ ❛♥❞ ♣❡r❤❛♣s ❛tt❡♠♣t ❛♥ ❛❧t❡r♥❛t✐✈❡ ❝♦♠♣✉t❛t✐♦♥ ✭♣❡r❤❛♣s ✉s✐♥❣ ❛ ❞✐✛❡r✲ ❡♥t ❛❧❣♦r✐t❤♠ ♦r ❤✐❣❤❡r ♣r❡❝✐s✐♦♥✮✳ ❆ ♥✉♠❜❡r ♦❢ ♠♦❞❡r♥ ❧❛♥❣✉❛❣❡s ♣r♦✈✐❞❡ ❡①❝❡♣t✐♦♥ ❤❛♥❞❧✐♥❣✳
❱■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✼✶ Exceptions in ML exception Failure; Declaring exception NoChange of int; Slide 707 raise Failure Raising raise (NoChange n ) E handle P 1 => E 1 | ... | P n => E n Handling ❊❛❝❤ ❡①❝❡♣t✐♦♥ ❞❡❝❧❛r❛t✐♦♥ ✐♥tr♦❞✉❝❡s ❛ ❞✐st✐♥❝t s♦rt ♦❢ ❡①❝❡♣t✐♦♥✱ ✇❤✐❝❤ ❝❛♥ ❜❡ ❤❛♥❞❧❡❞ s❡♣❛r❛t❡❧② ❢r♦♠ ♦t❤❡rs✳ ❊①❝❡♣t✐♦♥ ♥❛♠❡s ❛r❡ ❝♦♥str✉❝t♦rs ♦❢ t❤❡ s♣❡❝✐❛❧ ❞❛t❛t②♣❡ ❡①♥ ✳ ❚❤✐s ✐s ❛ ♣❡❝✉❧✐❛r✐t② ♦❢ ▼▲ t❤❛t ❧❡ts ❡①❝❡♣t✐♦♥✲ ❤❛♥❞❧❡rs ✉s❡ ♣❛tt❡r♥✲♠❛t❝❤✐♥❣✳ ◆♦t❡ t❤❛t ❡①❝❡♣t✐♦♥ ❋❛✐❧✉r❡ ✐s ❥✉st ❛♥ ❡rr♦r ✐♥❞✐❝❛t✐♦♥✱ ✇❤✐❧❡ ◆♦❈❤❛♥❣❡ n ❝❛rr✐❡s ❢✉rt❤❡r ✐♥❢♦r♠❛t✐♦♥✿ t❤❡ ✐♥t❡❣❡r n ✳ ❚❤❡ ❡✛❡❝t ♦❢ r❛✐s❡ E ✐s t♦ ❛❜♦rt ❢✉♥❝t✐♦♥ ❝❛❧❧s r❡♣❡❛t❡❞❧② ✉♥t✐❧ ❡♥❝♦✉♥✲ t❡r✐♥❣ ❛ ❤❛♥❞❧❡r t❤❛t ♠❛t❝❤❡s E ✳ ❚❤❡ ♠❛t❝❤✐♥❣ ❤❛♥❞❧❡r ❝❛♥ ♦♥❧② ❜❡ ❢♦✉♥❞ ❞②✲ ♥❛♠✐❝❛❧❧② ✭❞✉r✐♥❣ ❡①❡❝✉t✐♦♥✮❀ ❝♦♥tr❛st ✇✐t❤ ❤♦✇ ▼▲ ❛ss♦❝✐❛t❡s ♦❝❝✉rr❡♥❝❡s ♦❢ ✐❞❡♥t✐✜❡rs ✇✐t❤ t❤❡✐r ♠❛t❝❤✐♥❣ ❞❡❝❧❛r❛t✐♦♥s✱ ✇❤✐❝❤ ❞♦❡s ♥♦t r❡q✉✐r❡ r✉♥✲ ♥✐♥❣ t❤❡ ♣r♦❣r❛♠✳ ❖♥❡ ❝r✐t✐❝✐s♠ ♦❢ ▼▲✬s ❡①❝❡♣t✐♦♥s ✐s t❤❛t✖✉♥❧✐❦❡ t❤❡ ❏❛✈❛ ❧❛♥❣✉❛❣❡ ✖ ♥♦t❤✐♥❣ ✐♥ ❛ ❢✉♥❝t✐♦♥ ❞❡❝❧❛r❛t✐♦♥ ✐♥❞✐❝❛t❡s ✇❤✐❝❤ ❡①❝❡♣t✐♦♥s ✐t ♠✐❣❤t r❛✐s❡✳ ❖♥❡ ❛❧t❡r♥❛t✐✈❡ t♦ ❡①❝❡♣t✐♦♥s ✐s t♦ ✐♥st❡❛❞ r❡t✉r♥ ❛ ✈❛❧✉❡ ♦❢ ❞❛t❛t②♣❡ ♦♣t✐♦♥ ✳ ❞❛t❛t②♣❡ ✬❛ ♦♣t✐♦♥ ❂ ◆❖◆❊ ⑤ ❙❖▼❊ ♦❢ ✬❛❀ ◆❖◆❊ s✐❣♥✐✜❡s ❡rr♦r✱ ✇❤✐❧❡ ❙❖▼❊ x r❡t✉r♥s t❤❡ s♦❧✉t✐♦♥ x ✳ ❚❤✐s ❛♣♣r♦❛❝❤ ❧♦♦❦s ❝❧❡❛♥✱ ❜✉t t❤❡ ❞r❛✇❜❛❝❦ ✐s t❤❛t ♠❛♥② ♣❧❛❝❡s ✐♥ t❤❡ ❝♦❞❡ ✇♦✉❧❞ ❤❛✈❡ t♦ ❝❤❡❝❦ ❢♦r ◆❖◆❊ ✳
❱■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✼✷ Making Change with Exceptions exception Change; fun change (till, 0) = [] Slide 708 | change ([], amt) = raise Change | change (c::till, amt) = if amt<0 then raise Change else (c :: change(c::till, amt-c)) handle Change => change(till, amt) ; > val change = fn : int list * int -> int list ■♥ ▲❡❝t✳ ✺ ✇❡ ❝♦♥s✐❞❡r❡❞ t❤❡ ♣r♦❜❧❡♠ ♦❢ ♠❛❦✐♥❣ ❝❤❛♥❣❡✳ ❚❤❡ ❣r❡❡❞② ❛❧❣♦r✐t❤♠ ♣r❡s❡♥t❡❞ t❤❡r❡ ❝♦✉❧❞ ♥♦t ❡①♣r❡ss ✻ ✉s✐♥❣ ✺ ❛♥❞ ✷ ❜❡❝❛✉s❡ ✐t ❛❧✇❛②s t♦♦❦ t❤❡ ❧❛r❣❡st ❝♦✐♥✳ ❘❡t✉r♥✐♥❣ t❤❡ ❧✐st ♦❢ ❛❧❧ ♣♦ss✐❜❧❡ s♦❧✉t✐♦♥s ❛✈♦✐❞s t❤❛t ♣r♦❜❧❡♠ r❛t❤❡r ❡①♣❡♥s✐✈❡❧②✿ ✇❡ ♦♥❧② ♥❡❡❞ ♦♥❡ s♦❧✉t✐♦♥✳ ❯s✐♥❣ ❡①❝❡♣t✐♦♥s✱ ✇❡ ❝❛♥ ❝♦❞❡ ❛ ❜❛❝❦tr❛❝❦✐♥❣ ❛❧❣♦r✐t❤♠✿ ♦♥❡ t❤❛t ❝❛♥ ✉♥❞♦ ♣❛st ❞❡❝✐s✐♦♥s ✐❢ ✐t ❝♦♠❡s t♦ ❛ ❞❡❛❞ ❡♥❞✳ ❚❤❡ ❡①❝❡♣t✐♦♥ ❈❤❛♥❣❡ ✐s r❛✐s❡❞ ✐❢ ✇❡ r✉♥ ♦✉t ♦❢ ❝♦✐♥s ✭✇✐t❤ ❛ ♥♦♥✲③❡r♦ ❛♠♦✉♥t✮ ♦r ✐❢ t❤❡ ❛♠♦✉♥t ❣♦❡s ♥❡❣❛t✐✈❡✳ ❲❡ ❛❧✇❛②s tr② t❤❡ ❧❛r❣❡st ❝♦✐♥✱ ❜✉t ❡♥❝❧♦s❡ t❤❡ r❡❝✉rs✐✈❡ ❝❛❧❧ ✐♥ ❛♥ ❡①❝❡♣t✐♦♥ ❤❛♥❞❧❡r✱ ✇❤✐❝❤ ✉♥❞♦❡s t❤❡ ❝❤♦✐❝❡ ✐❢ ✐t ❣♦❡s ✇r♦♥❣✳ ❈❛r❡❢✉❧❧② ♦❜s❡r✈❡ ❤♦✇ ❡①❝❡♣t✐♦♥s ✐♥t❡r❛❝t ✇✐t❤ r❡❝✉rs✐♦♥✳ ❚❤❡ ❡①❝❡♣t✐♦♥ ❤❛♥❞❧❡r ❛❧✇❛②s ✉♥❞♦❡s t❤❡ ♠♦st r❡❝❡♥t ❝❤♦✐❝❡✱ ❧❡❛✈✐♥❣ ♦t❤❡rs ♣♦ss✐❜❧② t♦ ❜❡ ✉♥❞♦♥❡ ❧❛t❡r✳ ■❢ ♠❛❦✐♥❣ ❝❤❛♥❣❡ r❡❛❧❧② ✐s ✐♠♣♦ss✐❜❧❡✱ t❤❡♥ ❡✈❡♥t✉❛❧❧② ❡①❝❡♣✲ t✐♦♥ ❈❤❛♥❣❡ ✇✐❧❧ ❜❡ r❛✐s❡❞ ✇✐t❤ ♥♦ ❤❛♥❞❧❡r t♦ ❝❛t❝❤ ✐t✱ ❛♥❞ ✐t ✇✐❧❧ ❜❡ r❡♣♦rt❡❞ ❛t t♦♣ ❧❡✈❡❧✳
❱■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✼✸ Binary Trees, a Recursive Datatype datatype ’a tree = Lf | Br of ’a * ’a tree * ’a tree Slide 709 1� 2� 3� 4� 5� Br(1, Br(2, Br(4, Lf, Lf), Br(5, Lf, Lf)), Br(3, Lf, Lf)) ❆ ❞❛t❛ str✉❝t✉r❡ ✇✐t❤ ♠✉❧t✐♣❧❡ ❜r❛♥❝❤✐♥❣ ✐s ❝❛❧❧❡❞ ❛ tr❡❡ ✳ ❚r❡❡s ❝❛♥ r❡♣r❡s❡♥t ♠❛t❤❡♠❛t✐❝❛❧ ❡①♣r❡ss✐♦♥s✱ ❧♦❣✐❝❛❧ ❢♦r♠✉❧❛❡✱ ❝♦♠♣✉t❡r ♣r♦❣r❛♠s✱ t❤❡ ♣❤r❛s❡ str✉❝t✉r❡ ♦❢ ❊♥❣❧✐s❤ s❡♥t❡♥❝❡s✱ ❡t❝✳ ❇✐♥❛r② tr❡❡s ❛r❡ ♥❡❛r❧② ❛s ❢✉♥❞❛♠❡♥t❛❧ ❛s ❧✐sts✳ ❚❤❡② ❝❛♥ ♣r♦✈✐❞❡ ❡✣❝✐❡♥t st♦r❛❣❡ ❛♥❞ r❡tr✐❡✈❛❧ ♦❢ ✐♥❢♦r♠❛t✐♦♥✳ ■♥ ❛ ❜✐♥❛r② tr❡❡✱ ❡❛❝❤ ♥♦❞❡ ✐s ❡♠♣t② ✭ Lf ✮✱ ♦r ✐s ❛ ❜r❛♥❝❤ ✭ Br ✮ ✇✐t❤ ❛ ❧❛❜❡❧ ❛♥❞ t✇♦ s✉❜tr❡❡s✳ ▲✐sts t❤❡♠s❡❧✈❡s ❝♦✉❧❞ ❜❡ ❞❡❝❧❛r❡❞ ✉s✐♥❣ ❞❛t❛t②♣❡✿ ❞❛t❛t②♣❡ ✬❛ ❧✐st ❂ ♥✐❧ ⑤ ❝♦♥s ♦❢ ✬❛ ✯ ✬❛ ❧✐st ❲❡ ❝♦✉❧❞ ❡✈❡♥ ❞❡❝❧❛r❡ ✿✿ ❛s ❛♥ ✐♥✜① ❝♦♥str✉❝t♦r ✳ ❚❤❡ ♦♥❧② t❤✐♥❣ ✇❡ ❝♦✉❧❞ ♥♦t ❞❡✜♥❡ ✐s t❤❡ ❬ ✳ ✳ ✳ ❪ ♥♦t❛t✐♦♥✱ ✇❤✐❝❤ ✐s ♣❛rt ♦❢ t❤❡ ▼▲ ❣r❛♠♠❛r✳
❱■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✼✹ Basic Properties of Binary Trees # of branch nodes fun count Lf = 0 | count(Br(v,t1,t2)) = 1 + count t1 + count t2 Slide 710 fun depth Lf = 0 length of longest path | depth(Br(v,t1,t2)) = 1 + max(depth t1, depth t2) count ( t ) ≤ 2 depth ( t ) − 1 ❋✉♥❝t✐♦♥s ♦♥ tr❡❡s ❛r❡ ❡①♣r❡ss❡❞ r❡❝✉rs✐✈❡❧② ✉s✐♥❣ ♣❛tt❡r♥✲♠❛t❝❤✐♥❣✳ ❇♦t❤ ❢✉♥❝t✐♦♥s ❛❜♦✈❡ ❛r❡ ❛♥❛❧♦❣♦✉s t♦ ❧❡♥❣t❤ ♦♥ ❧✐sts✳ ❍❡r❡ ✐s ❛ t❤✐r❞ ♠❡❛s✉r❡ ♦❢ ❛ tr❡❡✬s s✐③❡✿ ❢✉♥ ❧❡❛✈❡s ▲❢ ❂ ✶ ⑤ ❧❡❛✈❡s ✭❇r✭✈✱t✶✱t✷✮✮ ❂ ❧❡❛✈❡s t✶ ✰ ❧❡❛✈❡s t✷❀ ❚❤✐s ❢✉♥❝t✐♦♥ ✐s r❡❞✉♥❞❛♥t ❜❡❝❛✉s❡ ♦❢ ❛ ❜❛s✐❝ ❢❛❝t ❛❜♦✉t tr❡❡s✱ ✇❤✐❝❤ ❝❛♥ ❜❡ ♣r♦✈❡❞ ❜② ✐♥❞✉❝t✐♦♥✿ ❢♦r ❡✈❡r② tr❡❡ t ✱ ✇❡ ❤❛✈❡ ❧❡❛✈❡s ( t ) = ❝♦✉♥t ( t )+1 ✳ ❚❤❡ ✐♥❡q✉❛❧✐t② s❤♦✇♥ ♦♥ t❤❡ s❧✐❞❡ ❛❧s♦ ❤❛s ❛♥ ❡❧❡♠❡♥t❛r② ♣r♦♦❢ ❜② ✐♥❞✉❝t✐♦♥✳ ❆ tr❡❡ ♦❢ ❞❡♣t❤ ✷✵ ❝❛♥ st♦r❡ 2 20 − 1 ♦r ❛♣♣r♦①✐♠❛t❡❧② ♦♥❡ ♠✐❧❧✐♦♥ ❡❧❡♠❡♥ts✳ ❚❤❡ ❛❝❝❡ss ♣❛t❤s t♦ t❤❡s❡ ❡❧❡♠❡♥ts ❛r❡ s❤♦rt✱ ♣❛rt✐❝✉❧❛r❧② ✇❤❡♥ ❝♦♠♣❛r❡❞ ✇✐t❤ ❛ ♠✐❧❧✐♦♥✲❡❧❡♠❡♥t ❧✐st✦
❱■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✼✺ Traversing Trees (3 Methods) fun preorder Lf = [] | preorder(Br(v,t1,t2)) = [v] @ preorder t1 @ preorder t2; Slide 711 fun inorder Lf = [] | inorder(Br(v,t1,t2)) = inorder t1 @ [v] @ inorder t2; fun postorder Lf = [] | postorder(Br(v,t1,t2)) = postorder t1 @ postorder t2 @ [v]; ❚r❡❡ tr❛✈❡rs❛❧ ♠❡❛♥s ❡①❛♠✐♥✐♥❣ ❡❛❝❤ ♥♦❞❡ ♦❢ ❛ tr❡❡ ✐♥ s♦♠❡ ♦r❞❡r✳ ❉✳ ❊✳ ❑♥✉t❤ ❤❛s ✐❞❡♥t✐✜❡❞ t❤r❡❡ ❢♦r♠s ♦❢ tr❡❡ tr❛✈❡rs❛❧✿ ♣r❡♦r❞❡r✱ ✐♥♦r❞❡r ❛♥❞ ♣♦st♦r❞❡r ❬✶✵❪✳ ❲❡ ❝❛♥ ❝♦❞❡ t❤❡s❡ ❵✈✐s✐t✐♥❣ ♦r❞❡rs✬ ❛s ❢✉♥❝t✐♦♥s t❤❛t ❝♦♥✈❡rt tr❡❡s ✐♥t♦ ❧✐sts ♦❢ ❧❛❜❡❧s✳ ❆❧❣♦r✐t❤♠s ❜❛s❡❞ ♦♥ t❤❡s❡ ♥♦t✐♦♥s t②♣✐❝❛❧❧② ♣❡r❢♦r♠ s♦♠❡ ❛❝t✐♦♥ ❛t ❡❛❝❤ ♥♦❞❡❀ t❤❡ ❢✉♥❝t✐♦♥s ❛❜♦✈❡ s✐♠♣❧② ❝♦♣② t❤❡ ♥♦❞❡s ✐♥t♦ ❧✐sts✳ ❈♦♥s✐❞❡r t❤❡ tr❡❡ ❆ ✴ ❭ ❇ ❈ ✴ ❭ ✴ ❭ ❉ ❊ ❋ ● • ♣r❡♦r❞❡r ✈✐s✐ts t❤❡ ❧❛❜❡❧ ✜rst ✭❵P♦❧✐s❤ ♥♦t❛t✐♦♥✬✮✱ ②✐❡❧❞✐♥❣ ❆❇❉❊❈❋● • ✐♥♦r❞❡r ✈✐s✐ts t❤❡ ❧❛❜❡❧ ♠✐❞✇❛②✱ ②✐❡❧❞✐♥❣ ❉❇❊❆❋❈● • ♣♦st♦r❞❡r ✈✐s✐ts t❤❡ ❧❛❜❡❧ ❧❛st ✭❵❘❡✈❡rs❡ P♦❧✐s❤✬✮✱ ②✐❡❧❞✐♥❣ ❉❊❇❋●❈❆
❱■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✼✻ Efficiently Traversing Trees fun preord (Lf, vs) = vs | preord (Br(v,t1,t2), vs) = v :: preord (t1, preord (t2, vs)); Slide 712 fun inord (Lf, vs) = vs | inord (Br(v,t1,t2), vs) = inord (t1, v::inord (t2, vs)); fun postord (Lf, vs) = vs | postord (Br(v,t1,t2), vs) = postord (t1, postord (t2, v::vs)); ❯♥❢♦rt✉♥❛t❡❧②✱ t❤❡ ❢✉♥❝t✐♦♥s s❤♦✇♥ ♦♥ t❤❡ ♣r❡✈✐♦✉s s❧✐❞❡ ❛r❡ q✉❛❞r❛t✐❝ ✐♥ t❤❡ ✇♦rst ❝❛s❡✿ t❤❡ ❛♣♣❡♥❞s ✐♥ t❤❡ r❡❝✉rs✐✈❡ ❝❛❧❧s ❛r❡ ✐♥❡✣❝✐❡♥t✳ ❚♦ ❝♦rr❡❝t t❤❛t ♣r♦❜❧❡♠✱ ✇❡ ✭❛s ✉s✉❛❧✮ ❛❞❞ ❛♥ ❛❝❝✉♠✉❧❛t✐♥❣ ❛r❣✉♠❡♥t✳ ❖❜s❡r✈❡ ❤♦✇ ❡❛❝❤ ❢✉♥❝t✐♦♥ ❝♦♥str✉❝ts ✐ts r❡s✉❧t ❧✐st ❛♥❞ ❝♦♠♣❛r❡ ✇✐t❤ ❤♦✇ ❛♣♣❡♥❞s ✇❡r❡ ❡❧✐♠✐♥❛t❡❞ ❢r♦♠ q✉✐❝❦s♦rt ✐♥ ▲❡❝t✳ ✻✳ ❖♥❡ ❝❛♥ ♣r♦✈❡ ❡q✉❛t✐♦♥s r❡❧❛t✐♥❣ ❡❛❝❤ ♦❢ t❤❡s❡ ❢✉♥❝t✐♦♥s t♦ ✐ts ❝♦✉♥t❡r♣❛rt ♦♥ t❤❡ ♣r❡✈✐♦✉s s❧✐❞❡✳ ❋♦r ❡①❛♠♣❧❡✱ ✐♥♦r❞ ( t, vs ) = ✐♥♦r❞❡r ( t )@ vs
❱■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✼✼ ❘❡❧❛t❡❞ ♠❛t❡r✐❛❧ ✐s ✐♥ ▼▲ ❢♦r t❤❡ ❲♦r❦✐♥❣ Pr♦❣r❛♠♠❡r ✱ ▲❡❛r♥✐♥❣ ❣✉✐❞❡✳ ♣❛❣❡s ✶✷✸✕✶✹✼✳ ❙❤♦✇ t❤❛t t❤❡ ❢✉♥❝t✐♦♥s ♣r❡♦r❞❡r ✱ ✐♥♦r❞❡r ❛♥❞ ♣♦st♦r❞❡r ❊①❡r❝✐s❡ ✼✳✶ ❛❧❧ r❡q✉✐r❡ O ( n 2 ) t✐♠❡ ✐♥ t❤❡ ✇♦rst ❝❛s❡✱ ✇❤❡r❡ n ✐s t❤❡ s✐③❡ ♦❢ t❤❡ tr❡❡✳ ❙❤♦✇ t❤❛t t❤❡ ❢✉♥❝t✐♦♥s ♣r❡♦r❞ ✱ ✐♥♦r❞ ❛♥❞ ♣♦st♦r❞ ❛❧❧ t❛❦❡ ❊①❡r❝✐s❡ ✼✳✷ ❧✐♥❡❛r t✐♠❡ ✐♥ t❤❡ s✐③❡ ♦❢ t❤❡ tr❡❡✳
❱■■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✼✽ Dictionaries • lookup : find an item in the dictionary • update : store an item in the dictionary Slide 801 • delete : remove an item from the dictionary • empty : the null dictionary • Missing : exception for errors in lookup and delete Our abstract type supports these operations . . . but hides the implementation! ❆ ❞✐❝t✐♦♥❛r② ✐s ❛ ❞❛t❛ str✉❝t✉r❡ t❤❛t ❛ss♦❝✐❛t❡s ✈❛❧✉❡s t♦ ❝❡rt❛✐♥ ✐❞❡♥✲ t✐✜❡rs✱ ❝❛❧❧❡❞ ❦❡②s ✳ ❲❤❡♥ ❝❤♦♦s✐♥❣ t❤❡ ✐♥t❡r♥❛❧ r❡♣r❡s❡♥t❛t✐♦♥ ❢♦r ❛ ❞❛t❛ str✉❝t✉r❡✱ ✐t ✐s ❡ss❡♥t✐❛❧ t♦ s♣❡❝✐❢② t❤❡ ❢✉❧❧ s❡t ♦❢ ♦♣❡r❛t✐♦♥s t❤❛t ♠✉st ❜❡ s✉♣♣♦rt❡❞✳ ❙❡❧❞♦♠ ✐s ♦♥❡ r❡♣r❡s❡♥t❛t✐♦♥ ❜❡st ❢♦r ❛❧❧ ♣♦ss✐❜❧❡ ❛♣♣❧✐❝❛t✐♦♥s ♦❢ ❛ ❞❛t❛ str✉❝t✉r❡❀ ❡❛❝❤ ✇✐❧❧ s✉♣♣♦rt s♦♠❡ ♦♣❡r❛t✐♦♥s ✇❡❧❧ ❛♥❞ ♦t❤❡rs ❜❛❞❧②✳ ❲❡ ❝♦♥s✐❞❡r s✐♠♣❧❡ ❞✐❝t✐♦♥❛r✐❡s t❤❛t s✉♣♣♦rt ♦♥❧② ✉♣❞❛t❡ ✭❛ss♦❝✐❛t✐♥❣ ❛ ✈❛❧✉❡ ✇✐t❤ ❛♥ ✐❞❡♥t✐✜❡r✮ ❛♥❞ ❧♦♦❦✉♣ ✭s❡❛r❝❤✐♥❣ ❢♦r t❤❡ ✈❛❧✉❡ ❛ss♦❝✐❛t❡❞ ✇✐t❤ ❛♥ ✐❞❡♥t✐✜❡r✮✳ ❖t❤❡r ♦♣❡r❛t✐♦♥s t❤❛t ❝♦✉❧❞ ❜❡ ❝♦♥s✐❞❡r❡❞ ❛r❡ ❞❡❧❡t❡ ✭r❡♠♦✈✐♥❣ ❛♥ ❛ss♦❝✐❛t✐♦♥✮ ❛♥❞ ♠❡r❣❡ ✭❝♦♠❜✐♥✐♥❣ t✇♦ ❞✐❝t✐♦♥❛r✐❡s✮✳ ❙✐♥❝❡ ✇❡ ❛r❡ ♣r♦❣r❛♠♠✐♥❣ ✐♥ ❛ ❢✉♥❝t✐♦♥❛❧ st②❧❡✱ ✉♣❞❛t❡ ✇✐❧❧ ♥♦t ♠♦❞✐❢② t❤❡ ❞❛t❛ str✉❝t✉r❡✳ ■♥st❡❛❞✱ ✐t ✇✐❧❧ r❡t✉r♥ ❛ ♠♦❞✐✜❡❞ ❞❛t❛ str✉❝t✉r❡✳ ❚❤✐s ❝❛♥ ❜❡ ❞♦♥❡ ❡✣❝✐❡♥t❧② ✐❢ ✇❡ ❛r❡ ❝❛r❡❢✉❧ t♦ ❛✈♦✐❞ ❡①❝❡ss✐✈❡ ❝♦♣②✐♥❣✳ ▲♦♦❦✉♣ ❛♥❞ ❞❡❧❡t❡ ❢❛✐❧ ✉♥❧❡ss t❤❡② ✜♥❞ t❤❡ ❞❡s✐r❡❞ ❦❡②✳ ❲❡ ✉s❡ ▼▲✬s ❡①❝❡♣t✐♦♥s t♦ s✐❣♥❛❧ ❢❛✐❧✉r❡✳ ▼♦❞❡r♥ ♣r♦❣r❛♠♠✐♥❣ ❧❛♥❣✉❛❣❡s ♣r♦✈✐❞❡ ❛ ♠❡❛♥s ♦❢ ❞❡❝❧❛r✐♥❣ ❛❜str❛❝t t②♣❡s t❤❛t ❡①♣♦rt ✇❡❧❧✲❞❡✜♥❡❞ ♦♣❡r❛t✐♦♥s ✇❤✐❧❡ ❤✐❞✐♥❣ ❧♦✇✲❧❡✈❡❧ ✐♠♣❧❡♠❡♥✲ t❛t✐♦♥ ❞❡t❛✐❧s s✉❝❤ ❛s t❤❡ ❞❛t❛ str✉❝t✉r❡ ✉s❡❞ t♦ r❡♣r❡s❡♥t ❞✐❝t✐♦♥❛r✐❡s✳ ▼▲ ♣r♦✈✐❞❡s ♠♦❞✉❧❡s ❢♦r t❤✐s ♣✉r♣♦s❡✱ ❜✉t t❤✐s ❝♦✉rs❡ ❞♦❡s ♥♦t ❝♦✈❡r t❤❡♠✳ ✭❚❤❡ ❏❛✈❛ ❝♦✉rs❡ ❝♦✈❡rs ♠♦❞✉❧❛r✐t②✳✮ ❚❤❡r❡❢♦r❡✱ ✇❡ s❤❛❧❧ s✐♠♣❧② ❞❡❝❧❛r❡ t❤❡ ❞✐❝t✐♦✲ ♥❛r② ♦♣❡r❛t✐♦♥s ✐♥❞✐✈✐❞✉❛❧❧② ❛t t♦♣ ❧❡✈❡❧✳ ❲❡ s❤❛❧❧ ❡♥❝♦✉♥t❡r ♠❛♥② ✈❡rs✐♦♥s ♦❢ ❧♦♦❦✉♣ ✱ ❢♦r ❡①❛♠♣❧❡✱ t❤❛t ♦✉❣❤t t♦ ❜❡ ♣❛❝❦❛❣❡❞ ✐♥ s❡♣❛r❛t❡ ♠♦❞✉❧❡s t♦ ♣r❡✈❡♥t ❝❧❛s❤❡s✳
❱■■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✼✾ Association Lists: Lists of Pairs exception Missing; fun lookup ([], a) = raise Missing | lookup ((x,y)::pairs, a) = Slide 802 if a=x then y else lookup(pairs, a); > val lookup = fn : (’’a * ’b) list * ’’a -> ’b fun update(l, b, y) = (b,y)::l P ROBLEMS : Linear search is slow. The lists get too long! ❆ ❧✐st ♦❢ ♣❛✐rs ✐s t❤❡ ♠♦st ♦❜✈✐♦✉s r❡♣r❡s❡♥t❛t✐♦♥ ❢♦r ❛ ❞✐❝t✐♦♥❛r②✳ ▲♦♦❦✉♣ ✐s ❜② ❧✐♥❡❛r s❡❛r❝❤✱ ✇❤✐❝❤ ✇❡ ❦♥♦✇ t♦ ❜❡ ♣r♦❤✐❜✐t✐✈❡❧② s❧♦✇✿ O ( n ) ✳ ❆ss♦❝✐❛t✐♦♥ ❧✐sts ❛r❡ ♦♥❧② ✉s❛❜❧❡ ✐❢ t❤❡r❡ ❛r❡ ❢❡✇ ❦❡②s ♦❢ ✐♥t❡r❡st✱ ❛❧✇❛②s ♥❡❛r t❤❡ ❢r♦♥t✳ ❍♦✇❡✈❡r✱ ♥♦t❡ ❧♦♦❦✉♣ ✬s t②♣❡✿ ❛ss♦❝✐❛t✐♦♥ ❧✐sts ✇♦r❦ ❢♦r ❛♥② ❡q✉❛❧✐t② t②♣❡✳ ❚❤✐s ❣❡♥❡r❛❧✐t② ✐s t❤❡✐r ♠❛✐♥ ❛❞✈❛♥t❛❣❡✳ ❚♦ ❡♥t❡r ❛ ♥❡✇ ✭❦❡②✱ ✈❛❧✉❡✮ ❛ss♦❝✐❛t✐♦♥✱ s✐♠♣❧② ♣✉t ❛ ♥❡✇ ♣❛✐r ✐♥t♦ t❤❡ ❧✐st✳ ❚❤✐s t❛❦❡s ❝♦♥st❛♥t t✐♠❡✱ ✇❤✐❝❤ ✐s t❤❡ ❜❡st ✇❡ ❝♦✉❧❞ ❤♦♣❡ ❢♦r✳ ❇✉t t❤❡ s♣❛❝❡ r❡q✉✐r❡♠❡♥t ✐s ❤✉❣❡✳ ■t ✐s ❧✐♥❡❛r ✐♥ t❤❡ ♥✉♠❜❡r ♦❢ ✉♣❞❛t❡s✱ ♥♦t ✐♥ t❤❡ ♥✉♠❜❡r ♦❢ ❞✐st✐♥❝t ❦❡②s✱ ❜❡❝❛✉s❡ ♦❜s♦❧❡t❡ ❡♥tr✐❡s ❛r❡ ♥❡✈❡r ❞❡❧❡t❡❞✳ ❚♦ ❞❡❧❡t❡ ♦❧❞ ❡♥tr✐❡s ✇♦✉❧❞ r❡q✉✐r❡ ✜rst ✜♥❞✐♥❣ t❤❡♠✱ ✐♥❝r❡❛s✐♥❣ t❤❡ ✉♣❞❛t❡ t✐♠❡ ❢r♦♠ O (1) t♦ O ( n ) ✳ ❋✉♥❝t✐♦♥ ❧♦♦❦✉♣ ✐s tr❛❞✐t✐♦♥❛❧❧② ❝❛❧❧❡❞ ❛ss♦❝ ❛❢t❡r ❛ s✐♠✐❧❛r ❢✉♥❝t✐♦♥ ✐♥ t❤❡ ❧❛♥❣✉❛❣❡ ▲✐s♣✱ ✇❤✐❝❤ ♣❧❛②❡❞ ❛ ❤✐st♦r✐❝ r♦❧❡ ✐♥ t❤❡ ❞❡✜♥✐t✐♦♥ ♦❢ t❤❡ ▲✐s♣ ❡✈❛❧✉❛t♦r✳
❱■■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✽✵ Binary Search Trees A dictionary associates values (here, numbers) with keys James, 5 Slide 803 Gordon, 4 Thomas, 1 Edward, 2 Henry, 3 Percy, 6 ❇✐♥❛r② s❡❛r❝❤ tr❡❡s ❛r❡ ❛♥ ✐♠♣♦rt❛♥t ❛♣♣❧✐❝❛t✐♦♥ ♦❢ ❜✐♥❛r② tr❡❡s✳ ❚❤❡② ✇♦r❦ ❢♦r ❦❡②s t❤❛t ❤❛✈❡ ❛ t♦t❛❧ ♦r❞❡r✐♥❣✱ s✉❝❤ ❛s str✐♥❣s✳ ❊❛❝❤ ❜r❛♥❝❤ ♦❢ t❤❡ tr❡❡ ❝❛rr✐❡s ❛ ( key, value ) ♣❛✐r❀ ✐ts ❧❡❢t s✉❜tr❡❡ ❤♦❧❞s s♠❛❧❧❡r ❦❡②s❀ t❤❡ r✐❣❤t s✉❜tr❡❡ ❤♦❧❞s ❣r❡❛t❡r ❦❡②s✳ ■❢ t❤❡ tr❡❡ r❡♠❛✐♥s r❡❛s♦♥❛❜❧② ❜❛❧❛♥❝❡❞✱ t❤❡♥ ✉♣❞❛t❡ ❛♥❞ ❧♦♦❦✉♣ ❜♦t❤ t❛❦❡ O (log n ) ❢♦r ❛ tr❡❡ ♦❢ s✐③❡ n ✳ ❚❤❡s❡ t✐♠❡s ❤♦❧❞ ✐♥ t❤❡ ❛✈❡r❛❣❡ ❝❛s❡❀ ❣✐✈❡♥ r❛♥❞♦♠ ❞❛t❛✱ t❤❡ tr❡❡ ✐s ❧✐❦❡❧② t♦ r❡♠❛✐♥ ❜❛❧❛♥❝❡❞✳ ❆t ❛ ❣✐✈❡♥ ♥♦❞❡✱ ❛❧❧ ❦❡②s ✐♥ t❤❡ ❧❡❢t s✉❜tr❡❡ ❛r❡ s♠❛❧❧❡r ✭♦r ❡q✉❛❧✮ ✇❤✐❧❡ ❛❧❧ tr❡❡s ✐♥ t❤❡ r✐❣❤t s✉❜tr❡❡ ❛r❡ ❣r❡❛t❡r✳ ❆♥ ✉♥❜❛❧❛♥❝❡❞ tr❡❡ ❤❛s ❛ ❧✐♥❡❛r ❛❝❝❡ss t✐♠❡ ✐♥ t❤❡ ✇♦rst ❝❛s❡✳ ❊①❛♠♣❧❡s ✐♥❝❧✉❞❡ ❜✉✐❧❞✐♥❣ ❛ tr❡❡ ❜② r❡♣❡❛t❡❞ ✐♥s❡rt✐♦♥s ♦❢ ❡❧❡♠❡♥ts ✐♥ ✐♥❝r❡❛s✐♥❣ ♦r ❞❡❝r❡❛s✐♥❣ ♦r❞❡r❀ t❤❡r❡ ✐s ❛ ❝❧♦s❡ r❡s❡♠❜❧❛♥❝❡ t♦ q✉✐❝❦s♦rt✳ ❇✉✐❧❞✐♥❣ ❛ ❜✐♥❛r② s❡❛r❝❤ tr❡❡✱ t❤❡♥ ❝♦♥✈❡rt✐♥❣ ✐t t♦ ✐♥♦r❞❡r✱ ②✐❡❧❞s ❛ s♦rt✐♥❣ ❛❧❣♦r✐t❤♠ ❝❛❧❧❡❞ tr❡❡s♦rt ✳ ❙❡❧❢✲❜❛❧❛♥❝✐♥❣ tr❡❡s✱ s✉❝❤ ❛s ❘❡❞✲❇❧❛❝❦ tr❡❡s✱ ❛tt❛✐♥ O (log n ) ✐♥ t❤❡ ✇♦rst ❝❛s❡✳ ❚❤❡② ❛r❡ ❝♦♠♣❧✐❝❛t❡❞ t♦ ✐♠♣❧❡♠❡♥t✳
❱■■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✽✶ Lookup: Seeks Left or Right exception Missing of string; fun lookup (Br ((a,x),t1,t2), b) = if b < a then lookup(t1, b) Slide 804 else if a < b then lookup(t2, b) else x | lookup (Lf, b) = raise Missing b; > val lookup = fn : (string * ’a) tree * string > -> ’a Guaranteed O (log n ) access time if the tree is balanced! ▲♦♦❦✉♣ ✐♥ t❤❡ ❜✐♥❛r② s❡❛r❝❤ tr❡❡ ❣♦❡s t♦ t❤❡ ❧❡❢t s✉❜tr❡❡ ✐❢ t❤❡ ❞❡s✐r❡❞ ❦❡② ✐s s♠❛❧❧❡r t❤❛♥ t❤❡ ❝✉rr❡♥t ♦♥❡ ❛♥❞ t♦ t❤❡ r✐❣❤t ✐❢ ✐t ✐s ❣r❡❛t❡r✳ ■t r❛✐s❡s ❡①❝❡♣t✐♦♥ ▼✐ss✐♥❣ ✐❢ ✐t ❡♥❝♦✉♥t❡rs ❛♥ ❡♠♣t② tr❡❡✳ ❙✐♥❝❡ ❛♥ ♦r❞❡r✐♥❣ ✐s ✐♥✈♦❧✈❡❞✱ ✇❡ ❤❛✈❡ t♦ ❞❡❝❧❛r❡ t❤❡ ❢✉♥❝t✐♦♥s ❢♦r ❛ s♣❡❝✐✜❝ t②♣❡✱ ❤❡r❡ str✐♥❣ ✳ ◆♦✇ ❡①❝❡♣t✐♦♥ ▼✐ss✐♥❣ ♠❡♥t✐♦♥s t❤❛t t②♣❡✿ ✐❢ ❧♦♦❦✉♣ ❢❛✐❧s✱ t❤❡ ❡①❝❡♣t✐♦♥ r❡t✉r♥s t❤❡ ♠✐ss✐♥❣ ❦❡②✳ ❚❤❡ ❡①❝❡♣t✐♦♥ ❝♦✉❧❞ ❜❡ ❡❧✐♠✐♥❛t❡❞ ✉s✐♥❣ t②♣❡ ♦♣t✐♦♥ ♦❢ ▲❡❝t✳ ✼✱ ✉s✐♥❣ t❤❡ ❝♦♥str✉❝t♦r ◆❖◆❊ ❢♦r ❢❛✐❧✉r❡✳
❱■■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✽✷ Update fun update (Lf, b:string, y) = Br((b,y), Lf, Lf) | update (Br((a,x),t1,t2), b, y) = if b<a Slide 805 then Br ((a,x), update(t1,b,y), t2) else if a<b then Br ((a,x), t1, update(t2,b,y)) else (*a=b*) Br ((a,y),t1,t2); Also O (log n ) : it copies the path only, not whole subtrees! ❚❤❡ ✉♣❞❛t❡ ♦♣❡r❛t✐♦♥ ✐s ❛ ♥✐❝❡ ♣✐❡❝❡ ♦❢ ❢✉♥❝t✐♦♥❛❧ ♣r♦❣r❛♠♠✐♥❣✳ ■t s❡❛r❝❤❡s ✐♥ t❤❡ s❛♠❡ ♠❛♥♥❡r ❛s ❧♦♦❦✉♣ ✱ ❜✉t t❤❡ r❡❝✉rs✐✈❡ ❝❛❧❧s r❡❝♦♥str✉❝t ❛ ♥❡✇ tr❡❡ ❛r♦✉♥❞ t❤❡ r❡s✉❧t ♦❢ t❤❡ ✉♣❞❛t❡✳ ❖♥❡ s✉❜tr❡❡ ✐s ✉♣❞❛t❡❞ ❛♥❞ t❤❡ ♦t❤❡r ❧❡❢t ✉♥❝❤❛♥❣❡❞✳ ❚❤❡ ✐♥t❡r♥❛❧ r❡♣r❡s❡♥t❛t✐♦♥ ♦❢ tr❡❡s ❡♥s✉r❡s t❤❛t ✉♥❝❤❛♥❣❡❞ ♣❛rts ♦❢ t❤❡ tr❡❡ ❛r❡ ♥♦t ❝♦♣✐❡❞✱ ❜✉t s❤❛r❡❞ ✳ ✭▲❡❝t✳ ✶✺ ✇✐❧❧ ❞✐s❝✉ss ✉s✐♥❣ r❡❢❡r❡♥❝❡s t♦ ❝r❡❛t❡ ❧✐♥❦❡❞ str✉❝t✉r❡s✳✮ ❚❤❡r❡❢♦r❡✱ ✉♣❞❛t❡ ❝♦♣✐❡s ♦♥❧② t❤❡ ♣❛t❤ ❢r♦♠ t❤❡ r♦♦t t♦ t❤❡ ♥❡✇ ♥♦❞❡✳ ■ts t✐♠❡ ❛♥❞ s♣❛❝❡ r❡q✉✐r❡♠❡♥ts✱ ❢♦r ❛ r❡❛s♦♥❛❜❧② ❜❛❧❛♥❝❡❞ tr❡❡✱ ❛r❡ ❜♦t❤ O (log n ) ✳ ❚❤❡ ❝♦♠♣❛r✐s♦♥ ❜❡t✇❡❡♥ b ❛♥❞ a ❛❧❧♦✇s t❤r❡❡ ❝❛s❡s✿ • s♠❛❧❧❡r ✿ ✉♣❞❛t❡ t❤❡ ❧❡❢t s✉❜tr❡❡❀ s❤❛r❡ t❤❡ r✐❣❤t • ❣r❡❛t❡r ✿ ✉♣❞❛t❡ t❤❡ r✐❣❤t s✉❜tr❡❡❀ s❤❛r❡ t❤❡ ❧❡❢t • ❡q✉❛❧ ✿ ✉♣❞❛t❡ t❤❡ ❧❛❜❡❧ ❛♥❞ s❤❛r❡ ❜♦t❤ s✉❜tr❡❡s ◆♦t❡✿ ✐♥ t❤❡ ❢✉♥❝t✐♦♥ ❞❡✜♥✐t✐♦♥✱ ✭✯❛❂❜✯✮ ✐s ❛ ❝♦♠♠❡♥t✳ ❈♦♠♠❡♥ts ✐♥ ▼▲ ❛r❡ ❡♥❝❧♦s❡❞ ✐♥ t❤❡ ❜r❛❝❦❡ts ✭✯ ❛♥❞ ✯✮ ✳
❱■■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✽✸ Arrays A conventional array is an indexed storage area. • It is updated in place by the command A[k] := x Slide 806 • The concept is inherently imperative : updating is an action. A functional Array is a finite map from integers to data. • Updating is copying in update(A,k,x) • The new array equals A except at position k . Can we do updates efficiently? ❚❤❡ ❡❧❡♠❡♥ts ♦❢ ❛ ❧✐st ❝❛♥ ♦♥❧② ❜❡ r❡❛❝❤❡❞ ❜② ❝♦✉♥t✐♥❣ ❢r♦♠ t❤❡ ❢r♦♥t✳ ❊❧❡♠❡♥ts ♦❢ ❛ tr❡❡ ❛r❡ r❡❛❝❤❡❞ ❜② ❢♦❧❧♦✇✐♥❣ ❛ ♣❛t❤ ❢r♦♠ t❤❡ r♦♦t✳ ❆♥ ❛r✲ r❛② ❤✐❞❡s s✉❝❤ str✉❝t✉r❛❧ ♠❛tt❡rs❀ ✐ts ❡❧❡♠❡♥ts ❛r❡ ✉♥✐❢♦r♠❧② ❞❡s✐❣♥❛t❡❞ ❜② ♥✉♠❜❡r✳ ■♠♠❡❞✐❛t❡ ❛❝❝❡ss t♦ ❛r❜✐tr❛r② ♣❛rts ♦❢ ❛ ❞❛t❛ str✉❝t✉r❡ ✐s ❝❛❧❧❡❞ r❛♥❞♦♠ ❛❝❝❡ss ✳ ❆rr❛②s ❛r❡ t❤❡ ❞♦♠✐♥❛♥t ❞❛t❛ str✉❝t✉r❡ ✐♥ ❝♦♥✈❡♥t✐♦♥❛❧ ♣r♦❣r❛♠♠✐♥❣ ❧❛♥❣✉❛❣❡s✳ ❚❤❡ ✐♥❣❡♥✐♦✉s ✉s❡ ♦❢ ❛rr❛②s ✐s t❤❡ ❦❡② t♦ ♠❛♥② ♦❢ t❤❡ ❣r❡❛t ❝❧❛ss✐❝❛❧ ❛❧❣♦r✐t❤♠s✱ s✉❝❤ ❛s ❍♦❛r❡✬s ♦r✐❣✐♥❛❧ q✉✐❝❦s♦rt ✭t❤❡ ♣❛rt✐t✐♦♥ st❡♣✮ ❛♥❞ ❲❛rs❤❛❧❧✬s tr❛♥s✐t✐✈❡✲❝❧♦s✉r❡ ❛❧❣♦r✐t❤♠✳ ❚❤❡ ❞r❛✇❜❛❝❦ ✐s t❤❛t s✉❜s❝r✐♣t✐♥❣ ✐s ❛ ❝❤✐❡❢ ❝❛✉s❡ ♦❢ ♣r♦❣r❛♠♠❡r ❡rr♦r✳ ❚❤❛t ✐s ✇❤② ❛rr❛②s ♣❧❛② ❧✐tt❧❡ r♦❧❡ ✐♥ t❤✐s ✐♥tr♦❞✉❝t♦r② ❝♦✉rs❡✳ ❋✉♥❝t✐♦♥❛❧ ❛rr❛②s ❛r❡ ❞❡s❝r✐❜❡❞ ❜❡❧♦✇ ✐♥ ♦r❞❡r t♦ ✐❧❧✉str❛t❡ ❛♥♦t❤❡r ✇❛② ♦❢ ✉s✐♥❣ tr❡❡s t♦ ♦r❣❛♥✐③❡ ❞❛t❛✳ ❍❡r❡ ✐s ❛ s✉♠♠❛r② ♦❢ ♦✉r ❞✐❝t✐♦♥❛r② ❞❛t❛ str✉❝t✉r❡s ✐♥ ♦r❞❡r ♦❢ ❞❡❝r❡❛s✐♥❣ ❣❡♥❡r❛❧✐t② ❛♥❞ ✐♥❝r❡❛s✐♥❣ ❡✣❝✐❡♥❝②✿ • ▲✐♥❡❛r s❡❛r❝❤ ✿ ▼♦st ❣❡♥❡r❛❧✱ ♥❡❡❞✐♥❣ ♦♥❧② ❡q✉❛❧✐t② ♦♥ ❦❡②s✱ ❜✉t ✐♥❡✣✲ ❝✐❡♥t✿ ❧✐♥❡❛r t✐♠❡✳ • ❇✐♥❛r② s❡❛r❝❤ ✿ ◆❡❡❞s ❛♥ ♦r❞❡r✐♥❣ ♦♥ ❦❡②s✳ ▲♦❣❛r✐t❤♠✐❝ ❛❝❝❡ss t✐♠❡ ✐♥ t❤❡ ❛✈❡r❛❣❡ ❝❛s❡✱ ❧✐♥❡❛r ✐♥ t❤❡ ✇♦rst ❝❛s❡✳ • ❆rr❛② s✉❜s❝r✐♣t✐♥❣ ✿ ▲❡❛st ❣❡♥❡r❛❧✱ r❡q✉✐r✐♥❣ ❦❡②s t♦ ❜❡ ✐♥t❡❣❡rs✱ ❜✉t ❡✈❡♥ ✇♦rst✲❝❛s❡ t✐♠❡ ✐s ❧♦❣❛r✐t❤♠✐❝✳
❱■■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✽✹ Functional Arrays as Binary Trees The path to an element follows the binary code for its subscript. 1� Slide 807 2� 3� 4� 6� 5� 7� 8� 12� 10� 14� 9� 13� 11� 15� ❚❤✐s s✐♠♣❧❡ r❡♣r❡s❡♥t❛t✐♦♥ ✭❝r❡❞✐t❡❞ t♦ ❲✳ ❇r❛✉♥✮ ❡♥s✉r❡s t❤❛t t❤❡ tr❡❡ ✐s ❜❛❧❛♥❝❡❞✳ ❈♦♠♣❧❡①✐t② ♦❢ ❛❝❝❡ss ✐s ❛❧✇❛②s O (log n ) ✱ ✇❤✐❝❤ ✐s ♦♣t✐♠❛❧✳ ❋♦r ❛❝t✉❛❧ r✉♥♥✐♥❣ t✐♠❡✱ ❛❝❝❡ss t♦ ❝♦♥✈❡♥t✐♦♥❛❧ ❛rr❛②s ✐s ♠✉❝❤ ❢❛st❡r✿ ✐t r❡q✉✐r❡s ♦♥❧② ❛ ❢❡✇ ❤❛r❞✇❛r❡ ✐♥str✉❝t✐♦♥s✳ ❆rr❛② ❛❝❝❡ss ✐s ♦❢t❡♥ t❛❦❡♥ t♦ ❜❡ O (1) ✱ ✇❤✐❝❤ ✭❛s ❛❧✇❛②s✮ ♣r❡s✉♠❡s t❤❛t ❤❛r❞✇❛r❡ ❧✐♠✐ts ❛r❡ ♥❡✈❡r ❡①❝❡❡❞❡❞✳ ❚❤❡ ❧♦✇❡r ❜♦✉♥❞ ❢♦r ❛rr❛② ✐♥❞✐❝❡s ✐s ♦♥❡✳ ❚❤❡ ✉♣♣❡r ❜♦✉♥❞ st❛rts ❛t ③❡r♦ ✭✇❤✐❝❤ s✐❣♥✐✜❡s t❤❡ ❡♠♣t② ❛rr❛②✮ ❛♥❞ ❝❛♥ ❣r♦✇ ✇✐t❤♦✉t ❧✐♠✐t✳ ❚❤✐s ❞❛t❛ str✉❝t✉r❡ ❝❛♥ ❜❡ ✉s❡❞ t♦ ✐♠♣❧❡♠❡♥t ❛rr❛②s t❤❛t ❣r♦✇ ❛♥❞ s❤r✐♥❦ ❜② ❛❞❞✐♥❣ ❛♥❞ ❞❡❧❡t✐♥❣ ❡❧❡♠❡♥ts ❛t ❡✐t❤❡r ❡♥❞✳
❱■■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✽✺ The Lookup Function exception Subscript; Slide 808 fun sub (Lf, _) = raise Subscript (*Not found!*) | sub (Br(v,t1,t2), k) = if k=1 then v else if k mod 2 = 0 then sub (t1, k div 2) else sub (t2, k div 2); ❚❤❡ ❧♦♦❦✉♣ ❢✉♥❝t✐♦♥✱ s✉❜ ✱ ❞✐✈✐❞❡s t❤❡ s✉❜s❝r✐♣t ❜② ✷ ✉♥t✐❧ ✶ ✐s r❡❛❝❤❡❞✳ ■❢ t❤❡ r❡♠❛✐♥❞❡r ✐s ✵ t❤❡♥ t❤❡ ❢✉♥❝t✐♦♥ ❢♦❧❧♦✇s t❤❡ ❧❡❢t s✉❜tr❡❡✱ ♦t❤❡r✇✐s❡ t❤❡ r✐❣❤t✳ ■❢ ✐t r❡❛❝❤❡s ❛ ❧❡❛❢✱ ✐t s✐❣♥❛❧s ❡rr♦r ❜② r❛✐s✐♥❣ ❡①❝❡♣t✐♦♥ ❙✉❜s❝r✐♣t ✳ ❆rr❛② ❛❝❝❡ss ❝❛♥ ❛❧s♦ ❜❡ ✉♥❞❡rst❛♥❞ ✐♥ t❡r♠s ♦❢ t❤❡ s✉❜s❝r✐♣t✬s ❜✐♥❛r② ❝♦❞❡✳ ❇❡❝❛✉s❡ t❤❡ s✉❜s❝r✐♣t ♠✉st ❜❡ ❛ ♣♦s✐t✐✈❡ ✐♥t❡❣❡r✱ ✐♥ ❜✐♥❛r② ✐t ❤❛s ❛ ❧❡❛❞✐♥❣ ♦♥❡✳ ❉✐s❝❛r❞ t❤✐s ♦♥❡ ❛♥❞ r❡✈❡rs❡ t❤❡ r❡♠❛✐♥✐♥❣ ❜✐ts✳ ■♥t❡r♣r❡t✐♥❣ ③❡r♦ ❛s ❧❡❢t ❛♥❞ ♦♥❡ ❛s r✐❣❤t ②✐❡❧❞s t❤❡ ♣❛t❤ ❢r♦♠ t❤❡ r♦♦t t♦ t❤❡ s✉❜s❝r✐♣t✳ P♦♣✉❧❛r ❧✐t❡r❛t✉r❡ ♦❢t❡♥ ❡①♣❧❛✐♥s t❤❡ ✐♠♣♦rt❛♥❝❡ ♦❢ ❜✐♥❛r② ❛s ❜❡✐♥❣ ❧❡❞ ❜② ❤❛r❞✇❛r❡✿ ❜❡❝❛✉s❡ ❛ ❝✐r❝✉✐t ✐s ❡✐t❤❡r ♦♥ ♦r ♦✛✳ ❚❤❡ tr✉t❤ ✐s ❛❧♠♦st t❤❡ ♦♣♣♦s✐t❡✳ ❉❡s✐❣♥❡rs ♦❢ ❞✐❣✐t❛❧ ❡❧❡❝tr♦♥✐❝s ❣♦ t♦ ❛ ❧♦t ♦❢ tr♦✉❜❧❡ t♦ s✉♣♣r❡ss t❤❡ ❝♦♥t✐♥✉♦✉s ❜❡❤❛✈✐♦✉r t❤❛t ✇♦✉❧❞ ♥❛t✉r❛❧❧② ❛r✐s❡✳ ❚❤❡ r❡❛❧ r❡❛s♦♥ ✇❤② ❜✐♥❛r② ✐s ✐♠♣♦rt❛♥t ✐s ✐ts r♦❧❡ ✐♥ ❛❧❣♦r✐t❤♠s✿ ❛♥ ✐❢ ✲ t❤❡♥ ✲ ❡❧s❡ ❞❡❝✐s✐♦♥ ❧❡❛❞s t♦ ❜✐♥❛r② ❜r❛♥❝❤✐♥❣✳ ❉❛t❛ str✉❝t✉r❡s✱ s✉❝❤ ❛s tr❡❡s✱ ❛♥❞ ❛❧❣♦r✐t❤♠s✱ s✉❝❤ ❛s ♠❡r❣❡s♦rt✱ ✉s❡ ❜✐♥❛r② ❜r❛♥❝❤✐♥❣ ✐♥ ♦r❞❡r t♦ r❡❞✉❝❡ ❛ ❝♦st ❢r♦♠ O ( n ) t♦ O (log n ) ✳ ❚✇♦ ✐s t❤❡ s♠❛❧❧❡st ✐♥t❡❣❡r ❞✐✈✐s♦r t❤❛t ❛❝❤✐❡✈❡s t❤✐s r❡❞✉❝t✐♦♥✳ ✭▲❛r❣❡r ❞✐✈✐s♦rs ❛r❡ ♦♥❧② ♦❝❝❛s✐♦♥❛❧❧② ❤❡❧♣❢✉❧✱ ❛s ✐♥ t❤❡ ❝❛s❡ ♦❢ ❇✲tr❡❡s✱ ✇❤❡r❡ t❤❡② r❡❞✉❝❡ t❤❡ ❝♦♥st❛♥t ❢❛❝t♦r✳✮ ❚❤❡ s✐♠♣❧✐❝✐t② ♦❢ ❜✐♥❛r② ❛r✐t❤♠❡t✐❝ ❝♦♠♣❛r❡❞ ✇✐t❤ ❞❡❝✐♠❛❧ ❛r✐t❤♠❡t✐❝ ✐s ❥✉st ❛♥♦t❤❡r ✐♥st❛♥❝❡ ♦❢ t❤❡ s✐♠♣❧✐❝✐t② ♦❢ ❛❧❣♦r✐t❤♠s ❜❛s❡❞ ♦♥ ❜✐♥❛r② ❝❤♦✐❝❡s✳
❱■■■ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✽✻ The Update Function fun update (Lf, k, w) = if k = 1 then Br (w, Lf, Lf) Slide 809 else raise Subscript (*Gap in tree!*) | update (Br(v,t1,t2), k, w) = if k = 1 then Br (w, t1, t2) else if k mod 2 = 0 then Br (v, update(t1, k div 2, w), t2) else Br (v, t1, update(t2, k div 2, w)) ❚❤❡ ✉♣❞❛t❡ ❢✉♥❝t✐♦♥✱ ✉♣❞❛t❡ ✱ ❛❧s♦ ❞✐✈✐❞❡s t❤❡ s✉❜s❝r✐♣t r❡♣❡❛t❡❞❧② ❜② t✇♦✳ ❲❤❡♥ ✐t r❡❛❝❤❡s ❛ ✈❛❧✉❡ ♦❢ ♦♥❡✱ ✐t ❤❛s ✐❞❡♥t✐✜❡❞ t❤❡ ❡❧❡♠❡♥t ♣♦s✐t✐♦♥✳ ❚❤❡♥ ✐t r❡♣❧❛❝❡s t❤❡ ❜r❛♥❝❤ ♥♦❞❡ ❜② ❛♥♦t❤❡r ❜r❛♥❝❤ ✇✐t❤ t❤❡ ♥❡✇ ❧❛❜❡❧✳ ❆ ❧❡❛❢ ♠❛② ❜❡ r❡♣❧❛❝❡❞ ❜② ❛ ❜r❛♥❝❤✱ ❡①t❡♥❞✐♥❣ t❤❡ ❛rr❛②✱ ♣r♦✈✐❞❡❞ ♥♦ ✐♥t❡r✈❡♥✐♥❣ ♥♦❞❡s ❤❛✈❡ t♦ ❜❡ ❣❡♥❡r❛t❡❞✳ ❚❤✐s s✉✣❝❡s ❢♦r ❛rr❛②s ✇✐t❤♦✉t ❣❛♣s ✐♥ t❤❡✐r s✉❜s❝r✐♣t✐♥❣✳ ✭❚❤❡ ❞❛t❛ str✉❝t✉r❡ ❝❛♥ ❜❡ ♠♦❞✐✜❡❞ t♦ ❛❧❧♦✇ s♣❛rs❡ ❛rr❛②s✱ ✇❤❡r❡ ♠♦st s✉❜s❝r✐♣t ♣♦s✐t✐♦♥s ❛r❡ ✉♥❞❡✜♥❡❞✳✮ ❊①❝❡♣t✐♦♥ ❙✉❜s❝r✐♣t ✐♥❞✐❝❛t❡s t❤❛t t❤❡ s✉❜s❝r✐♣t ♣♦s✐t✐♦♥ ❞♦❡s ♥♦t ❡①✐st ❛♥❞ ❝❛♥♥♦t ❜❡ ❝r❡❛t❡❞✳ ❚❤✐s ✉s❡ ♦❢ ❡①❝❡♣t✐♦♥s ✐s ♥♦t ❡❛s✐❧② r❡♣❧❛❝❡❞ ❜② ◆❖◆❊ ❛♥❞ ❙❖▼❊ ✳ ◆♦t❡ t❤❛t t❤❡r❡ ❛r❡ t✇♦ t❡sts ✐♥✈♦❧✈✐♥❣ k = 1 ✳ ■❢ ✇❡ ❤❛✈❡ r❡❛❝❤❡❞ ❛ ❧❡❛❢❀ ✐t r❡t✉r♥s ❛ ❜r❛♥❝❤✱ ❡①t❡♥❞✐♥❣ t❤❡ ❛rr❛② ❜② ♦♥❡✳ ■❢ ✇❡ ❛r❡ st✐❧❧ ❛t ❛ ❜r❛♥❝❤ ♥♦❞❡✱ t❤❡♥ t❤❡ ❡✛❡❝t ✐s t♦ ✉♣❞❛t❡ ❛♥ ❡①✐st✐♥❣ ❛rr❛② ❡❧❡♠❡♥t✳ ❆ s✐♠✐❧❛r ❢✉♥❝t✐♦♥ ❝❛♥ s❤r✐♥❦ ❛♥ ❛rr❛② ❜② ♦♥❡✳ ❘❡❧❛t❡❞ ♠❛t❡r✐❛❧ ✐s ✐♥ ▼▲ ❢♦r t❤❡ ❲♦r❦✐♥❣ Pr♦❣r❛♠♠❡r ✱ ▲❡❛r♥✐♥❣ ❣✉✐❞❡✳ ♣❛❣❡s ✶✹✽✕✶✺✾✳
■❳ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✽✼ Breadth-First v Depth-First Tree Traversal binary trees as decision trees Slide 901 Look for solution nodes • Depth-first : search one subtree in full before moving on • Breadth-first: search all nodes at level k before moving to k + 1 Finds all solutions — nearest first! Pr❡♦r❞❡r✱ ✐♥♦r❞❡r ❛♥❞ ♣♦st♦r❞❡r tr❡❡ tr❛✈❡rs❛❧s ❛❧❧ ❤❛✈❡ s♦♠❡t❤✐♥❣ ✐♥ ❝♦♠♠♦♥✿ t❤❡② ❛r❡ ❞❡♣t❤✲✜rst ✳ ❆t ❡❛❝❤ ♥♦❞❡✱ t❤❡ ❧❡❢t s✉❜tr❡❡ ✐s ❡♥t✐r❡❧② tr❛✈❡rs❡❞ ❜❡❢♦r❡ t❤❡ r✐❣❤t s✉❜tr❡❡✳ ❉❡♣t❤✲✜rst tr❛✈❡rs❛❧s ❛r❡ ❡❛s② t♦ ❝♦❞❡ ❛♥❞ ❝❛♥ ❜❡ ❡✣❝✐❡♥t✱ ❜✉t t❤❡② ❛r❡ ✐❧❧✲s✉✐t❡❞ ❢♦r s♦♠❡ ♣r♦❜❧❡♠s✳ ❙✉♣♣♦s❡ t❤❡ tr❡❡ r❡♣r❡s❡♥ts t❤❡ ♣♦ss✐❜❧❡ ♠♦✈❡s ✐♥ ❛ ♣✉③③❧❡✱ ❛♥❞ t❤❡ ♣✉r✲ ♣♦s❡ ♦❢ t❤❡ tr❛✈❡rs❛❧ ✐s t♦ s❡❛r❝❤ ❢♦r ❛ ♥♦❞❡ ❝♦♥t❛✐♥✐♥❣ ❛ s♦❧✉t✐♦♥✳ ❚❤❡♥ ❛ ❞❡♣t❤✲✜rst tr❛✈❡rs❛❧ ♠❛② ✜♥❞ ♦♥❡ s♦❧✉t✐♦♥ ♥♦❞❡ ❞❡❡♣ ✐♥ t❤❡ ❧❡❢t s✉❜tr❡❡✱ ✇❤❡♥ ❛♥♦t❤❡r s♦❧✉t✐♦♥ ✐s ❛t t❤❡ ✈❡r② t♦♣ ♦❢ t❤❡ r✐❣❤t s✉❜tr❡❡✳ ❖❢t❡♥ ✇❡ ✇❛♥t t❤❡ s❤♦rt❡st ♣❛t❤ t♦ ❛ s♦❧✉t✐♦♥✳ ❙✉♣♣♦s❡ t❤❡ tr❡❡ ✐s ✐♥✜♥✐t❡ ✳ ✭❚❤❡ ▼▲ ❞❛t❛t②♣❡ tr❡❡ ❝♦♥t❛✐♥s ♦♥❧② ✜♥✐t❡ tr❡❡s✱ ❜✉t ▼▲ ❝❛♥ r❡♣r❡s❡♥t ✐♥✜♥✐t❡ tr❡❡s ❜② ♠❡❛♥s ❞✐s❝✉ss❡❞ ✐♥ ▲❡❝t✳ ✶✸✳✮ ❉❡♣t❤✲✜rst s❡❛r❝❤ ✐s ❛❧♠♦st ✉s❡❧❡ss ✇✐t❤ ✐♥✜♥✐t❡ tr❡❡s✱ ❢♦r ✐❢ t❤❡ ❧❡❢t s✉❜tr❡❡ ✐s ✐♥✜♥✐t❡ t❤❡♥ ✐t ✇✐❧❧ ♥❡✈❡r r❡❛❝❤ t❤❡ r✐❣❤t s✉❜tr❡❡✳ ❆ ❜r❡❛❞t❤✲✜rst tr❛✈❡rs❛❧ ❡①♣❧♦r❡s t❤❡ ♥♦❞❡s ❤♦r✐③♦♥t❛❧❧② r❛t❤❡r t❤❛♥ ✈❡r✲ t✐❝❛❧❧②✳ ❲❤❡♥ ✈✐s✐t✐♥❣ ❛ ♥♦❞❡✱ ✐t ❞♦❡s ♥♦t tr❛✈❡rs❡ t❤❡ s✉❜tr❡❡s ✉♥t✐❧ ✐t ❤❛s ✈✐s✐t❡❞ ❛❧❧ ♦t❤❡r ♥♦❞❡s ❛t t❤❡ ❝✉rr❡♥t ❞❡♣t❤✳ ❚❤✐s ✐s ❡❛s✐❧② ✐♠♣❧❡♠❡♥t❡❞ ❜② ❦❡❡♣✐♥❣ ❛ ❧✐st ♦❢ tr❡❡s t♦ ✈✐s✐t✳ ■♥✐t✐❛❧❧②✱ t❤✐s ❧✐st ❝♦♥s✐sts ♦❢ ♦♥❡ ❡❧❡♠❡♥t✿ t❤❡ ❡♥t✐r❡ tr❡❡✳ ❊❛❝❤ ✐t❡r❛t✐♦♥ r❡♠♦✈❡s ❛ tr❡❡ ❢r♦♠ t❤❡ ❤❡❛❞ ♦❢ t❤❡ ❧✐st ❛♥❞ ❛❞❞s ✐ts s✉❜tr❡❡s ❛❢t❡r t❤❡ ❡♥❞ ♦❢ t❤❡ ❧✐st✳
■❳ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✽✽ Breadth-First Tree Traversal — Using Append fun nbreadth [] = [] | nbreadth (Lf :: ts) = nbreadth ts Slide 902 | nbreadth (Br(v,t,u) :: ts) = v :: nbreadth(ts @ [t,u]) Keeps an enormous queue of nodes of search Wasteful use of append 25 SECS to search depth 12 binary tree (4095 labels) ❇r❡❛❞t❤✲✜rst s❡❛r❝❤ ❝❛♥ ❜❡ ✐♥❡✣❝✐❡♥t✱ t❤✐s ♥❛✐✈❡ ✐♠♣❧❡♠❡♥t❛t✐♦♥ ❡s♣❡✲ ❝✐❛❧❧② s♦✳ ❲❤❡♥ t❤❡ s❡❛r❝❤ ✐s ❛t ❞❡♣t❤ d ♦❢ t❤❡ tr❡❡✱ t❤❡ ❧✐st ❝♦♥t❛✐♥s ❛❧❧ t❤❡ r❡♠❛✐♥✐♥❣ tr❡❡s ❛t ❞❡♣t❤ d ✱ ❢♦❧❧♦✇❡❞ ❜② t❤❡ s✉❜tr❡❡s ✭❛❧❧ ❛t ❞❡♣t❤ d + 1 ✮ ♦❢ t❤❡ tr❡❡s t❤❛t ❤❛✈❡ ❛❧r❡❛❞② ❜❡❡♥ ✈✐s✐t❡❞✳ ❆t ❞❡♣t❤ ✶✵✱ t❤❡ ❧✐st ❝♦✉❧❞ ❛❧r❡❛❞② ❝♦♥t❛✐♥ ✶✵✷✹ ❡❧❡♠❡♥ts✳ ■t r❡q✉✐r❡s ❛ ❧♦t ♦❢ s♣❛❝❡✱ ❛♥❞ ❛❣❣r❛✈❛t❡s t❤✐s ✇✐t❤ ❛ ❣r♦ss ♠✐s✉s❡ ♦❢ ❛♣♣❡♥❞✳ ❊✈❛❧✉❛t✐♥❣ ts❅❬t✱✉❪ ❝♦♣✐❡s t❤❡ ❧♦♥❣ ❧✐st ts ❥✉st t♦ ✐♥s❡rt t✇♦ ❡❧❡♠❡♥ts✳
■❳ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✽✾ An Abstract Data Type: Queues • qempty is the empty queue Slide 903 • qnull tests whether a queue is empty • qhd returns the element at the head of a queue • deq discards the element at the head of a queue • enq adds an element at the end of a queue ❇r❡❛❞t❤✲✜rst s❡❛r❝❤ ❜❡❝♦♠❡s ♠✉❝❤ ❢❛st❡r ✐❢ ✇❡ r❡♣❧❛❝❡ t❤❡ ❧✐sts ❜② q✉❡✉❡s ✳ ❆ q✉❡✉❡ r❡♣r❡s❡♥ts ❛ s❡q✉❡♥❝❡✱ ❛❧❧♦✇✐♥❣ ❡❧❡♠❡♥ts t♦ ❜❡ t❛❦❡♥ ❢r♦♠ t❤❡ ❤❡❛❞ ❛♥❞ ❛❞❞❡❞ t♦ t❤❡ t❛✐❧✳ ❚❤✐s ✐s ❛ ❋✐rst✲■♥✲❋✐rst✲❖✉t ✭❋■❋❖✮ ❞✐s❝✐♣❧✐♥❡✿ t❤❡ ✐t❡♠ ♥❡①t t♦ ❜❡ r❡♠♦✈❡❞ ✐s t❤❡ ♦♥❡ t❤❛t ❤❛s ❜❡❡♥ ✐♥ t❤❡ q✉❡✉❡ ❢♦r t❤❡ ❧♦♥❣❡st t✐♠❡✳ ▲✐sts ❝❛♥ ✐♠♣❧❡♠❡♥t q✉❡✉❡s✱ ❜✉t ❛♣♣❡♥❞ ✐s ❛ ♣♦♦r ♠❡❛♥s ♦❢ ❛❞❞✐♥❣ ❡❧❡♠❡♥ts t♦ t❤❡ t❛✐❧✳ ❖✉r ❢✉♥❝t✐♦♥❛❧ ❛rr❛②s ✭▲❡❝t✳ ✽✮ ❛r❡ s✉✐t❛❜❧❡✱ ♣r♦✈✐❞❡❞ ✇❡ ❛✉❣♠❡♥t t❤❡♠ ✇✐t❤ ❛ ❢✉♥❝t✐♦♥ t♦ ❞❡❧❡t❡ t❤❡ ✜rst ❛rr❛② ❡❧❡♠❡♥t✳ ✭❙❡❡ ▼▲ ❢♦r t❤❡ ❲♦r❦✐♥❣ Pr♦❣r❛♠♠❡r ✱ ♣❛❣❡ ✶✺✻✳✮ ❊❛❝❤ ♦♣❡r❛t✐♦♥ ✇♦✉❧❞ t❛❦❡ O (log n ) t✐♠❡ ❢♦r ❛ q✉❡✉❡ ♦❢ ❧❡♥❣t❤ n ✳ ❲❡ s❤❛❧❧ ❞❡s❝r✐❜❡ ❛ r❡♣r❡s❡♥t❛t✐♦♥ ♦❢ q✉❡✉❡s t❤❛t ✐s ♣✉r❡❧② ❢✉♥❝t✐♦♥❛❧✱ ❜❛s❡❞ ✉♣♦♥ ❧✐sts✱ ❛♥❞ ❡✣❝✐❡♥t✳ ❖♣❡r❛t✐♦♥s t❛❦❡ O (1) t✐♠❡ ✇❤❡♥ ❛♠♦rt✐③❡❞ ✿ ❛✈❡r❛❣❡❞ ♦✈❡r t❤❡ ❧✐❢❡t✐♠❡ ♦❢ ❛ q✉❡✉❡✳ ❆ ❝♦♥✈❡♥t✐♦♥❛❧ ♣r♦❣r❛♠♠✐♥❣ t❡❝❤♥✐q✉❡ ✐s t♦ r❡♣r❡s❡♥t ❛ q✉❡✉❡ ❜② ❛♥ ❛rr❛②✳ ❚✇♦ ✐♥❞✐❝❡s ♣♦✐♥t t♦ t❤❡ ❢r♦♥t ❛♥❞ ❜❛❝❦ ♦❢ t❤❡ q✉❡✉❡✱ ✇❤✐❝❤ ♠❛② ✇r❛♣ ❛r♦✉♥❞ t❤❡ ❡♥❞ ♦❢ t❤❡ ❛rr❛②✳ ❚❤❡ ❝♦❞✐♥❣ ✐s s♦♠❡✇❤❛t tr✐❝❦②✳ ❲♦rs❡✱ t❤❡ ❧❡♥❣t❤ ♦❢ t❤❡ q✉❡✉❡ ♠✉st ❜❡ ❣✐✈❡♥ ❛ ✜①❡❞ ✉♣♣❡r ❜♦✉♥❞✳
■❳ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✾✵ Efficient Functional Queues: Idea Represent the queue x 1 x 2 . . . x m y n . . . y 1 by any pair of lists Slide 904 ([ x 1 , x 2 , . . . , x m ] , [ y 1 , y 2 , . . . , y n ]) Add new items to rear list Remove items from front list ; if empty move rear to front Amortized time per operation is O (1) ◗✉❡✉❡s r❡q✉✐r❡ ❡✣❝✐❡♥t ❛❝❝❡ss ❛t ❜♦t❤ ❡♥❞s✿ ❛t t❤❡ ❢r♦♥t✱ ❢♦r r❡♠♦✈❛❧✱ ❛♥❞ ❛t t❤❡ ❜❛❝❦✱ ❢♦r ✐♥s❡rt✐♦♥✳ ■❞❡❛❧❧②✱ ❛❝❝❡ss s❤♦✉❧❞ t❛❦❡ ❝♦♥st❛♥t t✐♠❡✱ O (1) ✳ ■t ♠❛② ❛♣♣❡❛r t❤❛t ❧✐sts ❝❛♥♥♦t ♣r♦✈✐❞❡ s✉❝❤ ❛❝❝❡ss✳ ■❢ ❡♥q✭q✱①✮ ♣❡r❢♦r♠s q❅❬①❪ ✱ t❤❡♥ t❤✐s ♦♣❡r❛t✐♦♥ ✇✐❧❧ ❜❡ O ( n ) ✳ ❲❡ ❝♦✉❧❞ r❡♣r❡s❡♥t q✉❡✉❡s ❜② r❡✈❡rs❡❞ ❧✐sts✱ ✐♠♣❧❡♠❡♥t✐♥❣ ❡♥q✭q✱①✮ ❜② ①✿✿q ✱ ❜✉t t❤❡♥ t❤❡ ❞❡q ❛♥❞ q❤❞ ♦♣❡r❛t✐♦♥s ✇♦✉❧❞ ❜❡ O ( n ) ✳ ▲✐♥❡❛r t✐♠❡ ✐s ✐♥t♦❧❡r❛❜❧❡✿ ❛ s❡r✐❡s ♦❢ n q✉❡✉❡ ♦♣❡r❛t✐♦♥s ❝♦✉❧❞ t❤❡♥ r❡q✉✐r❡ O ( n 2 ) t✐♠❡✳ ❚❤❡ s♦❧✉t✐♦♥ ✐s t♦ r❡♣r❡s❡♥t ❛ q✉❡✉❡ ❜② ❛ ♣❛✐r ♦❢ ❧✐sts✱ ✇❤❡r❡ ([ x 1 , x 2 , . . . , x m ] , [ y 1 , y 2 , . . . , y n ]) r❡♣r❡s❡♥ts t❤❡ q✉❡✉❡ x 1 x 2 . . . x m y n . . . y 1 ✳ ❚❤❡ ❢r♦♥t ♣❛rt ♦❢ t❤❡ q✉❡✉❡ ✐s st♦r❡❞ ✐♥ ♦r❞❡r✱ ❛♥❞ t❤❡ r❡❛r ♣❛rt ✐s st♦r❡❞ ✐♥ r❡✈❡rs❡ ♦r❞❡r✳ ❚❤❡ ❡♥q ♦♣❡r❛t✐♦♥ ❛❞❞s ❡❧❡♠❡♥ts t♦ t❤❡ r❡❛r ♣❛rt ✉s✐♥❣ ❝♦♥s✱ s✐♥❝❡ t❤✐s ❧✐st ✐s r❡✈❡rs❡❞❀ t❤✉s✱ ❡♥q t❛❦❡s ❝♦♥st❛♥t t✐♠❡✳ ❚❤❡ ❞❡q ❛♥❞ q❤❞ ♦♣❡r❛t✐♦♥s ❧♦♦❦ ❛t t❤❡ ❢r♦♥t ♣❛rt✱ ✇❤✐❝❤ ♥♦r♠❛❧❧② t❛❦❡s ❝♦♥st❛♥t t✐♠❡✱ s✐♥❝❡ t❤✐s ❧✐st ✐s st♦r❡❞ ✐♥ ♦r❞❡r✳ ❇✉t s♦♠❡t✐♠❡s ❞❡q r❡♠♦✈❡s t❤❡ ❧❛st ❡❧❡♠❡♥t ❢r♦♠ t❤❡ ❢r♦♥t ♣❛rt❀ ✇❤❡♥ t❤✐s ❤❛♣♣❡♥s✱ ✐t r❡✈❡rs❡s t❤❡ r❡❛r ♣❛rt✱ ✇❤✐❝❤ ❜❡❝♦♠❡s t❤❡ ♥❡✇ ❢r♦♥t ♣❛rt✳ ❆♠♦rt✐③❡❞ t✐♠❡ r❡❢❡rs t♦ t❤❡ ❝♦st ♣❡r ♦♣❡r❛t✐♦♥ ❛✈❡r❛❣❡❞ ♦✈❡r t❤❡ ❧✐❢❡t✐♠❡ ♦❢ ❛♥② ❝♦♠♣❧❡t❡ ❡①❡❝✉t✐♦♥✳ ❊✈❡♥ ❢♦r t❤❡ ✇♦rst ♣♦ss✐❜❧❡ ❡①❡❝✉t✐♦♥✱ t❤❡ ❛✈❡r❛❣❡ ❝♦st ♣❡r ♦♣❡r❛t✐♦♥ t✉r♥s ♦✉t t♦ ❜❡ ❝♦♥st❛♥t❀ s❡❡ t❤❡ ❛♥❛❧②s✐s ❜❡❧♦✇✳
■❳ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✾✶ Efficient Functional Queues: Code datatype ’a queue = Q of ’a list * ’a list fun norm(Q([],tls)) = Q(rev tls, []) Slide 905 | norm q = q fun qnull(Q([],[])) = true | qnull _ = false fun enq(Q(hds,tls), x) = norm(Q(hds, x::tls)) fun deq(Q(x::hds, tls)) = norm(Q(hds, tls)) ❚❤❡ ❞❛t❛t②♣❡ ♦❢ q✉❡✉❡s ♣r❡✈❡♥ts ❝♦♥❢✉s✐♦♥ ✇✐t❤ ♦t❤❡r ♣❛✐rs ♦❢ ❧✐sts✳ ❚❤❡ ❡♠♣t② q✉❡✉❡✱ ♦♠✐tt❡❞ t♦ s❛✈❡ s♣❛❝❡ ♦♥ t❤❡ s❧✐❞❡✱ ❤❛s ❜♦t❤ ♣❛rts ❡♠♣t②✳ ✈❛❧ q❡♠♣t② ❂ ◗✭❬❪✱❬❪✮❀ ❚❤❡ ❢✉♥❝t✐♦♥ ♥♦r♠ ♣✉ts ❛ q✉❡✉❡ ✐♥t♦ ♥♦r♠❛❧ ❢♦r♠✱ ❡♥s✉r✐♥❣ t❤❛t t❤❡ ❢r♦♥t ♣❛rt ✐s ♥❡✈❡r ❡♠♣t② ✉♥❧❡ss t❤❡ ❡♥t✐r❡ q✉❡✉❡ ✐s ❡♠♣t②✳ ❋✉♥❝t✐♦♥s ❞❡q ❛♥❞ ❡♥q ❝❛❧❧ ♥♦r♠ t♦ ♥♦r♠❛❧✐③❡ t❤❡✐r r❡s✉❧t✳ ❇❡❝❛✉s❡ q✉❡✉❡s ❛r❡ ✐♥ ♥♦r♠❛❧ ❢♦r♠✱ t❤❡✐r ❤❡❛❞ ✐s ❝❡rt❛✐♥ t♦ ❜❡ ✐♥ t❤❡✐r ❢r♦♥t ♣❛rt✱ s♦ q❤❞ ✭❛❧s♦ ♦♠✐tt❡❞ ❢r♦♠ t❤❡ s❧✐❞❡✮ ❧♦♦❦s t❤❡r❡✳ ❢✉♥ q❤❞✭◗✭①✿✿❴✱❴✮✮ ❂ ① ▲❡t ✉s ❛♥❛❧②s❡ t❤❡ ❝♦st ♦❢ ❛♥ ❡①❡❝✉t✐♦♥ ❝♦♠♣r✐s✐♥❣ ✭✐♥ ❛♥② ♣♦ss✐❜❧❡ ♦r❞❡r✮ n ❡♥q ♦♣❡r❛t✐♦♥s ❛♥❞ n ❞❡q ♦♣❡r❛t✐♦♥s✱ st❛rt✐♥❣ ✇✐t❤ ❛♥ ❡♠♣t② q✉❡✉❡✳ ❊❛❝❤ ❡♥q ♦♣❡r❛t✐♦♥ ✇✐❧❧ ♣❡r❢♦r♠ ♦♥❡ ❝♦♥s✱ ❛❞❞✐♥❣ ❛♥ ❡❧❡♠❡♥t t♦ t❤❡ r❡❛r ♣❛rt✳ ❙✐♥❝❡ t❤❡ ✜♥❛❧ q✉❡✉❡ ♠✉st ❜❡ ❡♠♣t②✱ ❡❛❝❤ ❡❧❡♠❡♥t ♦❢ t❤❡ r❡❛r ♣❛rt ❣❡ts tr❛♥s❢❡rr❡❞ t♦ t❤❡ ❢r♦♥t ♣❛rt✳ ❚❤❡ ❝♦rr❡s♣♦♥❞✐♥❣ r❡✈❡rs❛❧s ♣❡r❢♦r♠ ♦♥❡ ❝♦♥s ♣❡r ❡❧❡♠❡♥t✳ ❚❤✉s✱ t❤❡ t♦t❛❧ ❝♦st ♦❢ t❤❡ s❡r✐❡s ♦❢ q✉❡✉❡ ♦♣❡r❛t✐♦♥s ✐s 2 n ❝♦♥s ♦♣❡r❛t✐♦♥s✱ ❛♥ ❛✈❡r❛❣❡ ♦❢ ✷ ♣❡r ♦♣❡r❛t✐♦♥✳ ❚❤❡ ❛♠♦rt✐③❡❞ t✐♠❡ ✐s O (1) ✳ ❚❤❡r❡ ✐s ❛ ❝❛t❝❤✳ ❚❤❡ ❝♦♥s❡s ♥❡❡❞ ♥♦t ❜❡ ❞✐str✐❜✉t❡❞ ❡✈❡♥❧②❀ r❡✈❡rs✐♥❣ ❛ ❧♦♥❣ ❧✐st ❝♦✉❧❞ t❛❦❡ ✉♣ t♦ n − 1 ♦❢ t❤❡♠✳ ❯♥♣r❡❞✐❝t❛❜❧❡ ❞❡❧❛②s ♠❛❦❡ t❤❡ ❛♣♣r♦❛❝❤ ✉♥s✉✐t❛❜❧❡ ❢♦r r❡❛❧✲t✐♠❡ ♣r♦❣r❛♠♠✐♥❣ ✱ ✇❤❡r❡ ❞❡❛❞❧✐♥❡s ♠✉st ❜❡ ♠❡t✳
■❳ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✾✷ Aside: The case Expression fun wheels v = Slide 906 case v of Bike => 2 | Motorbike _ => 2 | Car robin => if robin then 3 else 4 | Lorry w => w; ❚❤❡ ❝❛s❡ ❡①♣r❡ss✐♦♥ ❤❛s t❤❡ ❢♦r♠ ❝❛s❡ E ♦❢ P 1 ❂❃ E 1 ⑤ · · · ⑤ P n ❂❃ E n ■t tr✐❡s t❤❡ ♣❛tt❡r♥s ♦♥❡ ❛❢t❡r t❤❡ ♦t❤❡r✳ ❲❤❡♥ ♦♥❡ ♠❛t❝❤❡s✱ ✐t ❡✈❛❧✉❛t❡s t❤❡ ❝♦rr❡s♣♦♥❞✐♥❣ ❡①♣r❡ss✐♦♥✳ ■t ❜❡❤❛✈❡s ♣r❡❝✐s❡❧② ❧✐❦❡ t❤❡ ❜♦❞② ♦❢ ❛ ❢✉♥❝t✐♦♥ ❞❡❝❧❛r❛t✐♦♥✳ ❲❡ ❝♦✉❧❞ ❤❛✈❡ ❞❡✜♥❡❞ ❢✉♥❝t✐♦♥ ✇❤❡❡❧s ✭❢r♦♠ ▲❡❝t✳ ✼✮ ❛s s❤♦✇♥ ❛❜♦✈❡✳ ❆ ♣r♦❣r❛♠ ♣❤r❛s❡ ♦❢ t❤❡ ❢♦r♠ P 1 ❂❃ E 1 ⑤ · · · ⑤ P n ❂❃ E n ✐s ❝❛❧❧❡❞ ❛ ▼❛t❝❤ ✳ ❆ ♠❛t❝❤ ♠❛② ❛❧s♦ ❛♣♣❡❛r ❛❢t❡r ❛♥ ❡①❝❡♣t✐♦♥ ❤❛♥❞❧❡r ✭▲❡❝t✳ ✼✮ ❛♥❞ ✇✐t❤ ❢♥ ✲♥♦t❛t✐♦♥ t♦ ❡①♣r❡ss✐♦♥ ❢✉♥❝t✐♦♥s ❞✐r❡❝t❧② ✭▲❡❝t✳ ✶✵✮✳
■❳ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✾✸ Breadth-First Tree Traversal — Using Queues fun breadth q = if qnull q then [] else case qhd q of Slide 907 Lf => breadth (deq q) | Br(v,t,u) => v :: breadth(enq(enq(deq q, t), u)) 0.14 secs to search depth 12 binary tree (4095 labels) 200 times faster! ❚❤✐s ❢✉♥❝t✐♦♥ ✐♠♣❧❡♠❡♥ts t❤❡ s❛♠❡ ❛❧❣♦r✐t❤♠ ❛s ♥❜r❡❛❞t❤ ❜✉t ✉s❡s ❛ ❞✐✛❡r❡♥t ❞❛t❛ str✉❝t✉r❡✳ ■t r❡♣r❡s❡♥ts q✉❡✉❡s ✉s✐♥❣ t②♣❡ q✉❡✉❡ ✐♥st❡❛❞ ♦❢ t②♣❡ ❧✐st ✳ ❚♦ ❝♦♠♣❛r❡ t❤❡✐r ❡✣❝✐❡♥❝②✱ ■ ❛♣♣❧✐❡❞ ❜♦t❤ ❢✉♥❝t✐♦♥s t♦ t❤❡ ❢✉❧❧ ❜✐♥❛r② tr❡❡ ♦❢ ❞❡♣t❤ ✶✷✱ ✇❤✐❝❤ ❝♦♥t❛✐♥s ✹✵✾✺ ❧❛❜❡❧s✳ ❚❤❡ ❢✉♥❝t✐♦♥ ♥❜r❡❛❞t❤ t♦♦❦ ✸✵ s❡❝♦♥❞s ✇❤✐❧❡ ❜r❡❛❞t❤ t♦♦❦ ♦♥❧② ✵✳✶✺ s❡❝♦♥❞s✿ ❢❛st❡r ❜② ❛ ❢❛❝t♦r ♦❢ ✷✵✵✳ ❋♦r ❧❛r❣❡r tr❡❡s✱ t❤❡ s♣❡❡❞✉♣ ✇♦✉❧❞ ❜❡ ❣r❡❛t❡r✳ ❈❤♦♦s✐♥❣ t❤❡ r✐❣❤t ❞❛t❛ str✉❝t✉r❡ ♣❛②s ❤❛♥❞s♦♠❡❧②✳
■❳ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✾✹ Iterative deepening: Another Exhaustive Search Breadth-first search examines O ( b d ) nodes: 1 + b + · · · + b d = b d +1 − 1 b = branching factor Slide 908 b − 1 d = depth Recompute nodes at depth d instead of storing them Time factor is b/ ( b − 1) if b > 1 ; complexity is still O ( b d ) Space required at depth d drops from b d to d ❇r❡❛❞t❤✲✜rst s❡❛r❝❤ ✐s ♥♦t ♣r❛❝t✐❝❛❧ ❢♦r ❜✐❣ ♣r♦❜❧❡♠s✿ ✐t ✉s❡s t♦♦ ♠✉❝❤ s♣❛❝❡✳ ❈♦♥s✐❞❡r t❤❡ s❧✐❣❤t❧② ♠♦r❡ ❣❡♥❡r❛❧ ♣r♦❜❧❡♠ ♦❢ s❡❛r❝❤✐♥❣ tr❡❡s ✇❤♦s❡ ❜r❛♥❝❤✐♥❣ ❢❛❝t♦r ✐s b ✭❢♦r ❜✐♥❛r② tr❡❡s✱ b = 2 ✮✳ ❚❤❡♥ ❜r❡❛❞t❤✲✜rst s❡❛r❝❤ t♦ ❞❡♣t❤ d ❡①❛♠✐♥❡s ( b d +1 − 1) / ( b − 1) ♥♦❞❡s✱ ✇❤✐❝❤ ✐s O ( b d ) ✱ ✐❣♥♦r✐♥❣ t❤❡ ❝♦♥st❛♥t ❢❛❝t♦r ♦❢ b/ ( b − 1) ✳✮ ❙✐♥❝❡ ❛❧❧ ♥♦❞❡s t❤❛t ❛r❡ ❡①❛♠✐♥❡❞ ❛r❡ ❛❧s♦ st♦r❡❞✱ t❤❡ s♣❛❝❡ ❛♥❞ t✐♠❡ r❡q✉✐r❡♠❡♥ts ❛r❡ ❜♦t❤ O ( b d ) ✳ ❉❡♣t❤✲✜rst ✐t❡r❛t✐✈❡ ❞❡❡♣❡♥✐♥❣ ❝♦♠❜✐♥❡s t❤❡ s♣❛❝❡ ❡✣❝✐❡♥❝② ♦❢ ❞❡♣t❤✲✜rst ✇✐t❤ t❤❡ ❵♥❡❛r❡st✲✜rst✬ ♣r♦♣❡rt② ♦❢ ❜r❡❛❞t❤✲✜rst s❡❛r❝❤✳ ■t ♣❡r❢♦r♠s r❡♣❡❛t❡❞ ❞❡♣t❤✲✜rst s❡❛r❝❤❡s ✇✐t❤ ✐♥❝r❡❛s✐♥❣ ❞❡♣t❤ ❜♦✉♥❞s✱ ❡❛❝❤ t✐♠❡ ❞✐s❝❛r❞✐♥❣ t❤❡ r❡s✉❧t ♦❢ t❤❡ ♣r❡✈✐♦✉s s❡❛r❝❤✳ ❚❤✉s ✐t s❡❛r❝❤❡s t♦ ❞❡♣t❤ ✶✱ t❤❡♥ t♦ ❞❡♣t❤ ✷✱ ❛♥❞ s♦ ♦♥ ✉♥t✐❧ ✐t ✜♥❞s ❛ s♦❧✉t✐♦♥✳ ❲❡ ❝❛♥ ❛✛♦r❞ t♦ ❞✐s❝❛r❞ ♣r❡✈✐♦✉s r❡s✉❧ts ❜❡❝❛✉s❡ t❤❡ ♥✉♠❜❡r ♦❢ ♥♦❞❡s ✐s ❣r♦✇✐♥❣ ❡①♣♦♥❡♥t✐❛❧❧②✳ ❚❤❡r❡ ❛r❡ b d +1 ♥♦❞❡s ❛t ❧❡✈❡❧ d + 1 ❀ ✐❢ b ≥ 2 ✱ t❤✐s ♥✉♠❜❡r ❛❝t✉❛❧❧② ❡①❝❡❡❞s t❤❡ t♦t❛❧ ♥✉♠❜❡r ♦❢ ♥♦❞❡s ♦❢ ❛❧❧ ♣r❡✈✐♦✉s ❧❡✈❡❧s ♣✉t t♦❣❡t❤❡r✱ ♥❛♠❡❧② ( b d +1 − 1) / ( b − 1) ✳ ❑♦r❢ ❬✶✶❪ s❤♦✇s t❤❛t t❤❡ t✐♠❡ ♥❡❡❞❡❞ ❢♦r ✐t❡r❛t✐✈❡ ❞❡❡♣❡♥✐♥❣ t♦ r❡❛❝❤ ❞❡♣t❤ d ✐s ♦♥❧② b/ ( b − 1) t✐♠❡s t❤❛t ❢♦r ❜r❡❛❞t❤✲✜rst s❡❛r❝❤✱ ✐❢ b > 1 ✳ ❚❤✐s ✐s ❛ ❝♦♥st❛♥t ❢❛❝t♦r❀ ❜♦t❤ ❛❧❣♦r✐t❤♠s ❤❛✈❡ t❤❡ s❛♠❡ t✐♠❡ ❝♦♠♣❧❡①✐t②✱ O ( b d ) ✳ ■♥ t②♣✐❝❛❧ ❛♣♣❧✐❝❛t✐♦♥s ✇❤❡r❡ b ≥ 2 t❤❡ ❡①tr❛ ❢❛❝t♦r ♦❢ b/ ( b − 1) ✐s q✉✐t❡ t♦❧❡r❛❜❧❡✳ ❚❤❡ r❡❞✉❝t✐♦♥ ✐♥ t❤❡ s♣❛❝❡ r❡q✉✐r❡♠❡♥t ✐s ❡①♣♦♥❡♥t✐❛❧✱ ❢r♦♠ O ( b d ) ❢♦r ❜r❡❛❞t❤✲✜rst t♦ O ( d ) ❢♦r ✐t❡r❛t✐✈❡ ❞❡❡♣❡♥✐♥❣✳
■❳ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✾✺ Another Abstract Data Type: Stacks • empty is the empty stack Slide 909 • null tests whether a stack is empty • top returns the element at the top of a stack • pop discards the element at the top of a stack • push adds an element at the top of a stack ❆ st❛❝❦ ✐s ❛ s❡q✉❡♥❝❡ s✉❝❤ t❤❛t ✐t❡♠s ❝❛♥ ❜❡ ❛❞❞❡❞ ♦r r❡♠♦✈❡❞ ❢r♦♠ t❤❡ ❤❡❛❞ ♦♥❧②✳ ❆ st❛❝❦ ♦❜❡②s ❛ ▲❛st✲■♥✲❋✐rst✲❖✉t ✭▲■❋❖✮ ❞✐s❝✐♣❧✐♥❡✿ t❤❡ ✐t❡♠ ♥❡①t t♦ ❜❡ r❡♠♦✈❡❞ ✐s t❤❡ ♦♥❡ t❤❛t ❤❛s ❜❡❡♥ ✐♥ t❤❡ q✉❡✉❡ ❢♦r t❤❡ s❤♦rt❡st t✐♠❡✳ ▲✐sts ❝❛♥ ❡❛s✐❧② ✐♠♣❧❡♠❡♥t st❛❝❦s ❜❡❝❛✉s❡ ❜♦t❤ ❝♦♥s ❛♥❞ ❤❞ ❛✛❡❝t t❤❡ ❤❡❛❞✳ ❇✉t ✉♥❧✐❦❡ ❧✐sts✱ st❛❝❦s ❛r❡ ♦❢t❡♥ r❡❣❛r❞❡❞ ❛s ❛♥ ✐♠♣❡r❛t✐✈❡ ❞❛t❛ str✉❝t✉r❡✿ t❤❡ ❡✛❡❝t ♦❢ ♣✉s❤ ♦r ♣♦♣ ✐s t♦ ❝❤❛♥❣❡ ❛♥ ❡①✐st✐♥❣ st❛❝❦✱ ♥♦t r❡t✉r♥ ❛ ♥❡✇ ♦♥❡✳ ■♥ ❝♦♥✈❡♥t✐♦♥❛❧ ♣r♦❣r❛♠♠✐♥❣ ❧❛♥❣✉❛❣❡s✱ ❛ st❛❝❦ ✐s ♦❢t❡♥ ✐♠♣❧❡♠❡♥t❡❞ ❜② st♦r✐♥❣ t❤❡ ❡❧❡♠❡♥ts ✐♥ ❛♥ ❛rr❛②✱ ✉s✐♥❣ ❛ ✈❛r✐❛❜❧❡ ✭t❤❡ st❛❝❦ ♣♦✐♥t❡r ✮ t♦ ❝♦✉♥t t❤❡♠✳ ▼♦st ❧❛♥❣✉❛❣❡ ♣r♦❝❡ss♦rs ❦❡❡♣ tr❛❝❦ ♦❢ r❡❝✉rs✐✈❡ ❢✉♥❝t✐♦♥ ❝❛❧❧s ✉s✐♥❣ ❛♥ ✐♥t❡r♥❛❧ st❛❝❦✳
■❳ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✾✻ A Survey of Search Methods 1. Depth-first : use a stack (efficient but incomplete) 2. Breadth-first : use a queue (uses too much space!) Slide 910 3. Iterative deepening : use (1) to get benefits of (2) (trades time for space) 4. Best-first : use a priority queue (heuristic search) The data structure determines the search! ❙❡❛r❝❤ ♣r♦❝❡❞✉r❡s ❝❛♥ ❜❡ ❝❧❛ss✐✜❡❞ ❜② t❤❡ ❞❛t❛ str✉❝t✉r❡ ✉s❡❞ t♦ st♦r❡ ♣❡♥❞✐♥❣ s✉❜tr❡❡s✳ ❉❡♣t❤✲✜rst s❡❛r❝❤ st♦r❡s t❤❡♠ ♦♥ ❛ st❛❝❦✱ ✇❤✐❝❤ ✐s ✐♠♣❧✐❝✐t ✐♥ ❢✉♥❝t✐♦♥s ❧✐❦❡ ✐♥♦r❞❡r ✱ ❜✉t ❝❛♥ ❜❡ ♠❛❞❡ ❡①♣❧✐❝✐t✳ ❇r❡❛❞t❤✲✜rst s❡❛r❝❤ st♦r❡s s✉❝❤ ♥♦❞❡s ✐♥ ❛ q✉❡✉❡✳ ❆♥ ✐♠♣♦rt❛♥t ✈❛r✐❛t✐♦♥ ✐s t♦ st♦r❡ t❤❡ ♥♦❞❡s ✐♥ ❛ ♣r✐♦r✐t② q✉❡✉❡ ✱ ✇❤✐❝❤ ✐s ❛♥ ♦r❞❡r❡❞ s❡q✉❡♥❝❡✳ ❚❤❡ ♣r✐♦r✐t② q✉❡✉❡ ❛♣♣❧✐❡s s♦♠❡ s♦rt ♦❢ r❛♥❦✐♥❣ ❢✉♥❝t✐♦♥ t♦ t❤❡ ♥♦❞❡s✱ ♣❧❛❝✐♥❣ ❤✐❣❤❡r✲r❛♥❦❡❞ ♥♦❞❡s ❜❡❢♦r❡ ❧♦✇❡r✲r❛♥❦❡❞ ♦♥❡s✳ ❚❤❡ r❛♥❦✐♥❣ ❢✉♥❝t✐♦♥ t②♣✐❝❛❧❧② ❡st✐♠❛t❡s t❤❡ ❞✐st❛♥❝❡ ❢r♦♠ t❤❡ ♥♦❞❡ t♦ ❛ s♦❧✉t✐♦♥✳ ■❢ t❤❡ ❡st✐♠❛t❡ ✐s ❣♦♦❞✱ t❤❡ s♦❧✉t✐♦♥ ✐s ❧♦❝❛t❡❞ s✇✐❢t❧②✳ ❚❤✐s ♠❡t❤♦❞ ✐s ❝❛❧❧❡❞ ❜❡st✲✜rst s❡❛r❝❤ ✳ ❚❤❡ ♣r✐♦r✐t② q✉❡✉❡ ❝❛♥ ❜❡ ❦❡♣t ❛s ❛ s♦rt❡❞ ❧✐st✱ ❛❧t❤♦✉❣❤ t❤✐s ✐s s❧♦✇✳ ❇✐♥❛r② s❡❛r❝❤ tr❡❡s ✇♦✉❧❞ ❜❡ ♠✉❝❤ ❜❡tt❡r ♦♥ ❛✈❡r❛❣❡✱ ❛♥❞ ❢❛♥❝✐❡r ❞❛t❛ str✉❝✲ t✉r❡s ✐♠♣r♦✈❡ ♠❛tt❡rs ❢✉rt❤❡r✳ ❘❡❧❛t❡❞ ♠❛t❡r✐❛❧ ✐s ✐♥ ▼▲ ❢♦r t❤❡ ❲♦r❦✐♥❣ Pr♦❣r❛♠♠❡r ✱ ▲❡❛r♥✐♥❣ ❣✉✐❞❡✳ ♣❛❣❡s ✷✺✽✕✷✻✸✳ ❋♦r ♣r✐♦r✐t② q✉❡✉❡s✱ s❡❡ ✶✺✾✕✶✻✹✳
❳ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✾✼ Functions as Values In ML, functions can be • passed as arguments to other functions, Slide 1001 • returned as results , • put into lists, trees, etc., • but not tested for equality. Functions represent algorithms and infinite data structures . Pr♦❣r❡ss ✐♥ ♣r♦❣r❛♠♠✐♥❣ ❧❛♥❣✉❛❣❡s ❝❛♥ ❜❡ ♠❡❛s✉r❡❞ ❜② ✇❤❛t ❛❜str❛❝✲ t✐♦♥s t❤❡② ❛❞♠✐t✳ ❈♦♥❞✐t✐♦♥❛❧ ❡①♣r❡ss✐♦♥s ✭❞❡s❝❡♥❞❡❞ ❢r♦♠ ❝♦♥❞✐t✐♦♥❛❧ ❥✉♠♣s ❜❛s❡❞ ♦♥ t❤❡ s✐❣♥ ♦❢ s♦♠❡ ♥✉♠❡r✐❝ ✈❛r✐❛❜❧❡✮ ❛♥❞ ♣❛r❛♠❡tr✐❝ t②♣❡s s✉❝❤ ❛s α ❧✐st ❛r❡ ❡①❛♠♣❧❡s✳ ❚❤❡ ✐❞❡❛ t❤❛t ❢✉♥❝t✐♦♥s ❝♦✉❧❞ ❜❡ ✉s❡❞ ❛s ✈❛❧✉❡s ✐♥ ❛ ❝♦♠♣✉t❛t✐♦♥ ❛r♦s❡ ❡❛r❧②✱ ❜✉t ✐t t♦♦❦ s♦♠❡ t✐♠❡ ❜❡❢♦r❡ t❤❡ ✐❞❡❛ ✇❛s ❢✉❧❧② r❡❛❧✐③❡❞✳ ▼❛♥② ♣r♦❣r❛♠♠✐♥❣ ❧❛♥❣✉❛❣❡s ❧❡t ❢✉♥❝t✐♦♥s ❜❡ ♣❛ss❡❞ ❛s ❛r❣✉♠❡♥ts t♦ ♦t❤❡r ❢✉♥❝t✐♦♥s✱ ❜✉t ❢❡✇ t❛❦❡ t❤❡ tr♦✉❜❧❡ ♥❡❡❞❡❞ t♦ ❛❧❧♦✇ ❢✉♥❝t✐♦♥s t♦ ❜❡ r❡t✉r♥❡❞ ❛s r❡s✉❧ts✳ ■♥ ♠❛t❤❡♠❛t✐❝s✱ ❛ ❢✉♥❝t✐♦♥❛❧ ♦r ❤✐❣❤❡r✲♦r❞❡r ❢✉♥❝t✐♦♥ ✐s ❛ ❢✉♥❝t✐♦♥ t❤❛t tr❛♥s❢♦r♠s ♦t❤❡r ❢✉♥❝t✐♦♥s✳ ▼❛♥② ❢✉♥❝t✐♦♥❛❧s ❛r❡ ❢❛♠✐❧✐❛r ❢r♦♠ ♠❛t❤❡♠❛t✐❝s✱ s✉❝❤ ❛s ✐♥t❡❣r❛❧ ❛♥❞ ❞✐✛❡r❡♥t✐❛❧ ♦♣❡r❛t♦rs ♦❢ t❤❡ ❝❛❧❝✉❧✉s✳ ❚♦ ❛ ♠❛t❤❡♠❛t✐✲ ❝✐❛♥✱ ❛ ❢✉♥❝t✐♦♥ ✐s t②♣✐❝❛❧❧② ❛♥ ✐♥✜♥✐t❡✱ ✉♥❝♦♠♣✉t❛❜❧❡ ♦❜❥❡❝t✳ ❲❡ ✉s❡ ▼▲ ❢✉♥❝t✐♦♥s t♦ r❡♣r❡s❡♥t ❛❧❣♦r✐t❤♠s✳ ❙♦♠❡t✐♠❡s t❤❡② r❡♣r❡s❡♥t ✐♥✜♥✐t❡ ❝♦❧❧❡❝✲ t✐♦♥s ♦❢ ❞❛t❛ ❣✐✈❡♥ ❜② ❝♦♠♣✉t❛t✐♦♥ r✉❧❡s✳ ❋✉♥❝t✐♦♥s ❝❛♥♥♦t ❜❡ ❝♦♠♣❛r❡❞ ❢♦r ❡q✉❛❧✐t②✳ ❚❤❡ ❜❡st ✇❡ ❝♦✉❧❞ ❞♦✱ ✇✐t❤ r❡❛s♦♥❛❜❧❡ ❡✣❝✐❡♥❝②✱ ✇♦✉❧❞ ❜❡ t♦ t❡st ✐❞❡♥t✐t② ♦❢ ♠❛❝❤✐♥❡ ❛❞❞r❡ss❡s✳ ❚✇♦ s❡♣❛r❛t❡ ♦❝❝✉rr❡♥❝❡s ♦❢ t❤❡ s❛♠❡ ❢✉♥❝t✐♦♥ ❞❡❝❧❛r❛t✐♦♥ ✇♦✉❧❞ ❜❡ r❡❣❛r❞❡❞ ❛s ✉♥❡q✉❛❧ ❜❡❝❛✉s❡ t❤❡② ✇♦✉❧❞ ❜❡ ❝♦♠♣✐❧❡❞ t♦ ❞✐✛❡r❡♥t ♠❛❝❤✐♥❡ ❛❞❞r❡ss❡s✳ ❙✉❝❤ ❛ ❧♦✇✲❧❡✈❡❧ ❢❡❛t✉r❡ ❤❛s ♥♦ ♣❧❛❝❡ ✐♥ ❛ ❧❛♥❣✉❛❣❡ ❧✐❦❡ ▼▲✳
❳ ❋♦✉♥❞❛t✐♦♥s ♦❢ ❈♦♠♣✉t❡r ❙❝✐❡♥❝❡ ✾✽ Functions Without Names fn x => E is the function f such that f ( x ) = E The function (fn n => n*2) is a doubling function . Slide 1002 (fn n => n*2); > val it = fn : int -> int (fn n => n*2) 17; > val it = 34 : int ■❢ ❢✉♥❝t✐♦♥s ❛r❡ t♦ ❜❡ r❡❣❛r❞❡❞ ❛s ❝♦♠♣✉t❛t✐♦♥❛❧ ✈❛❧✉❡s✱ t❤❡♥ ✇❡ ♥❡❡❞ ❛ ♥♦t❛t✐♦♥ ❢♦r t❤❡♠✳ ❚❤❡ ❢♥ ✲♥♦t❛t✐♦♥ ❡①♣r❡ss❡s ❛ ❢✉♥❝t✐♦♥ ✈❛❧✉❡ ✇✐t❤♦✉t ❣✐✈✐♥❣ t❤❡ ❢✉♥❝t✐♦♥ ❛ ♥❛♠❡✳ ✭❙♦♠❡ ♣❡♦♣❧❡ ♣r♦♥♦✉♥❝❡ ❢♥ ❛s ❵❧❛♠❜❞❛✬ ❜❡❝❛✉s❡ ✐t ♦r✐❣✐♥❛t❡❞ ✐♥ t❤❡ λ ✲❝❛❧❝✉❧✉s✳✮ ■t ❝❛♥♥♦t ❡①♣r❡ss r❡❝✉rs✐♦♥✳ ■ts ♠❛✐♥ ♣✉r♣♦s❡ ✐s t♦ ♣❛❝❦❛❣❡ ✉♣ s♠❛❧❧ ❡①♣r❡ss✐♦♥s t❤❛t ❛r❡ t♦ ❜❡ ❛♣♣❧✐❡❞ r❡♣❡❛t❡❞❧② ✉s✐♥❣ s♦♠❡ ♦t❤❡r ❢✉♥❝t✐♦♥✳ ❚❤❡ ❡①♣r❡ss✐♦♥ ✭❢♥ ♥ ❂❃ ♥✯✷✮ ❤❛s t❤❡ s❛♠❡ ✈❛❧✉❡ ❛s t❤❡ ✐❞❡♥t✐✜❡r ❞♦✉❜❧❡ ✱ ❞❡❝❧❛r❡❞ ❛s ❢♦❧❧♦✇s✿ ❢✉♥ ❞♦✉❜❧❡ ♥ ❂ ♥✯✷ ❚❤❡ ❢♥ ✲♥♦t❛t✐♦♥ ❛❧❧♦✇s ♣❛tt❡r♥✲♠❛t❝❤✐♥❣✱ ❧✐❦❡ ❝❛s❡ ❡①♣r❡ss✐♦♥s ❛♥❞ ❡①✲ ❝❡♣t✐♦♥ ❤❛♥❞❧❡rs✱ t♦ ❡①♣r❡ss ❢✉♥❝t✐♦♥s ✇✐t❤ ♠✉❧t✐♣❧❡ ❝❧❛✉s❡s✿ ❢♥ P 1 ❂❃ E 1 ⑤ ✳✳✳ ⑤ P n ❂❃ E n ❚❤✐s r❛r❡❧②✲✉s❡❞ ❡①♣r❡ss✐♦♥ ❛❜❜r❡✈✐❛t❡s t❤❡ ❧♦❝❛❧ ❞❡❝❧❛r❛t✐♦♥ ❧❡t ❢✉♥ f ( P 1 ) ❂ E 1 ⑤ ✳✳✳ ⑤ f ( P n ) ❂ E n ✐♥ f ❡♥❞ ❋♦r ❡①❛♠♣❧❡✱ t❤❡ ❢♦❧❧♦✇✐♥❣ ❞❡❝❧❛r❛t✐♦♥s ❛r❡ ❡q✉✐✈❛❧❡♥t✿ ✈❛❧ ♥♦t ❂ ✭❢♥ ❢❛❧s❡ ❂❃ tr✉❡ ⑤ tr✉❡ ❂❃ ❢❛❧s❡✮ ❢✉♥ ♥♦t ❢❛❧s❡ ❂ tr✉❡ ⑤ ♥♦t tr✉❡ ❂ ❢❛❧s❡
Recommend
More recommend