/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 0 . Ġxmm mm mo vo Ċ Ġ*/ Ċ package Ġalgorithms Ċ Ċ import Ġedu . pr inc et on . cs . al gs 4 . In Ċ import Ġext . compareTo Ċ import Ġkotlin . math . acos Ċ import Ġkotlin . math . max Ċ Ċ /** Ċ Ġ* Ġåľ¨ ä¸Ģä¸ª åĪĹè¡¨ ä¸Ń äºĮ åĪĨ æŁ¥ æī¾åĪ° æŁĲä¸ª åĢ¼ ( åįĩ åºı ) Ċ Ġ* Ġ@ author Ġxmm mm mo vo Ċ Ġ* Ġ@ date Ġ 2 0 2 0 / 7 / 2 8 Ġ 1 1 : 4 6 Ċ Ġ* Ġ@ param Ġlist Ġ åĪĹè¡¨ Ċ Ġ* Ġ@ param Ġkey ĠéľĢè¦ģ æŁ¥æī¾ çļĦåĢ¼ Ċ Ġ* Ġ@ param Ġ_ lo Ġ å·¦ èĮĥåĽ´ Ġé»ĺè®¤ ä¸º 0 Ċ Ġ* Ġ@ param Ġ_ hi Ġ åı³ èĮĥåĽ´ Ġé»ĺè®¤ ä¸º list . size Ġ- Ġ 1 Ċ Ġ* Ġ@ return ĠæŁ¥ æī¾åĪ° äºĨ å°± è¿ĶåĽŀ ä¸ĭ æłĩ ï¼Į æ²¡ æŁ¥ æī¾åĪ° å°± è¿ĶåĽŀ - 1 Ċ Ġ* Ġ@ since Ġversion - 1 . 0 Ċ Ġ*/ Ċ fun Ġ< T Ġ: ĠComparable < T >> Ġbinary Search ( ĊĠĠĠ Ġlist : ĠList < T >, Ġkey : ĠT , Ġ_ lo : ĠInt Ġ= Ġ 0 , Ġ_ hi : ĠInt Ġ= Ġlist . size Ġ- Ġ 1 Ċ ): ĠInt Ġ{ ĊĊĠĠĠ Ġvar Ġlo Ġ= Ġ_ lo ĊĠĠĠ Ġvar Ġhi Ġ= Ġ_ hi ĊĊĠĠĠ Ġwhile Ġ( lo Ġ<= Ġhi ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmid Ġ= Ġlo Ġ+ Ġ( hi Ġ- Ġlo ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġ< Ġlist [ mid ] Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhi Ġ= Ġmid Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġ> Ġlist [ mid ] Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlo Ġ= Ġmid Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmid ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġ- 1 Ċ } Ċ Ċ /** Ċ Ġ* Ġ å±Ģ éĥ¨ æľĢå°ı åħĥç´ł Ċ Ġ* Ġ@ author Ġxmm mm mo vo Ċ Ġ* Ġ@ date Ġ 2 0 2 0 / 7 / 3 0 Ġ 1 9 : 3 6 Ċ Ġ* Ġ@ param Ġlist Ġ æķ°åŃĹ åĪĹè¡¨ Ċ Ġ* Ġ@ param Ġ_ lo Ġ å·¦ è¾¹ çķĮ Ġé»ĺè®¤ ä¸º 0 Ċ Ġ* Ġ@ param Ġ_ hi Ġ åı³ è¾¹ çķĮ Ġé»ĺè®¤ ä¸º list . size Ġ- Ġ 1 Ċ Ġ* Ġ@ return Ġ æľĢå°ı åħĥç´ł ä¸ĭ æłĩ Ċ Ġ* Ġ@ throws ĠIllegalArgumentException Ġ æķ°ç»Ħ åħĥç´ł å°ı äºİ 3 ä¸ª æĹ¶ æĬĽ åĩº å¼Ĥå¸¸ Ċ Ġ* Ġ@ since Ġversion - 1 . 0 Ċ Ġ*/ Ċ fun Ġ< T Ġ: ĠComparable < T >> Ġpartial Min Elem ( ĊĠĠĠ Ġlist : ĠList < T >, Ġ_ lo : ĠInt Ġ= Ġ 0 , Ġ_ hi : ĠInt Ġ= Ġlist . size Ġ- Ġ 1 Ċ ): ĠInt Ġ{ ĊĠĠĠ Ġvar Ġlo Ġ= Ġ_ lo ĊĠĠĠ Ġvar Ġhi Ġ= Ġ_ hi ĊĊĠĠĠ Ġwhile Ġ( lo Ġ<= Ġhi ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġ åıĸ mid ĊĠĠĠĠĠĠĠ Ġval Ġmid Ġ= Ġlo Ġ+ Ġ( hi Ġ- Ġlo ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġ è¿ĻéĩĮ åĪĨ ä¸º ä¸īä¸ª æĥħåĨµ ĊĠĠĠĠĠĠĠĠ Ġ* ĠâĨ ĺ âĨ Ĺ çĽ´æİ¥ è¿ĶåĽŀ ĊĠĠĠĠĠĠĠĠ Ġ* ĠâĨ Ĺ âĨ Ĺ å¾Ģ å·¦ èµ° ĊĠĠĠĠĠĠĠĠ Ġ* ĠâĨ Ĺ âĨ ĺ éĥ½ åı¯ä»¥ ï¼Į åİŁ é¢ĺ æĺ¯ å¾Ģ å°ı çļĦ åľ°æĸ¹ èµ° ( åĽłä¸º éĥ¨åĪĨ æİĴåºı è¿ĩ çļĦ æķ°ç»Ħ ä¼ļ æĽ´ å¿« ) ĊĠĠĠĠĠĠĠĠ Ġ* ĠâĨ ĺ âĨ ĺ å¾Ģ åı³ èµ° ĊĠĠĠĠĠĠĠĠ Ġ* Ġ æĢ» ä¹ĭ å°±æĺ¯ å¾Ģ å°ı çļĦ åľ°æĸ¹ èµ° ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmid Ġ== Ġ_ lo Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( list [ mid ] Ġ< Ġlist [ mid Ġ+ Ġ 1 ]) Ġreturn Ġmid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġlo Ġ= Ġmid Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmid Ġ== Ġ_ hi Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( list [ mid ] Ġ< Ġlist [ mid Ġ- Ġ 1 ]) Ġreturn Ġmid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġhi Ġ= Ġmid Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist [ mid Ġ- Ġ 1 ] Ġ> Ġlist [ mid ] Ġ&& Ġlist [ mid ] Ġ< Ġlist [ mid Ġ+ Ġ 1 ] Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmid ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist [ mid Ġ- Ġ 1 ] Ġ< Ġlist [ mid ] Ġ&& Ġlist [ mid ] Ġ< Ġlist [ mid Ġ+ Ġ 1 ] Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhi Ġ= Ġmid Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist [ mid Ġ- Ġ 1 ] Ġ< Ġlist [ mid ] Ġ&& Ġlist [ mid ] Ġ> Ġlist [ mid Ġ+ Ġ 1 ] Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( list [ mid Ġ- Ġ 1 ] Ġ>= Ġlist [ mid Ġ+ Ġ 1 ]) Ġlo Ġ= Ġmid Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġhi Ġ= Ġmid Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlo Ġ= Ġmid Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġå½ĵ æīĢæľī åħĥç´ł éĥ½æĺ¯ ä¸Ģæł· çļĦæĹ¶åĢĻ æīį æ²¡æľī æľĢå°ı åĢ¼ ï¼Į è¿ĶåĽŀ - 1 ĊĠĠĠ Ġreturn Ġ- 1 Ċ } Ċ Ċ /** Ċ Ġ* Ġ å±Ģ éĥ¨ æľĢå¤§ åħĥç´ł Ċ Ġ* Ġ@ author Ġxmm mm mo vo Ċ Ġ* Ġ@ date Ġ 2 0 2 0 / 7 / 3 0 Ġ 1 9 : 3 6 Ċ Ġ* Ġ@ param Ġlist Ġ æķ°åŃĹ åĪĹè¡¨ Ċ Ġ* Ġ@ param Ġ_ lo Ġ å·¦ è¾¹ çķĮ Ġé»ĺè®¤ ä¸º 0 Ċ Ġ* Ġ@ param Ġ_ hi Ġ åı³ è¾¹ çķĮ Ġé»ĺè®¤ ä¸º list . size Ġ- Ġ 1 Ċ Ġ* Ġ@ return Ġ æľĢå¤§ åħĥç´ł ä¸ĭ æłĩ Ċ Ġ* Ġ@ throws ĠIllegalArgumentException Ġ æķ°ç»Ħ åħĥç´ł å°ı äºİ 3 ä¸ª æĹ¶ æĬĽ åĩº å¼Ĥå¸¸ Ċ Ġ* Ġ@ since Ġversion - 1 . 0 Ċ Ġ*/ Ċ fun Ġ< T Ġ: ĠComparable < T >> Ġpartial Max Elem ( ĊĠĠĠ Ġlist : ĠList < T >, Ġ_ lo : ĠInt Ġ= Ġ 0 , Ġ_ hi : ĠInt Ġ= Ġlist . size Ġ- Ġ 1 Ċ ): ĠInt Ġ{ ĊĠĠĠ Ġvar Ġlo Ġ= Ġ_ lo ĊĠĠĠ Ġvar Ġhi Ġ= Ġ_ hi ĊĊĠĠĠ Ġwhile Ġ( lo Ġ<= Ġhi ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġ åıĸ mid ĊĠĠĠĠĠĠĠ Ġval Ġmid Ġ= Ġlo Ġ+ Ġ( hi Ġ- Ġlo ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmid Ġ== Ġ_ lo Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( list [ mid ] Ġ> Ġlist [ mid Ġ+ Ġ 1 ]) Ġreturn Ġmid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġlo Ġ= Ġmid Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmid Ġ== Ġ_ hi Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( list [ mid ] Ġ> Ġlist [ mid Ġ- Ġ 1 ]) Ġreturn Ġmid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġhi Ġ= Ġmid Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist [ mid Ġ- Ġ 1 ] Ġ< Ġlist [ mid ] Ġ&& Ġlist [ mid ] Ġ> Ġlist [ mid Ġ+ Ġ 1 ] Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmid ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist [ mid Ġ- Ġ 1 ] Ġ> Ġlist [ mid ] Ġ&& Ġlist [ mid ] Ġ> Ġlist [ mid Ġ+ Ġ 1 ] Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhi Ġ= Ġmid Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist [ mid Ġ- Ġ 1 ] Ġ> Ġlist [ mid ] Ġ&& Ġlist [ mid ] Ġ< Ġlist [ mid Ġ+ Ġ 1 ] Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( list [ mid Ġ- Ġ 1 ] Ġ<= Ġlist [ mid Ġ+ Ġ 1 ]) Ġlo Ġ= Ġmid Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġhi Ġ= Ġmid Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlo Ġ= Ġmid Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġå½ĵ æīĢæľī åħĥç´ł éĥ½æĺ¯ ä¸Ģæł· çļĦæĹ¶åĢĻ æīį æ²¡æľī æľĢå°ı åĢ¼ ï¼Į è¿ĶåĽŀ - 1 ĊĠĠĠ Ġreturn Ġ- 1 Ċ } Ċ Ċ /** Ċ Ġ* Ġ åıĮ è°ĥ æŁ¥æī¾ Ċ Ġ* Ġ@ author Ġxmm mm mo vo Ċ Ġ* Ġ@ date Ġ 2 0 2 0 / 7 / 3 1 Ġ 1 5 : 4 2 Ċ Ġ* Ġ@ param Ġlist Ġ æķ°åŃĹ åĪĹè¡¨ Ċ Ġ* Ġ@ param Ġ_ lo Ġ å·¦ è¾¹ çķĮ Ġé»ĺè®¤ ä¸º 0 Ċ Ġ* Ġ@ param Ġ_ hi Ġ åı³ è¾¹ çķĮ Ġé»ĺè®¤ ä¸º list . size Ġ- Ġ 1 Ċ Ġ* Ġ@ return ĠæŁ¥ æī¾ åħĥç´ł ä¸ĭ æłĩ Ċ Ġ* Ġ@ throws ĠIllegalArgumentException ĠæŁ¥ ä¸įåĪ° æľĢå¤§ åħĥç´ł æĹ¶ æĬĽ åĩº å¸¸ Ċ Ġ* Ġ@ since Ġversion - 1 . 0 Ċ Ġ*/ Ċ fun Ġ< T Ġ: ĠComparable < T >> Ġdouble Tone Search ( ĊĠĠĠ Ġlist : ĠList < T >, Ġkey : ĠT , Ġ_ lo : ĠInt Ġ= Ġ 0 , Ġ_ hi : ĠInt Ġ= Ġlist . size Ġ- Ġ 1 Ċ ): ĠInt Ġ{ ĊĠĠĠ Ġval Ġmi Ġ= Ġpartial Max Elem ( list ) ĊĠĠĠ Ġif Ġ( mi Ġ== Ġ- 1 ) ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" è¯·è¾ĵåħ¥ æŃ£ç¡® çļĦ åıĮ è°ĥ åĪĹè¡¨ ï¼ģ ") ĊĠĠĠ Ġif Ġ( list [ mi ] Ġ== Ġkey ) ĊĠĠĠĠĠĠĠ Ġreturn Ġmi ĊĠĠĠ Ġval Ġl Ġ= Ġbinary Search ( list , Ġkey , Ġ_ lo , Ġmi Ġ- Ġ 1 ) ĊĠĠĠ Ġval Ġr Ġ= Ġbinary Search ( list . sub List ( mi Ġ+ Ġ 1 , Ġ_ hi Ġ+ Ġ 1 ). reversed (), Ġkey ) ĊĊĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġr Ġ== Ġ- 1 Ġ-> Ġl ĊĠĠĠĠĠĠĠ Ġl Ġ== Ġ- 1 Ġ-> Ġ_ hi Ġ- Ġr ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġl ĊĠĠĠ Ġ} Ċ }